From bf8ffdc725651d4695d0982f94e90278b1c4d95d Mon Sep 17 00:00:00 2001 From: thaonguyen Date: Thu, 26 May 2022 14:37:04 +0700 Subject: [PATCH] Init project on STM8 V1 --- 4_EXT_INT_1PORT/lib/inc/stm8s.h | 2836 +++++++++++++++++ 4_EXT_INT_1PORT/lib/inc/stm8s_adc1.h | 338 ++ 4_EXT_INT_1PORT/lib/inc/stm8s_adc2.h | 256 ++ 4_EXT_INT_1PORT/lib/inc/stm8s_awu.h | 147 + 4_EXT_INT_1PORT/lib/inc/stm8s_beep.h | 119 + 4_EXT_INT_1PORT/lib/inc/stm8s_can.h | 521 +++ 4_EXT_INT_1PORT/lib/inc/stm8s_clk.h | 382 +++ 4_EXT_INT_1PORT/lib/inc/stm8s_exti.h | 134 + 4_EXT_INT_1PORT/lib/inc/stm8s_flash.h | 300 ++ 4_EXT_INT_1PORT/lib/inc/stm8s_gpio.h | 156 + 4_EXT_INT_1PORT/lib/inc/stm8s_i2c.h | 632 ++++ 4_EXT_INT_1PORT/lib/inc/stm8s_itc.h | 186 ++ 4_EXT_INT_1PORT/lib/inc/stm8s_iwdg.h | 131 + 4_EXT_INT_1PORT/lib/inc/stm8s_rst.h | 92 + 4_EXT_INT_1PORT/lib/inc/stm8s_spi.h | 336 ++ 4_EXT_INT_1PORT/lib/inc/stm8s_tim1.h | 623 ++++ 4_EXT_INT_1PORT/lib/inc/stm8s_tim2.h | 342 ++ 4_EXT_INT_1PORT/lib/inc/stm8s_tim3.h | 327 ++ 4_EXT_INT_1PORT/lib/inc/stm8s_tim4.h | 169 + 4_EXT_INT_1PORT/lib/inc/stm8s_tim5.h | 478 +++ 4_EXT_INT_1PORT/lib/inc/stm8s_tim6.h | 287 ++ 4_EXT_INT_1PORT/lib/inc/stm8s_uart1.h | 383 +++ 4_EXT_INT_1PORT/lib/inc/stm8s_uart2.h | 447 +++ 4_EXT_INT_1PORT/lib/inc/stm8s_uart3.h | 389 +++ 4_EXT_INT_1PORT/lib/inc/stm8s_uart4.h | 444 +++ 4_EXT_INT_1PORT/lib/inc/stm8s_wwdg.h | 87 + 4_EXT_INT_1PORT/lib/src/stm8s_adc1.c | 697 ++++ 4_EXT_INT_1PORT/lib/src/stm8s_adc2.c | 398 +++ 4_EXT_INT_1PORT/lib/src/stm8s_awu.c | 198 ++ 4_EXT_INT_1PORT/lib/src/stm8s_beep.c | 153 + 4_EXT_INT_1PORT/lib/src/stm8s_can.c | 1445 +++++++++ 4_EXT_INT_1PORT/lib/src/stm8s_clk.c | 756 +++++ 4_EXT_INT_1PORT/lib/src/stm8s_exti.c | 181 ++ 4_EXT_INT_1PORT/lib/src/stm8s_flash.c | 714 +++++ 4_EXT_INT_1PORT/lib/src/stm8s_gpio.c | 249 ++ 4_EXT_INT_1PORT/lib/src/stm8s_i2c.c | 893 ++++++ 4_EXT_INT_1PORT/lib/src/stm8s_itc.c | 343 ++ 4_EXT_INT_1PORT/lib/src/stm8s_iwdg.c | 113 + 4_EXT_INT_1PORT/lib/src/stm8s_rst.c | 86 + 4_EXT_INT_1PORT/lib/src/stm8s_spi.c | 435 +++ 4_EXT_INT_1PORT/lib/src/stm8s_tim1.c | 2329 ++++++++++++++ 4_EXT_INT_1PORT/lib/src/stm8s_tim2.c | 1294 ++++++++ 4_EXT_INT_1PORT/lib/src/stm8s_tim3.c | 1044 ++++++ 4_EXT_INT_1PORT/lib/src/stm8s_tim4.c | 409 +++ 4_EXT_INT_1PORT/lib/src/stm8s_tim5.c | 1417 ++++++++ 4_EXT_INT_1PORT/lib/src/stm8s_tim6.c | 515 +++ 4_EXT_INT_1PORT/lib/src/stm8s_uart1.c | 800 +++++ 4_EXT_INT_1PORT/lib/src/stm8s_uart2.c | 882 +++++ 4_EXT_INT_1PORT/lib/src/stm8s_uart3.c | 737 +++++ 4_EXT_INT_1PORT/lib/src/stm8s_uart4.c | 902 ++++++ 4_EXT_INT_1PORT/lib/src/stm8s_wwdg.c | 125 + .../user/Backup of EXT_INT_1PORT.ewd | 449 +++ .../user/Backup of EXT_INT_1PORT.ewp | 1604 ++++++++++ .../user/Debug/Exe/EXT_INT_1PORT.out | Bin 0 -> 90744 bytes .../user/Debug/Exe/EXT_INT_1PORT.s19 | 321 ++ .../user/Debug/Obj/EXT_INT_1PORT.pbd | Bin 0 -> 511774 bytes .../user/Debug/Obj/EXT_INT_1PORT.pbd.browse | Bin 0 -> 511774 bytes 4_EXT_INT_1PORT/user/Debug/Obj/main.o | Bin 0 -> 207270 bytes 4_EXT_INT_1PORT/user/Debug/Obj/main.pbi | Bin 0 -> 364759 bytes 4_EXT_INT_1PORT/user/Debug/Obj/main.pbi.cout | 284 ++ 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_beep.o | Bin 0 -> 1402 bytes 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_beep.pbi | Bin 0 -> 687 bytes .../user/Debug/Obj/stm8s_beep.pbi.cout | 284 ++ 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.o | Bin 0 -> 1402 bytes 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.pbi | Bin 0 -> 326394 bytes .../user/Debug/Obj/stm8s_clk.pbi.cout | 281 ++ 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.o | Bin 0 -> 1402 bytes 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.pbi | Bin 0 -> 308905 bytes .../user/Debug/Obj/stm8s_exti.pbi.cout | 281 ++ 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_gpio.o | Bin 0 -> 1402 bytes 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_gpio.pbi | Bin 0 -> 309413 bytes .../user/Debug/Obj/stm8s_gpio.pbi.cout | 281 ++ .../user/Debug/Obj/stm8s_it.pbi.cout | 284 ++ 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_tim4.o | Bin 0 -> 1402 bytes 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_tim4.pbi | Bin 0 -> 3022 bytes .../user/Debug/Obj/stm8s_tim4.pbi.cout | 284 ++ 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart1.o | Bin 0 -> 1402 bytes .../user/Debug/Obj/stm8s_uart1.pbi | Bin 0 -> 874 bytes .../user/Debug/Obj/stm8s_uart1.pbi.cout | 284 ++ .../user/Debug/Obj/stm8s_uart2.pbi.cout | 284 ++ 4_EXT_INT_1PORT/user/Debug/Obj/uart.pbi.cout | 284 ++ 4_EXT_INT_1PORT/user/EXT_INT_1PORT.dep | 274 ++ 4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewd | 465 +++ 4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewp | 1628 ++++++++++ 4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewt | 64 + 4_EXT_INT_1PORT/user/EXT_IN_1PORT.eww | 10 + 4_EXT_INT_1PORT/user/main.c | 233 ++ .../settings/EXT_INT_1PORT.Debug.cspy.bat | 24 + .../user/settings/EXT_INT_1PORT.cspy.bat | 24 + .../user/settings/EXT_INT_1PORT.dbgdt | 81 + .../user/settings/EXT_INT_1PORT.dni | 66 + .../user/settings/EXT_IN_1PORT.wsdt | 67 + .../user/settings/EXT_IN_1PORT.wspos | 2 + .../user/stm8s103_Serial.h | 0 4_EXT_INT_1PORT/user/stm8s_conf.h | 113 + 4_EXT_INT_1PORT/user/stm8s_it.c | 530 +++ 4_EXT_INT_1PORT/user/stm8s_it.h | 117 + 4_EXT_INT_1PORT/user/uart.c | 49 + 4_EXT_INT_1PORT/user/uart.h | 19 + {Debug => Serial/Debug}/Exe/serial.hex | 0 {Debug => Serial/Debug}/Exe/templproj.out | Bin {Debug => Serial/Debug}/Obj/main.o | Bin {Debug => Serial/Debug}/Obj/main.pbi | Bin {Debug => Serial/Debug}/Obj/main.pbi.cout | 0 {Debug => Serial/Debug}/Obj/serial.pbd | Bin {Debug => Serial/Debug}/Obj/serial.pbd.browse | Bin {Debug => Serial/Debug}/Obj/stm8s_clk.o | Bin {Debug => Serial/Debug}/Obj/stm8s_clk.pbi | Bin .../Debug}/Obj/stm8s_clk.pbi.cout | 0 {Debug => Serial/Debug}/Obj/stm8s_gpio.o | Bin {Debug => Serial/Debug}/Obj/stm8s_gpio.pbi | Bin .../Debug}/Obj/stm8s_gpio.pbi.cout | 0 {Debug => Serial/Debug}/Obj/stm8s_it.o | Bin {Debug => Serial/Debug}/Obj/stm8s_it.pbi | Bin {Debug => Serial/Debug}/Obj/stm8s_it.pbi.cout | 0 {Debug => Serial/Debug}/Obj/stm8s_tim4.o | Bin {Debug => Serial/Debug}/Obj/stm8s_tim4.pbi | Bin .../Debug}/Obj/stm8s_tim4.pbi.cout | 0 {Debug => Serial/Debug}/Obj/stm8s_uart1.o | Bin {Debug => Serial/Debug}/Obj/stm8s_uart1.pbi | Bin .../Debug}/Obj/stm8s_uart1.pbi.cout | 0 {Debug => Serial/Debug}/Obj/truyen.pbd | Bin {Debug => Serial/Debug}/Obj/truyen.pbd.browse | Bin EW1C93.tmp => Serial/EW1C93.tmp | 0 {inc => Serial/inc}/stm8s.h | 0 {inc => Serial/inc}/stm8s_adc1.h | 0 {inc => Serial/inc}/stm8s_adc2.h | 0 {inc => Serial/inc}/stm8s_awu.h | 0 {inc => Serial/inc}/stm8s_beep.h | 0 {inc => Serial/inc}/stm8s_can.h | 0 {inc => Serial/inc}/stm8s_clk.h | 0 {inc => Serial/inc}/stm8s_exti.h | 0 {inc => Serial/inc}/stm8s_flash.h | 0 {inc => Serial/inc}/stm8s_gpio.h | 0 {inc => Serial/inc}/stm8s_i2c.h | 0 {inc => Serial/inc}/stm8s_itc.h | 0 {inc => Serial/inc}/stm8s_iwdg.h | 0 {inc => Serial/inc}/stm8s_rst.h | 0 {inc => Serial/inc}/stm8s_spi.h | 0 {inc => Serial/inc}/stm8s_tim1.h | 0 {inc => Serial/inc}/stm8s_tim2.h | 0 {inc => Serial/inc}/stm8s_tim3.h | 0 {inc => Serial/inc}/stm8s_tim4.h | 0 {inc => Serial/inc}/stm8s_tim5.h | 0 {inc => Serial/inc}/stm8s_tim6.h | 0 {inc => Serial/inc}/stm8s_uart1.h | 0 {inc => Serial/inc}/stm8s_uart2.h | 0 {inc => Serial/inc}/stm8s_uart3.h | 0 {inc => Serial/inc}/stm8s_uart4.h | 0 {inc => Serial/inc}/stm8s_wwdg.h | 0 main.c => Serial/main.c | 0 serial.dep => Serial/serial.dep | 0 serial.ewd => Serial/serial.ewd | 0 serial.ewp => Serial/serial.ewp | 0 serial.ewt => Serial/serial.ewt | 0 serial1.eww => Serial/serial1.eww | 0 .../settings}/serial.Debug.cspy.bat | 0 {settings => Serial/settings}/serial.dbgdt | 0 {settings => Serial/settings}/serial.dni | 0 {settings => Serial/settings}/serial1.wsdt | 0 {settings => Serial/settings}/serial1.wspos | 0 .../settings}/truyen.Debug.cspy.bat | 0 {settings => Serial/settings}/truyen.dbgdt | 0 {settings => Serial/settings}/truyen.dni | 0 {src => Serial/src}/stm8s_adc1.c | 0 {src => Serial/src}/stm8s_adc2.c | 0 {src => Serial/src}/stm8s_awu.c | 0 {src => Serial/src}/stm8s_beep.c | 0 {src => Serial/src}/stm8s_can.c | 0 {src => Serial/src}/stm8s_clk.c | 0 {src => Serial/src}/stm8s_exti.c | 0 {src => Serial/src}/stm8s_flash.c | 0 {src => Serial/src}/stm8s_gpio.c | 0 {src => Serial/src}/stm8s_i2c.c | 0 {src => Serial/src}/stm8s_itc.c | 0 {src => Serial/src}/stm8s_iwdg.c | 0 {src => Serial/src}/stm8s_rst.c | 0 {src => Serial/src}/stm8s_spi.c | 0 {src => Serial/src}/stm8s_tim1.c | 0 {src => Serial/src}/stm8s_tim2.c | 0 {src => Serial/src}/stm8s_tim3.c | 0 {src => Serial/src}/stm8s_tim4.c | 0 {src => Serial/src}/stm8s_tim5.c | 0 {src => Serial/src}/stm8s_tim6.c | 0 {src => Serial/src}/stm8s_uart1.c | 0 {src => Serial/src}/stm8s_uart2.c | 0 {src => Serial/src}/stm8s_uart3.c | 0 {src => Serial/src}/stm8s_uart4.c | 0 {src => Serial/src}/stm8s_wwdg.c | 0 Serial/stm8s103_Serial.h | 104 + stm8s_conf.h => Serial/stm8s_conf.h | 0 stm8s_it.c => Serial/stm8s_it.c | 0 stm8s_it.h => Serial/stm8s_it.h | 0 truyen.dep => Serial/truyen.dep | 0 truyen.ewd => Serial/truyen.ewd | 0 truyen.ewp => Serial/truyen.ewp | 0 truyen.ewt => Serial/truyen.ewt | 0 197 files changed, 36732 insertions(+) create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_adc1.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_adc2.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_awu.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_beep.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_can.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_clk.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_exti.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_flash.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_gpio.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_i2c.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_itc.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_iwdg.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_rst.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_spi.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_tim1.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_tim2.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_tim3.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_tim4.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_tim5.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_tim6.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_uart1.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_uart2.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_uart3.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_uart4.h create mode 100644 4_EXT_INT_1PORT/lib/inc/stm8s_wwdg.h create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_adc1.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_adc2.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_awu.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_beep.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_can.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_clk.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_exti.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_flash.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_gpio.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_i2c.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_itc.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_iwdg.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_rst.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_spi.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_tim1.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_tim2.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_tim3.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_tim4.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_tim5.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_tim6.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_uart1.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_uart2.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_uart3.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_uart4.c create mode 100644 4_EXT_INT_1PORT/lib/src/stm8s_wwdg.c create mode 100644 4_EXT_INT_1PORT/user/Backup of EXT_INT_1PORT.ewd create mode 100644 4_EXT_INT_1PORT/user/Backup of EXT_INT_1PORT.ewp create mode 100644 4_EXT_INT_1PORT/user/Debug/Exe/EXT_INT_1PORT.out create mode 100644 4_EXT_INT_1PORT/user/Debug/Exe/EXT_INT_1PORT.s19 create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/EXT_INT_1PORT.pbd create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/EXT_INT_1PORT.pbd.browse create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/main.o create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/main.pbi create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/main.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_beep.o create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_beep.pbi create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_beep.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.o create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.pbi create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.o create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.pbi create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_gpio.o create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_gpio.pbi create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_gpio.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_it.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_tim4.o create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_tim4.pbi create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_tim4.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart1.o create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart1.pbi create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart1.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart2.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/Debug/Obj/uart.pbi.cout create mode 100644 4_EXT_INT_1PORT/user/EXT_INT_1PORT.dep create mode 100644 4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewd create mode 100644 4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewp create mode 100644 4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewt create mode 100644 4_EXT_INT_1PORT/user/EXT_IN_1PORT.eww create mode 100644 4_EXT_INT_1PORT/user/main.c create mode 100644 4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.Debug.cspy.bat create mode 100644 4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.cspy.bat create mode 100644 4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.dbgdt create mode 100644 4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.dni create mode 100644 4_EXT_INT_1PORT/user/settings/EXT_IN_1PORT.wsdt create mode 100644 4_EXT_INT_1PORT/user/settings/EXT_IN_1PORT.wspos rename stm8s103_Serial.h => 4_EXT_INT_1PORT/user/stm8s103_Serial.h (100%) create mode 100644 4_EXT_INT_1PORT/user/stm8s_conf.h create mode 100644 4_EXT_INT_1PORT/user/stm8s_it.c create mode 100644 4_EXT_INT_1PORT/user/stm8s_it.h create mode 100644 4_EXT_INT_1PORT/user/uart.c create mode 100644 4_EXT_INT_1PORT/user/uart.h rename {Debug => Serial/Debug}/Exe/serial.hex (100%) rename {Debug => Serial/Debug}/Exe/templproj.out (100%) rename {Debug => Serial/Debug}/Obj/main.o (100%) rename {Debug => Serial/Debug}/Obj/main.pbi (100%) rename {Debug => Serial/Debug}/Obj/main.pbi.cout (100%) rename {Debug => Serial/Debug}/Obj/serial.pbd (100%) rename {Debug => Serial/Debug}/Obj/serial.pbd.browse (100%) rename {Debug => Serial/Debug}/Obj/stm8s_clk.o (100%) rename {Debug => Serial/Debug}/Obj/stm8s_clk.pbi (100%) rename {Debug => Serial/Debug}/Obj/stm8s_clk.pbi.cout (100%) rename {Debug => Serial/Debug}/Obj/stm8s_gpio.o (100%) rename {Debug => Serial/Debug}/Obj/stm8s_gpio.pbi (100%) rename {Debug => Serial/Debug}/Obj/stm8s_gpio.pbi.cout (100%) rename {Debug => Serial/Debug}/Obj/stm8s_it.o (100%) rename {Debug => Serial/Debug}/Obj/stm8s_it.pbi (100%) rename {Debug => Serial/Debug}/Obj/stm8s_it.pbi.cout (100%) rename {Debug => Serial/Debug}/Obj/stm8s_tim4.o (100%) rename {Debug => Serial/Debug}/Obj/stm8s_tim4.pbi (100%) rename {Debug => Serial/Debug}/Obj/stm8s_tim4.pbi.cout (100%) rename {Debug => Serial/Debug}/Obj/stm8s_uart1.o (100%) rename {Debug => Serial/Debug}/Obj/stm8s_uart1.pbi (100%) rename {Debug => Serial/Debug}/Obj/stm8s_uart1.pbi.cout (100%) rename {Debug => Serial/Debug}/Obj/truyen.pbd (100%) rename {Debug => Serial/Debug}/Obj/truyen.pbd.browse (100%) rename EW1C93.tmp => Serial/EW1C93.tmp (100%) rename {inc => Serial/inc}/stm8s.h (100%) rename {inc => Serial/inc}/stm8s_adc1.h (100%) rename {inc => Serial/inc}/stm8s_adc2.h (100%) rename {inc => Serial/inc}/stm8s_awu.h (100%) rename {inc => Serial/inc}/stm8s_beep.h (100%) rename {inc => Serial/inc}/stm8s_can.h (100%) rename {inc => Serial/inc}/stm8s_clk.h (100%) rename {inc => Serial/inc}/stm8s_exti.h (100%) rename {inc => Serial/inc}/stm8s_flash.h (100%) rename {inc => Serial/inc}/stm8s_gpio.h (100%) rename {inc => Serial/inc}/stm8s_i2c.h (100%) rename {inc => Serial/inc}/stm8s_itc.h (100%) rename {inc => Serial/inc}/stm8s_iwdg.h (100%) rename {inc => Serial/inc}/stm8s_rst.h (100%) rename {inc => Serial/inc}/stm8s_spi.h (100%) rename {inc => Serial/inc}/stm8s_tim1.h (100%) rename {inc => Serial/inc}/stm8s_tim2.h (100%) rename {inc => Serial/inc}/stm8s_tim3.h (100%) rename {inc => Serial/inc}/stm8s_tim4.h (100%) rename {inc => Serial/inc}/stm8s_tim5.h (100%) rename {inc => Serial/inc}/stm8s_tim6.h (100%) rename {inc => Serial/inc}/stm8s_uart1.h (100%) rename {inc => Serial/inc}/stm8s_uart2.h (100%) rename {inc => Serial/inc}/stm8s_uart3.h (100%) rename {inc => Serial/inc}/stm8s_uart4.h (100%) rename {inc => Serial/inc}/stm8s_wwdg.h (100%) rename main.c => Serial/main.c (100%) rename serial.dep => Serial/serial.dep (100%) rename serial.ewd => Serial/serial.ewd (100%) rename serial.ewp => Serial/serial.ewp (100%) rename serial.ewt => Serial/serial.ewt (100%) rename serial1.eww => Serial/serial1.eww (100%) rename {settings => Serial/settings}/serial.Debug.cspy.bat (100%) rename {settings => Serial/settings}/serial.dbgdt (100%) rename {settings => Serial/settings}/serial.dni (100%) rename {settings => Serial/settings}/serial1.wsdt (100%) rename {settings => Serial/settings}/serial1.wspos (100%) rename {settings => Serial/settings}/truyen.Debug.cspy.bat (100%) rename {settings => Serial/settings}/truyen.dbgdt (100%) rename {settings => Serial/settings}/truyen.dni (100%) rename {src => Serial/src}/stm8s_adc1.c (100%) rename {src => Serial/src}/stm8s_adc2.c (100%) rename {src => Serial/src}/stm8s_awu.c (100%) rename {src => Serial/src}/stm8s_beep.c (100%) rename {src => Serial/src}/stm8s_can.c (100%) rename {src => Serial/src}/stm8s_clk.c (100%) rename {src => Serial/src}/stm8s_exti.c (100%) rename {src => Serial/src}/stm8s_flash.c (100%) rename {src => Serial/src}/stm8s_gpio.c (100%) rename {src => Serial/src}/stm8s_i2c.c (100%) rename {src => Serial/src}/stm8s_itc.c (100%) rename {src => Serial/src}/stm8s_iwdg.c (100%) rename {src => Serial/src}/stm8s_rst.c (100%) rename {src => Serial/src}/stm8s_spi.c (100%) rename {src => Serial/src}/stm8s_tim1.c (100%) rename {src => Serial/src}/stm8s_tim2.c (100%) rename {src => Serial/src}/stm8s_tim3.c (100%) rename {src => Serial/src}/stm8s_tim4.c (100%) rename {src => Serial/src}/stm8s_tim5.c (100%) rename {src => Serial/src}/stm8s_tim6.c (100%) rename {src => Serial/src}/stm8s_uart1.c (100%) rename {src => Serial/src}/stm8s_uart2.c (100%) rename {src => Serial/src}/stm8s_uart3.c (100%) rename {src => Serial/src}/stm8s_uart4.c (100%) rename {src => Serial/src}/stm8s_wwdg.c (100%) create mode 100644 Serial/stm8s103_Serial.h rename stm8s_conf.h => Serial/stm8s_conf.h (100%) rename stm8s_it.c => Serial/stm8s_it.c (100%) rename stm8s_it.h => Serial/stm8s_it.h (100%) rename truyen.dep => Serial/truyen.dep (100%) rename truyen.ewd => Serial/truyen.ewd (100%) rename truyen.ewp => Serial/truyen.ewp (100%) rename truyen.ewt => Serial/truyen.ewt (100%) diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s.h b/4_EXT_INT_1PORT/lib/inc/stm8s.h new file mode 100644 index 0000000..7d380ec --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s.h @@ -0,0 +1,2836 @@ +/** + ****************************************************************************** + * @file stm8s.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all HW registers definitions and memory mapping. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_H +#define __STM8S_H + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Uncomment the line below according to the target STM8S or STM8A device used in your + application. */ + + /* #define STM8S208 */ /*!< STM8S High density devices with CAN */ + /* #define STM8S207 */ /*!< STM8S High density devices without CAN */ + /* #define STM8S007 */ /*!< STM8S Value Line High density devices */ + /* #define STM8AF52Ax */ /*!< STM8A High density devices with CAN */ + /* #define STM8AF62Ax */ /*!< STM8A High density devices without CAN */ + /* #define STM8S105 */ /*!< STM8S Medium density devices */ + /* #define STM8S005 */ /*!< STM8S Value Line Medium density devices */ + /* #define STM8AF626x */ /*!< STM8A Medium density devices */ + /* #define STM8AF622x */ /*!< STM8A Low density devices */ + /* #define STM8S103 */ /*!< STM8S Low density devices */ + #define STM8S003 /*!< STM8S Value Line Low density devices */ + /* #define STM8S903 */ /*!< STM8S Low density devices */ + +/* 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. + + - High-Density STM8A devices are the STM8AF52xx STM8AF6269/8x/Ax, + STM8AF51xx, and STM8AF6169/7x/8x/9x/Ax microcontrollers where the Flash memory + density ranges between 32 to 128 Kbytes + - Medium-Density STM8A devices are the STM8AF622x/4x, STM8AF6266/68, + STM8AF612x/4x, and STM8AF6166/68 microcontrollers where the Flash memory + density ranges between 8 to 32 Kbytes + - High-Density STM8S devices are the STM8S207xx, STM8S007 and STM8S208xx microcontrollers + where the Flash memory density ranges between 32 to 128 Kbytes. + - Medium-Density STM8S devices are the STM8S105x and STM8S005 microcontrollers + where the Flash memory density ranges between 16 to 32-Kbytes. + - Low-Density STM8A devices are the STM8AF622x microcontrollers where the Flash + density is 8 Kbytes. + - Low-Density STM8S devices are the STM8S103xx, STM8S003 and STM8S903xx microcontrollers + where the Flash density is 8 Kbytes. */ + +#if !defined (STM8S208) && !defined (STM8S207) && !defined (STM8S105) && \ + !defined (STM8S103) && !defined (STM8S903) && !defined (STM8AF52Ax) && \ + !defined (STM8AF62Ax) && !defined (STM8AF626x) && !defined (STM8S007) && \ + !defined (STM8S003)&& !defined (STM8S005) && !defined (STM8AF622x) + #error "Please select first the target STM8S/A device used in your application (in stm8s.h file)" +#endif + +/******************************************************************************/ +/* Library configuration section */ +/******************************************************************************/ +/* Check the used compiler */ +#if defined(__CSMC__) + #define _COSMIC_ +#elif defined(__RCST7__) + #define _RAISONANCE_ +#elif defined(__ICCSTM8__) + #define _IAR_ +#else + #error "Unsupported Compiler!" /* Compiler defines not found */ +#endif + +#if !defined USE_STDPERIPH_DRIVER +/* 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 + #if defined (STM8S208) || defined (STM8S207) || defined (STM8S007) || defined (STM8AF52Ax) || \ + defined (STM8AF62Ax) || defined (STM8AF622x) + #define HSE_VALUE ((uint32_t)24000000) /* Value of the External oscillator in Hz*/ + #else + #define HSE_VALUE ((uint32_t)16000000) /* Value of the External oscillator in Hz*/ + #endif /* STM8S208 || STM8S207 || STM8S007 || STM8AF62Ax || STM8AF52Ax || STM8AF622x */ +#endif /* HSE_Value */ + +/** + * @brief Definition of Device on-chip RC oscillator frequencies + */ +#define HSI_VALUE ((uint32_t)16000000) /*!< Typical Value of the HSI in Hz */ +#define LSI_VALUE ((uint32_t)128000) /*!< Typical Value of the LSI in Hz */ + +#ifdef _COSMIC_ + #define FAR @far + #define NEAR @near + #define TINY @tiny + #define EEPROM @eeprom + #define CONST const +#elif defined (_RAISONANCE_) /* __RCST7__ */ + #define FAR far + #define NEAR data + #define TINY page0 + #define EEPROM eeprom + #define CONST code + #if defined (STM8S208) || defined (STM8S207) || defined (STM8S007) || defined (STM8AF52Ax) || \ + defined (STM8AF62Ax) + /*!< Used with memory Models for code higher than 64K */ + #define MEMCPY fmemcpy + #else /* STM8S903, STM8S103, STM8S003, STM8S105, STM8AF626x, STM8AF622x */ + /*!< Used with memory Models for code less than 64K */ + #define MEMCPY memcpy + #endif /* STM8S208 or STM8S207 or STM8S007 or STM8AF62Ax or STM8AF52Ax */ +#else /*_IAR_*/ + #define FAR __far + #define NEAR __near + #define TINY __tiny + #define EEPROM __eeprom + #define CONST const +#endif /* __CSMC__ */ + +/* For FLASH routines, select whether pointer will be declared as near (2 bytes, + to handle code smaller than 64KB) or far (3 bytes, to handle code larger + than 64K) */ + +#if defined (STM8S105) || defined (STM8S005) || defined (STM8S103) || defined (STM8S003) || \ + defined (STM8S903) || defined (STM8AF626x) || defined (STM8AF622x) +/*!< Used with memory Models for code smaller than 64K */ + #define PointerAttr NEAR + #define MemoryAddressCast uint16_t +#else /* STM8S208 or STM8S207 or STM8AF62Ax or STM8AF52Ax */ +/*!< Used with memory Models for code higher than 64K */ + #define PointerAttr FAR + #define MemoryAddressCast uint32_t +#endif /* STM8S105 or STM8S103 or STM8S003 or STM8S903 or STM8AF626x or STM8AF622x */ + +/* Uncomment the line below to enable the FLASH functions execution from RAM */ +#if !defined (RAM_EXECUTION) +/* #define RAM_EXECUTION (1) */ +#endif /* RAM_EXECUTION */ + +#ifdef RAM_EXECUTION + #ifdef _COSMIC_ + #define IN_RAM(a) a + #elif defined (_RAISONANCE_) /* __RCST7__ */ + #define IN_RAM(a) a inram + #else /*_IAR_*/ + #define IN_RAM(a) __ramfunc a + #endif /* _COSMIC_ */ +#else + #define IN_RAM(a) a +#endif /* RAM_EXECUTION */ + +/*!< [31:16] STM8S Standard Peripheral Library main version V2.2.0*/ +#define __STM8S_STDPERIPH_VERSION_MAIN ((uint8_t)0x02) /*!< [31:24] main version */ +#define __STM8S_STDPERIPH_VERSION_SUB1 ((uint8_t)0x02) /*!< [23:16] sub1 version */ +#define __STM8S_STDPERIPH_VERSION_SUB2 ((uint8_t)0x00) /*!< [15:8] sub2 version */ +#define __STM8S_STDPERIPH_VERSION_RC ((uint8_t)0x00) /*!< [7:0] release candidate */ +#define __STM8S_STDPERIPH_VERSION ( (__STM8S_STDPERIPH_VERSION_MAIN << 24)\ + |(__STM8S_STDPERIPH_VERSION_SUB1 << 16)\ + |(__STM8S_STDPERIPH_VERSION_SUB2 << 8)\ + |(__STM8S_STDPERIPH_VERSION_RC)) + +/******************************************************************************/ + +/* Includes ------------------------------------------------------------------*/ + +/* Exported types and constants ----------------------------------------------*/ + +/** @addtogroup Exported_types + * @{ + */ + +/** + * IO definitions + * + * define access restrictions to peripheral registers + */ +#define __I volatile const /*!< defines 'read only' permissions */ +#define __O volatile /*!< defines 'write only' permissions */ +#define __IO volatile /*!< defines 'read / write' permissions */ + +/*!< Signed integer types */ +typedef signed char int8_t; +typedef signed short int16_t; +typedef signed long int32_t; + +/*!< Unsigned integer types */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned long uint32_t; + +/*!< STM8 Standard Peripheral Library old types (maintained for legacy purpose) */ + +typedef int32_t s32; +typedef int16_t s16; +typedef int8_t s8; + +typedef uint32_t u32; +typedef uint16_t u16; +typedef uint8_t u8; + + +typedef enum {FALSE = 0, TRUE = !FALSE} bool; + +typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus, BitStatus, BitAction; + +typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; +#define IS_FUNCTIONALSTATE_OK(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) + +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus; + +#define U8_MAX (255) +#define S8_MAX (127) +#define S8_MIN (-128) +#define U16_MAX (65535u) +#define S16_MAX (32767) +#define S16_MIN (-32768) +#define U32_MAX (4294967295uL) +#define S32_MAX (2147483647) +#define S32_MIN (-2147483648uL) + +/** + * @} + */ + +/** @addtogroup MAP_FILE_Exported_Types_and_Constants + * @{ + */ + +/******************************************************************************/ +/* IP registers structures */ +/******************************************************************************/ + +/** + * @brief General Purpose I/Os (GPIO) + */ +typedef struct GPIO_struct +{ + __IO uint8_t ODR; /*!< Output Data Register */ + __IO uint8_t IDR; /*!< Input Data Register */ + __IO uint8_t DDR; /*!< Data Direction Register */ + __IO uint8_t CR1; /*!< Configuration Register 1 */ + __IO uint8_t CR2; /*!< Configuration Register 2 */ +} +GPIO_TypeDef; + +/** @addtogroup GPIO_Registers_Reset_Value + * @{ + */ + +#define GPIO_ODR_RESET_VALUE ((uint8_t)0x00) +#define GPIO_DDR_RESET_VALUE ((uint8_t)0x00) +#define GPIO_CR1_RESET_VALUE ((uint8_t)0x00) +#define GPIO_CR2_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ +#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ + defined(STM8S903) || defined(STM8AF626x) || defined(STM8AF622x) +/** + * @brief Analog to Digital Converter (ADC1) + */ + typedef struct ADC1_struct + { + __IO uint8_t DB0RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB0RL; /*!< ADC1 Data Buffer Register (LSB) */ + __IO uint8_t DB1RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB1RL; /*!< ADC1 Data Buffer Register (LSB) */ + __IO uint8_t DB2RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB2RL; /*!< ADC1 Data Buffer Register (LSB) */ + __IO uint8_t DB3RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB3RL; /*!< ADC1 Data Buffer Register (LSB) */ + __IO uint8_t DB4RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB4RL; /*!< ADC1 Data Buffer Register (LSB) */ + __IO uint8_t DB5RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB5RL; /*!< ADC1 Data Buffer Register (LSB) */ + __IO uint8_t DB6RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB6RL; /*!< ADC1 Data Buffer Register (LSB) */ + __IO uint8_t DB7RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB7RL; /*!< ADC1 Data Buffer Register (LSB) */ + __IO uint8_t DB8RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB8RL; /*!< ADC1 Data Buffer Register (LSB) */ + __IO uint8_t DB9RH; /*!< ADC1 Data Buffer Register (MSB) */ + __IO uint8_t DB9RL; /*!< ADC1 Data Buffer Register (LSB) */ + uint8_t RESERVED[12]; /*!< Reserved byte */ + __IO uint8_t CSR; /*!< ADC1 control status register */ + __IO uint8_t CR1; /*!< ADC1 configuration register 1 */ + __IO uint8_t CR2; /*!< ADC1 configuration register 2 */ + __IO uint8_t CR3; /*!< ADC1 configuration register 3 */ + __IO uint8_t DRH; /*!< ADC1 Data high */ + __IO uint8_t DRL; /*!< ADC1 Data low */ + __IO uint8_t TDRH; /*!< ADC1 Schmitt trigger disable register high */ + __IO uint8_t TDRL; /*!< ADC1 Schmitt trigger disable register low */ + __IO uint8_t HTRH; /*!< ADC1 high threshold register High*/ + __IO uint8_t HTRL; /*!< ADC1 high threshold register Low*/ + __IO uint8_t LTRH; /*!< ADC1 low threshold register high */ + __IO uint8_t LTRL; /*!< ADC1 low threshold register low */ + __IO uint8_t AWSRH; /*!< ADC1 watchdog status register high */ + __IO uint8_t AWSRL; /*!< ADC1 watchdog status register low */ + __IO uint8_t AWCRH; /*!< ADC1 watchdog control register high */ + __IO uint8_t AWCRL; /*!< ADC1 watchdog control register low */ + } + ADC1_TypeDef; + +/** @addtogroup ADC1_Registers_Reset_Value + * @{ + */ + #define ADC1_CSR_RESET_VALUE ((uint8_t)0x00) + #define ADC1_CR1_RESET_VALUE ((uint8_t)0x00) + #define ADC1_CR2_RESET_VALUE ((uint8_t)0x00) + #define ADC1_CR3_RESET_VALUE ((uint8_t)0x00) + #define ADC1_TDRL_RESET_VALUE ((uint8_t)0x00) + #define ADC1_TDRH_RESET_VALUE ((uint8_t)0x00) + #define ADC1_HTRL_RESET_VALUE ((uint8_t)0x03) + #define ADC1_HTRH_RESET_VALUE ((uint8_t)0xFF) + #define ADC1_LTRH_RESET_VALUE ((uint8_t)0x00) + #define ADC1_LTRL_RESET_VALUE ((uint8_t)0x00) + #define ADC1_AWCRH_RESET_VALUE ((uint8_t)0x00) + #define ADC1_AWCRL_RESET_VALUE ((uint8_t)0x00) +/** + * @} + */ + +/** @addtogroup ADC1_Registers_Bits_Definition + * @{ + */ + #define ADC1_CSR_EOC ((uint8_t)0x80) /*!< End of Conversion mask */ + #define ADC1_CSR_AWD ((uint8_t)0x40) /*!< Analog Watch Dog Status mask */ + #define ADC1_CSR_EOCIE ((uint8_t)0x20) /*!< Interrupt Enable for EOC mask */ + #define ADC1_CSR_AWDIE ((uint8_t)0x10) /*!< Analog Watchdog interrupt enable mask */ + #define ADC1_CSR_CH ((uint8_t)0x0F) /*!< Channel selection bits mask */ + + #define ADC1_CR1_SPSEL ((uint8_t)0x70) /*!< Prescaler selection mask */ + #define ADC1_CR1_CONT ((uint8_t)0x02) /*!< Continuous conversion mask */ + #define ADC1_CR1_ADON ((uint8_t)0x01) /*!< A/D Converter on/off mask */ + + #define ADC1_CR2_EXTTRIG ((uint8_t)0x40) /*!< External trigger enable mask */ + #define ADC1_CR2_EXTSEL ((uint8_t)0x30) /*!< External event selection mask */ + #define ADC1_CR2_ALIGN ((uint8_t)0x08) /*!< Data Alignment mask */ + #define ADC1_CR2_SCAN ((uint8_t)0x02) /*!< Scan mode mask */ + + #define ADC1_CR3_DBUF ((uint8_t)0x80) /*!< Data Buffer Enable mask */ + #define ADC1_CR3_OVR ((uint8_t)0x40) /*!< Overrun Status Flag mask */ + +#endif /* (STM8S105) ||(STM8S103) || (STM8S005) ||(STM8S003) || (STM8S903) || (STM8AF626x) || (STM8AF622x) */ +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ +/** + * @brief Analog to Digital Converter (ADC2) + */ +#if defined(STM8S208) || defined(STM8S207) || defined (STM8S007) || defined (STM8AF52Ax) || defined (STM8AF62Ax) + typedef struct ADC2_struct + { + __IO uint8_t CSR; /*!< ADC2 control status register */ + __IO uint8_t CR1; /*!< ADC2 configuration register 1 */ + __IO uint8_t CR2; /*!< ADC2 configuration register 2 */ + uint8_t RESERVED; /*!< Reserved byte */ + __IO uint8_t DRH; /*!< ADC2 Data high */ + __IO uint8_t DRL; /*!< ADC2 Data low */ + __IO uint8_t TDRH; /*!< ADC2 Schmitt trigger disable register high */ + __IO uint8_t TDRL; /*!< ADC2 Schmitt trigger disable register low */ + } + ADC2_TypeDef; + +/** @addtogroup ADC2_Registers_Reset_Value + * @{ + */ + #define ADC2_CSR_RESET_VALUE ((uint8_t)0x00) + #define ADC2_CR1_RESET_VALUE ((uint8_t)0x00) + #define ADC2_CR2_RESET_VALUE ((uint8_t)0x00) + #define ADC2_TDRL_RESET_VALUE ((uint8_t)0x00) + #define ADC2_TDRH_RESET_VALUE ((uint8_t)0x00) +/** + * @} + */ + +/** @addtogroup ADC2_Registers_Bits_Definition + * @{ + */ + #define ADC2_CSR_EOC ((uint8_t)0x80) /*!< End of Conversion mask */ + #define ADC2_CSR_EOCIE ((uint8_t)0x20) /*!< Interrupt Enable for EOC mask */ + #define ADC2_CSR_CH ((uint8_t)0x0F) /*!< Channel selection bits mask */ + + #define ADC2_CR1_SPSEL ((uint8_t)0x70) /*!< Prescaler selection mask */ + #define ADC2_CR1_CONT ((uint8_t)0x02) /*!< Continuous conversion mask */ + #define ADC2_CR1_ADON ((uint8_t)0x01) /*!< A/D Converter on/off mask */ + + #define ADC2_CR2_EXTTRIG ((uint8_t)0x40) /*!< External trigger enable mask */ + #define ADC2_CR2_EXTSEL ((uint8_t)0x30) /*!< External event selection mask */ + #define ADC2_CR2_ALIGN ((uint8_t)0x08) /*!< Data Alignment mask */ + +#endif /* (STM8S208) ||(STM8S207) || defined (STM8S007) || (STM8AF62Ax) || (STM8AF52Ax) */ +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ + +/** + * @brief Auto Wake Up (AWU) peripheral registers. + */ +typedef struct AWU_struct +{ + __IO uint8_t CSR; /*!< AWU Control status register */ + __IO uint8_t APR; /*!< AWU Asynchronous prescaler buffer */ + __IO uint8_t TBR; /*!< AWU Time base selection register */ +} +AWU_TypeDef; + +/** @addtogroup AWU_Registers_Reset_Value + * @{ + */ +#define AWU_CSR_RESET_VALUE ((uint8_t)0x00) +#define AWU_APR_RESET_VALUE ((uint8_t)0x3F) +#define AWU_TBR_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup AWU_Registers_Bits_Definition + * @{ + */ + +#define AWU_CSR_AWUF ((uint8_t)0x20) /*!< Interrupt flag mask */ +#define AWU_CSR_AWUEN ((uint8_t)0x10) /*!< Auto Wake-up enable mask */ +#define AWU_CSR_MSR ((uint8_t)0x01) /*!< LSI Measurement enable mask */ + +#define AWU_APR_APR ((uint8_t)0x3F) /*!< Asynchronous Prescaler divider mask */ + +#define AWU_TBR_AWUTB ((uint8_t)0x0F) /*!< Timebase selection mask */ + +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ +/** + * @brief Beeper (BEEP) peripheral registers. + */ + +typedef struct BEEP_struct +{ + __IO uint8_t CSR; /*!< BEEP Control status register */ +} +BEEP_TypeDef; + +/** @addtogroup BEEP_Registers_Reset_Value + * @{ + */ +#define BEEP_CSR_RESET_VALUE ((uint8_t)0x1F) +/** + * @} + */ + +/** @addtogroup BEEP_Registers_Bits_Definition + * @{ + */ +#define BEEP_CSR_BEEPSEL ((uint8_t)0xC0) /*!< Beeper frequency selection mask */ +#define BEEP_CSR_BEEPEN ((uint8_t)0x20) /*!< Beeper enable mask */ +#define BEEP_CSR_BEEPDIV ((uint8_t)0x1F) /*!< Beeper Divider prescalar mask */ +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ +/** + * @brief Clock Controller (CLK) + */ +typedef struct CLK_struct +{ + __IO uint8_t ICKR; /*!< Internal Clocks Control Register */ + __IO uint8_t ECKR; /*!< External Clocks Control Register */ + uint8_t RESERVED; /*!< Reserved byte */ + __IO uint8_t CMSR; /*!< Clock Master Status Register */ + __IO uint8_t SWR; /*!< Clock Master Switch Register */ + __IO uint8_t SWCR; /*!< Switch Control Register */ + __IO uint8_t CKDIVR; /*!< Clock Divider Register */ + __IO uint8_t PCKENR1; /*!< Peripheral Clock Gating Register 1 */ + __IO uint8_t CSSR; /*!< Clock Security System Register */ + __IO uint8_t CCOR; /*!< Configurable Clock Output Register */ + __IO uint8_t PCKENR2; /*!< Peripheral Clock Gating Register 2 */ + uint8_t RESERVED1; /*!< Reserved byte */ + __IO uint8_t HSITRIMR; /*!< HSI Calibration Trimmer Register */ + __IO uint8_t SWIMCCR; /*!< SWIM clock control register */ +} +CLK_TypeDef; + +/** @addtogroup CLK_Registers_Reset_Value + * @{ + */ + +#define CLK_ICKR_RESET_VALUE ((uint8_t)0x01) +#define CLK_ECKR_RESET_VALUE ((uint8_t)0x00) +#define CLK_CMSR_RESET_VALUE ((uint8_t)0xE1) +#define CLK_SWR_RESET_VALUE ((uint8_t)0xE1) +#define CLK_SWCR_RESET_VALUE ((uint8_t)0x00) +#define CLK_CKDIVR_RESET_VALUE ((uint8_t)0x18) +#define CLK_PCKENR1_RESET_VALUE ((uint8_t)0xFF) +#define CLK_PCKENR2_RESET_VALUE ((uint8_t)0xFF) +#define CLK_CSSR_RESET_VALUE ((uint8_t)0x00) +#define CLK_CCOR_RESET_VALUE ((uint8_t)0x00) +#define CLK_HSITRIMR_RESET_VALUE ((uint8_t)0x00) +#define CLK_SWIMCCR_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup CLK_Registers_Bits_Definition + * @{ + */ +#define CLK_ICKR_SWUAH ((uint8_t)0x20) /*!< Slow Wake-up from Active Halt/Halt modes */ +#define CLK_ICKR_LSIRDY ((uint8_t)0x10) /*!< Low speed internal oscillator ready */ +#define CLK_ICKR_LSIEN ((uint8_t)0x08) /*!< Low speed internal RC oscillator enable */ +#define CLK_ICKR_FHWU ((uint8_t)0x04) /*!< Fast Wake-up from Active Halt/Halt mode */ +#define CLK_ICKR_HSIRDY ((uint8_t)0x02) /*!< High speed internal RC oscillator ready */ +#define CLK_ICKR_HSIEN ((uint8_t)0x01) /*!< High speed internal RC oscillator enable */ + +#define CLK_ECKR_HSERDY ((uint8_t)0x02) /*!< High speed external crystal oscillator ready */ +#define CLK_ECKR_HSEEN ((uint8_t)0x01) /*!< High speed external crystal oscillator enable */ + +#define CLK_CMSR_CKM ((uint8_t)0xFF) /*!< Clock master status bits */ + +#define CLK_SWR_SWI ((uint8_t)0xFF) /*!< Clock master selection bits */ + +#define CLK_SWCR_SWIF ((uint8_t)0x08) /*!< Clock switch interrupt flag */ +#define CLK_SWCR_SWIEN ((uint8_t)0x04) /*!< Clock switch interrupt enable */ +#define CLK_SWCR_SWEN ((uint8_t)0x02) /*!< Switch start/stop */ +#define CLK_SWCR_SWBSY ((uint8_t)0x01) /*!< Switch busy flag*/ + +#define CLK_CKDIVR_HSIDIV ((uint8_t)0x18) /*!< High speed internal clock prescaler */ +#define CLK_CKDIVR_CPUDIV ((uint8_t)0x07) /*!< CPU clock prescaler */ + +#define CLK_PCKENR1_TIM1 ((uint8_t)0x80) /*!< Timer 1 clock enable */ +#define CLK_PCKENR1_TIM3 ((uint8_t)0x40) /*!< Timer 3 clock enable */ +#define CLK_PCKENR1_TIM2 ((uint8_t)0x20) /*!< Timer 2 clock enable */ +#define CLK_PCKENR1_TIM5 ((uint8_t)0x20) /*!< Timer 5 clock enable */ +#define CLK_PCKENR1_TIM4 ((uint8_t)0x10) /*!< Timer 4 clock enable */ +#define CLK_PCKENR1_TIM6 ((uint8_t)0x10) /*!< Timer 6 clock enable */ +#define CLK_PCKENR1_UART3 ((uint8_t)0x08) /*!< UART3 clock enable */ +#define CLK_PCKENR1_UART2 ((uint8_t)0x08) /*!< UART2 clock enable */ +#define CLK_PCKENR1_UART1 ((uint8_t)0x04) /*!< UART1 clock enable */ +#define CLK_PCKENR1_SPI ((uint8_t)0x02) /*!< SPI clock enable */ +#define CLK_PCKENR1_I2C ((uint8_t)0x01) /*!< I2C clock enable */ + +#define CLK_PCKENR2_CAN ((uint8_t)0x80) /*!< CAN clock enable */ +#define CLK_PCKENR2_ADC ((uint8_t)0x08) /*!< ADC clock enable */ +#define CLK_PCKENR2_AWU ((uint8_t)0x04) /*!< AWU clock enable */ + +#define CLK_CSSR_CSSD ((uint8_t)0x08) /*!< Clock security system detection */ +#define CLK_CSSR_CSSDIE ((uint8_t)0x04) /*!< Clock security system detection interrupt enable */ +#define CLK_CSSR_AUX ((uint8_t)0x02) /*!< Auxiliary oscillator connected to master clock */ +#define CLK_CSSR_CSSEN ((uint8_t)0x01) /*!< Clock security system enable */ + +#define CLK_CCOR_CCOBSY ((uint8_t)0x40) /*!< Configurable clock output busy */ +#define CLK_CCOR_CCORDY ((uint8_t)0x20) /*!< Configurable clock output ready */ +#define CLK_CCOR_CCOSEL ((uint8_t)0x1E) /*!< Configurable clock output selection */ +#define CLK_CCOR_CCOEN ((uint8_t)0x01) /*!< Configurable clock output enable */ + +#define CLK_HSITRIMR_HSITRIM ((uint8_t)0x07) /*!< High speed internal oscillator trimmer */ + +#define CLK_SWIMCCR_SWIMDIV ((uint8_t)0x01) /*!< SWIM Clock Dividing Factor */ + +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ +/** + * @brief 16-bit timer with complementary PWM outputs (TIM1) + */ + +typedef struct TIM1_struct +{ + __IO uint8_t CR1; /*!< control register 1 */ + __IO uint8_t CR2; /*!< control register 2 */ + __IO uint8_t SMCR; /*!< Synchro mode control register */ + __IO uint8_t ETR; /*!< external trigger register */ + __IO uint8_t IER; /*!< interrupt enable register*/ + __IO uint8_t SR1; /*!< status register 1 */ + __IO uint8_t SR2; /*!< status register 2 */ + __IO uint8_t EGR; /*!< event generation register */ + __IO uint8_t CCMR1; /*!< CC mode register 1 */ + __IO uint8_t CCMR2; /*!< CC mode register 2 */ + __IO uint8_t CCMR3; /*!< CC mode register 3 */ + __IO uint8_t CCMR4; /*!< CC mode register 4 */ + __IO uint8_t CCER1; /*!< CC enable register 1 */ + __IO uint8_t CCER2; /*!< CC enable register 2 */ + __IO uint8_t CNTRH; /*!< counter high */ + __IO uint8_t CNTRL; /*!< counter low */ + __IO uint8_t PSCRH; /*!< prescaler high */ + __IO uint8_t PSCRL; /*!< prescaler low */ + __IO uint8_t ARRH; /*!< auto-reload register high */ + __IO uint8_t ARRL; /*!< auto-reload register low */ + __IO uint8_t RCR; /*!< Repetition Counter register */ + __IO uint8_t CCR1H; /*!< capture/compare register 1 high */ + __IO uint8_t CCR1L; /*!< capture/compare register 1 low */ + __IO uint8_t CCR2H; /*!< capture/compare register 2 high */ + __IO uint8_t CCR2L; /*!< capture/compare register 2 low */ + __IO uint8_t CCR3H; /*!< capture/compare register 3 high */ + __IO uint8_t CCR3L; /*!< capture/compare register 3 low */ + __IO uint8_t CCR4H; /*!< capture/compare register 3 high */ + __IO uint8_t CCR4L; /*!< capture/compare register 3 low */ + __IO uint8_t BKR; /*!< Break Register */ + __IO uint8_t DTR; /*!< dead-time register */ + __IO uint8_t OISR; /*!< Output idle register */ +} +TIM1_TypeDef; + +/** @addtogroup TIM1_Registers_Reset_Value + * @{ + */ + +#define TIM1_CR1_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CR2_RESET_VALUE ((uint8_t)0x00) +#define TIM1_SMCR_RESET_VALUE ((uint8_t)0x00) +#define TIM1_ETR_RESET_VALUE ((uint8_t)0x00) +#define TIM1_IER_RESET_VALUE ((uint8_t)0x00) +#define TIM1_SR1_RESET_VALUE ((uint8_t)0x00) +#define TIM1_SR2_RESET_VALUE ((uint8_t)0x00) +#define TIM1_EGR_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCMR1_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCMR2_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCMR3_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCMR4_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCER1_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCER2_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CNTRH_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CNTRL_RESET_VALUE ((uint8_t)0x00) +#define TIM1_PSCRH_RESET_VALUE ((uint8_t)0x00) +#define TIM1_PSCRL_RESET_VALUE ((uint8_t)0x00) +#define TIM1_ARRH_RESET_VALUE ((uint8_t)0xFF) +#define TIM1_ARRL_RESET_VALUE ((uint8_t)0xFF) +#define TIM1_RCR_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCR1H_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCR1L_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCR2H_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCR2L_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCR3H_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCR3L_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCR4H_RESET_VALUE ((uint8_t)0x00) +#define TIM1_CCR4L_RESET_VALUE ((uint8_t)0x00) +#define TIM1_BKR_RESET_VALUE ((uint8_t)0x00) +#define TIM1_DTR_RESET_VALUE ((uint8_t)0x00) +#define TIM1_OISR_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup TIM1_Registers_Bits_Definition + * @{ + */ +/* CR1*/ +#define TIM1_CR1_ARPE ((uint8_t)0x80) /*!< Auto-Reload Preload Enable mask. */ +#define TIM1_CR1_CMS ((uint8_t)0x60) /*!< Center-aligned Mode Selection mask. */ +#define TIM1_CR1_DIR ((uint8_t)0x10) /*!< Direction mask. */ +#define TIM1_CR1_OPM ((uint8_t)0x08) /*!< One Pulse Mode mask. */ +#define TIM1_CR1_URS ((uint8_t)0x04) /*!< Update Request Source mask. */ +#define TIM1_CR1_UDIS ((uint8_t)0x02) /*!< Update DIsable mask. */ +#define TIM1_CR1_CEN ((uint8_t)0x01) /*!< Counter Enable mask. */ +/* CR2*/ +#define TIM1_CR2_TI1S ((uint8_t)0x80) /*!< TI1S Selection mask. */ +#define TIM1_CR2_MMS ((uint8_t)0x70) /*!< MMS Selection mask. */ +#define TIM1_CR2_COMS ((uint8_t)0x04) /*!< Capture/Compare Control Update Selection mask. */ +#define TIM1_CR2_CCPC ((uint8_t)0x01) /*!< Capture/Compare Preloaded Control mask. */ +/* SMCR*/ +#define TIM1_SMCR_MSM ((uint8_t)0x80) /*!< Master/Slave Mode mask. */ +#define TIM1_SMCR_TS ((uint8_t)0x70) /*!< Trigger Selection mask. */ +#define TIM1_SMCR_SMS ((uint8_t)0x07) /*!< Slave Mode Selection mask. */ +/*ETR*/ +#define TIM1_ETR_ETP ((uint8_t)0x80) /*!< External Trigger Polarity mask. */ +#define TIM1_ETR_ECE ((uint8_t)0x40)/*!< External Clock mask. */ +#define TIM1_ETR_ETPS ((uint8_t)0x30) /*!< External Trigger Prescaler mask. */ +#define TIM1_ETR_ETF ((uint8_t)0x0F) /*!< External Trigger Filter mask. */ +/*IER*/ +#define TIM1_IER_BIE ((uint8_t)0x80) /*!< Break Interrupt Enable mask. */ +#define TIM1_IER_TIE ((uint8_t)0x40) /*!< Trigger Interrupt Enable mask. */ +#define TIM1_IER_COMIE ((uint8_t)0x20) /*!< Commutation Interrupt Enable mask.*/ +#define TIM1_IER_CC4IE ((uint8_t)0x10) /*!< Capture/Compare 4 Interrupt Enable mask. */ +#define TIM1_IER_CC3IE ((uint8_t)0x08) /*!< Capture/Compare 3 Interrupt Enable mask. */ +#define TIM1_IER_CC2IE ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Enable mask. */ +#define TIM1_IER_CC1IE ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Enable mask. */ +#define TIM1_IER_UIE ((uint8_t)0x01) /*!< Update Interrupt Enable mask. */ +/*SR1*/ +#define TIM1_SR1_BIF ((uint8_t)0x80) /*!< Break Interrupt Flag mask. */ +#define TIM1_SR1_TIF ((uint8_t)0x40) /*!< Trigger Interrupt Flag mask. */ +#define TIM1_SR1_COMIF ((uint8_t)0x20) /*!< Commutation Interrupt Flag mask. */ +#define TIM1_SR1_CC4IF ((uint8_t)0x10) /*!< Capture/Compare 4 Interrupt Flag mask. */ +#define TIM1_SR1_CC3IF ((uint8_t)0x08) /*!< Capture/Compare 3 Interrupt Flag mask. */ +#define TIM1_SR1_CC2IF ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Flag mask. */ +#define TIM1_SR1_CC1IF ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Flag mask. */ +#define TIM1_SR1_UIF ((uint8_t)0x01) /*!< Update Interrupt Flag mask. */ +/*SR2*/ +#define TIM1_SR2_CC4OF ((uint8_t)0x10) /*!< Capture/Compare 4 Overcapture Flag mask. */ +#define TIM1_SR2_CC3OF ((uint8_t)0x08) /*!< Capture/Compare 3 Overcapture Flag mask. */ +#define TIM1_SR2_CC2OF ((uint8_t)0x04) /*!< Capture/Compare 2 Overcapture Flag mask. */ +#define TIM1_SR2_CC1OF ((uint8_t)0x02) /*!< Capture/Compare 1 Overcapture Flag mask. */ +/*EGR*/ +#define TIM1_EGR_BG ((uint8_t)0x80) /*!< Break Generation mask. */ +#define TIM1_EGR_TG ((uint8_t)0x40) /*!< Trigger Generation mask. */ +#define TIM1_EGR_COMG ((uint8_t)0x20) /*!< Capture/Compare Control Update Generation mask. */ +#define TIM1_EGR_CC4G ((uint8_t)0x10) /*!< Capture/Compare 4 Generation mask. */ +#define TIM1_EGR_CC3G ((uint8_t)0x08) /*!< Capture/Compare 3 Generation mask. */ +#define TIM1_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation mask. */ +#define TIM1_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation mask. */ +#define TIM1_EGR_UG ((uint8_t)0x01) /*!< Update Generation mask. */ +/*CCMR*/ +#define TIM1_CCMR_ICxPSC ((uint8_t)0x0C) /*!< Input Capture x Prescaler mask. */ +#define TIM1_CCMR_ICxF ((uint8_t)0xF0) /*!< Input Capture x Filter mask. */ +#define TIM1_CCMR_OCM ((uint8_t)0x70) /*!< Output Compare x Mode mask. */ +#define TIM1_CCMR_OCxPE ((uint8_t)0x08) /*!< Output Compare x Preload Enable mask. */ +#define TIM1_CCMR_OCxFE ((uint8_t)0x04) /*!< Output Compare x Fast Enable mask. */ +#define TIM1_CCMR_CCxS ((uint8_t)0x03) /*!< Capture/Compare x Selection mask. */ + +#define CCMR_TIxDirect_Set ((uint8_t)0x01) +/*CCER1*/ +#define TIM1_CCER1_CC2NP ((uint8_t)0x80) /*!< Capture/Compare 2 Complementary output Polarity mask. */ +#define TIM1_CCER1_CC2NE ((uint8_t)0x40) /*!< Capture/Compare 2 Complementary output enable mask. */ +#define TIM1_CCER1_CC2P ((uint8_t)0x20) /*!< Capture/Compare 2 output Polarity mask. */ +#define TIM1_CCER1_CC2E ((uint8_t)0x10) /*!< Capture/Compare 2 output enable mask. */ +#define TIM1_CCER1_CC1NP ((uint8_t)0x08) /*!< Capture/Compare 1 Complementary output Polarity mask. */ +#define TIM1_CCER1_CC1NE ((uint8_t)0x04) /*!< Capture/Compare 1 Complementary output enable mask. */ +#define TIM1_CCER1_CC1P ((uint8_t)0x02) /*!< Capture/Compare 1 output Polarity mask. */ +#define TIM1_CCER1_CC1E ((uint8_t)0x01) /*!< Capture/Compare 1 output enable mask. */ +/*CCER2*/ +#define TIM1_CCER2_CC4P ((uint8_t)0x20) /*!< Capture/Compare 4 output Polarity mask. */ +#define TIM1_CCER2_CC4E ((uint8_t)0x10) /*!< Capture/Compare 4 output enable mask. */ +#define TIM1_CCER2_CC3NP ((uint8_t)0x08) /*!< Capture/Compare 3 Complementary output Polarity mask. */ +#define TIM1_CCER2_CC3NE ((uint8_t)0x04) /*!< Capture/Compare 3 Complementary output enable mask. */ +#define TIM1_CCER2_CC3P ((uint8_t)0x02) /*!< Capture/Compare 3 output Polarity mask. */ +#define TIM1_CCER2_CC3E ((uint8_t)0x01) /*!< Capture/Compare 3 output enable mask. */ +/*CNTRH*/ +#define TIM1_CNTRH_CNT ((uint8_t)0xFF) /*!< Counter Value (MSB) mask. */ +/*CNTRL*/ +#define TIM1_CNTRL_CNT ((uint8_t)0xFF) /*!< Counter Value (LSB) mask. */ +/*PSCH*/ +#define TIM1_PSCH_PSC ((uint8_t)0xFF) /*!< Prescaler Value (MSB) mask. */ +/*PSCL*/ +#define TIM1_PSCL_PSC ((uint8_t)0xFF) /*!< Prescaler Value (LSB) mask. */ +/*ARR*/ +#define TIM1_ARRH_ARR ((uint8_t)0xFF) /*!< Autoreload Value (MSB) mask. */ +#define TIM1_ARRL_ARR ((uint8_t)0xFF) /*!< Autoreload Value (LSB) mask. */ +/*RCR*/ +#define TIM1_RCR_REP ((uint8_t)0xFF) /*!< Repetition Counter Value mask. */ +/*CCR1*/ +#define TIM1_CCR1H_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (MSB) mask. */ +#define TIM1_CCR1L_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (LSB) mask. */ +/*CCR2*/ +#define TIM1_CCR2H_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (MSB) mask. */ +#define TIM1_CCR2L_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (LSB) mask. */ +/*CCR3*/ +#define TIM1_CCR3H_CCR3 ((uint8_t)0xFF) /*!< Capture/Compare 3 Value (MSB) mask. */ +#define TIM1_CCR3L_CCR3 ((uint8_t)0xFF) /*!< Capture/Compare 3 Value (LSB) mask. */ +/*CCR4*/ +#define TIM1_CCR4H_CCR4 ((uint8_t)0xFF) /*!< Capture/Compare 4 Value (MSB) mask. */ +#define TIM1_CCR4L_CCR4 ((uint8_t)0xFF) /*!< Capture/Compare 4 Value (LSB) mask. */ +/*BKR*/ +#define TIM1_BKR_MOE ((uint8_t)0x80) /*!< Main Output Enable mask. */ +#define TIM1_BKR_AOE ((uint8_t)0x40) /*!< Automatic Output Enable mask. */ +#define TIM1_BKR_BKP ((uint8_t)0x20) /*!< Break Polarity mask. */ +#define TIM1_BKR_BKE ((uint8_t)0x10) /*!< Break Enable mask. */ +#define TIM1_BKR_OSSR ((uint8_t)0x08) /*!< Off-State Selection for Run mode mask. */ +#define TIM1_BKR_OSSI ((uint8_t)0x04) /*!< Off-State Selection for Idle mode mask. */ +#define TIM1_BKR_LOCK ((uint8_t)0x03) /*!< Lock Configuration mask. */ +/*DTR*/ +#define TIM1_DTR_DTG ((uint8_t)0xFF) /*!< Dead-Time Generator set-up mask. */ +/*OISR*/ +#define TIM1_OISR_OIS4 ((uint8_t)0x40) /*!< Output Idle state 4 (OC4 output) mask. */ +#define TIM1_OISR_OIS3N ((uint8_t)0x20) /*!< Output Idle state 3 (OC3N output) mask. */ +#define TIM1_OISR_OIS3 ((uint8_t)0x10) /*!< Output Idle state 3 (OC3 output) mask. */ +#define TIM1_OISR_OIS2N ((uint8_t)0x08) /*!< Output Idle state 2 (OC2N output) mask. */ +#define TIM1_OISR_OIS2 ((uint8_t)0x04) /*!< Output Idle state 2 (OC2 output) mask. */ +#define TIM1_OISR_OIS1N ((uint8_t)0x02) /*!< Output Idle state 1 (OC1N output) mask. */ +#define TIM1_OISR_OIS1 ((uint8_t)0x01) /*!< Output Idle state 1 (OC1 output) mask. */ +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ +/** + * @brief 16-bit timer (TIM2) + */ + +typedef struct TIM2_struct +{ + __IO uint8_t CR1; /*!< control register 1 */ +#if defined(STM8S103) || defined(STM8S003) + uint8_t RESERVED1; /*!< Reserved register */ + uint8_t RESERVED2; /*!< Reserved register */ +#endif + __IO uint8_t IER; /*!< interrupt enable register */ + __IO uint8_t SR1; /*!< status register 1 */ + __IO uint8_t SR2; /*!< status register 2 */ + __IO uint8_t EGR; /*!< event generation register */ + __IO uint8_t CCMR1; /*!< CC mode register 1 */ + __IO uint8_t CCMR2; /*!< CC mode register 2 */ + __IO uint8_t CCMR3; /*!< CC mode register 3 */ + __IO uint8_t CCER1; /*!< CC enable register 1 */ + __IO uint8_t CCER2; /*!< CC enable register 2 */ + __IO uint8_t CNTRH; /*!< counter high */ + __IO uint8_t CNTRL; /*!< counter low */ + __IO uint8_t PSCR; /*!< prescaler register */ + __IO uint8_t ARRH; /*!< auto-reload register high */ + __IO uint8_t ARRL; /*!< auto-reload register low */ + __IO uint8_t CCR1H; /*!< capture/compare register 1 high */ + __IO uint8_t CCR1L; /*!< capture/compare register 1 low */ + __IO uint8_t CCR2H; /*!< capture/compare register 2 high */ + __IO uint8_t CCR2L; /*!< capture/compare register 2 low */ + __IO uint8_t CCR3H; /*!< capture/compare register 3 high */ + __IO uint8_t CCR3L; /*!< capture/compare register 3 low */ +} +TIM2_TypeDef; + +/** @addtogroup TIM2_Registers_Reset_Value + * @{ + */ + +#define TIM2_CR1_RESET_VALUE ((uint8_t)0x00) +#define TIM2_IER_RESET_VALUE ((uint8_t)0x00) +#define TIM2_SR1_RESET_VALUE ((uint8_t)0x00) +#define TIM2_SR2_RESET_VALUE ((uint8_t)0x00) +#define TIM2_EGR_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCMR1_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCMR2_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCMR3_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCER1_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCER2_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CNTRH_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CNTRL_RESET_VALUE ((uint8_t)0x00) +#define TIM2_PSCR_RESET_VALUE ((uint8_t)0x00) +#define TIM2_ARRH_RESET_VALUE ((uint8_t)0xFF) +#define TIM2_ARRL_RESET_VALUE ((uint8_t)0xFF) +#define TIM2_CCR1H_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCR1L_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCR2H_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCR2L_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCR3H_RESET_VALUE ((uint8_t)0x00) +#define TIM2_CCR3L_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup TIM2_Registers_Bits_Definition + * @{ + */ +/*CR1*/ +#define TIM2_CR1_ARPE ((uint8_t)0x80) /*!< Auto-Reload Preload Enable mask. */ +#define TIM2_CR1_OPM ((uint8_t)0x08) /*!< One Pulse Mode mask. */ +#define TIM2_CR1_URS ((uint8_t)0x04) /*!< Update Request Source mask. */ +#define TIM2_CR1_UDIS ((uint8_t)0x02) /*!< Update DIsable mask. */ +#define TIM2_CR1_CEN ((uint8_t)0x01) /*!< Counter Enable mask. */ +/*IER*/ +#define TIM2_IER_CC3IE ((uint8_t)0x08) /*!< Capture/Compare 3 Interrupt Enable mask. */ +#define TIM2_IER_CC2IE ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Enable mask. */ +#define TIM2_IER_CC1IE ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Enable mask. */ +#define TIM2_IER_UIE ((uint8_t)0x01) /*!< Update Interrupt Enable mask. */ +/*SR1*/ +#define TIM2_SR1_CC3IF ((uint8_t)0x08) /*!< Capture/Compare 3 Interrupt Flag mask. */ +#define TIM2_SR1_CC2IF ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Flag mask. */ +#define TIM2_SR1_CC1IF ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Flag mask. */ +#define TIM2_SR1_UIF ((uint8_t)0x01) /*!< Update Interrupt Flag mask. */ +/*SR2*/ +#define TIM2_SR2_CC3OF ((uint8_t)0x08) /*!< Capture/Compare 3 Overcapture Flag mask. */ +#define TIM2_SR2_CC2OF ((uint8_t)0x04) /*!< Capture/Compare 2 Overcapture Flag mask. */ +#define TIM2_SR2_CC1OF ((uint8_t)0x02) /*!< Capture/Compare 1 Overcapture Flag mask. */ +/*EGR*/ +#define TIM2_EGR_CC3G ((uint8_t)0x08) /*!< Capture/Compare 3 Generation mask. */ +#define TIM2_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation mask. */ +#define TIM2_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation mask. */ +#define TIM2_EGR_UG ((uint8_t)0x01) /*!< Update Generation mask. */ +/*CCMR*/ +#define TIM2_CCMR_ICxPSC ((uint8_t)0x0C) /*!< Input Capture x Prescaler mask. */ +#define TIM2_CCMR_ICxF ((uint8_t)0xF0) /*!< Input Capture x Filter mask. */ +#define TIM2_CCMR_OCM ((uint8_t)0x70) /*!< Output Compare x Mode mask. */ +#define TIM2_CCMR_OCxPE ((uint8_t)0x08) /*!< Output Compare x Preload Enable mask. */ +#define TIM2_CCMR_CCxS ((uint8_t)0x03) /*!< Capture/Compare x Selection mask. */ +/*CCER1*/ +#define TIM2_CCER1_CC2P ((uint8_t)0x20) /*!< Capture/Compare 2 output Polarity mask. */ +#define TIM2_CCER1_CC2E ((uint8_t)0x10) /*!< Capture/Compare 2 output enable mask. */ +#define TIM2_CCER1_CC1P ((uint8_t)0x02) /*!< Capture/Compare 1 output Polarity mask. */ +#define TIM2_CCER1_CC1E ((uint8_t)0x01) /*!< Capture/Compare 1 output enable mask. */ +/*CCER2*/ +#define TIM2_CCER2_CC3P ((uint8_t)0x02) /*!< Capture/Compare 3 output Polarity mask. */ +#define TIM2_CCER2_CC3E ((uint8_t)0x01) /*!< Capture/Compare 3 output enable mask. */ +/*CNTR*/ +#define TIM2_CNTRH_CNT ((uint8_t)0xFF) /*!< Counter Value (MSB) mask. */ +#define TIM2_CNTRL_CNT ((uint8_t)0xFF) /*!< Counter Value (LSB) mask. */ +/*PSCR*/ +#define TIM2_PSCR_PSC ((uint8_t)0xFF) /*!< Prescaler Value (MSB) mask. */ +/*ARR*/ +#define TIM2_ARRH_ARR ((uint8_t)0xFF) /*!< Autoreload Value (MSB) mask. */ +#define TIM2_ARRL_ARR ((uint8_t)0xFF) /*!< Autoreload Value (LSB) mask. */ +/*CCR1*/ +#define TIM2_CCR1H_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (MSB) mask. */ +#define TIM2_CCR1L_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (LSB) mask. */ +/*CCR2*/ +#define TIM2_CCR2H_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (MSB) mask. */ +#define TIM2_CCR2L_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (LSB) mask. */ +/*CCR3*/ +#define TIM2_CCR3H_CCR3 ((uint8_t)0xFF) /*!< Capture/Compare 3 Value (MSB) mask. */ +#define TIM2_CCR3L_CCR3 ((uint8_t)0xFF) /*!< Capture/Compare 3 Value (LSB) mask. */ + +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ +/** + * @brief 16-bit timer (TIM3) + */ +typedef struct TIM3_struct +{ + __IO uint8_t CR1; /*!< control register 1 */ + __IO uint8_t IER; /*!< interrupt enable register */ + __IO uint8_t SR1; /*!< status register 1 */ + __IO uint8_t SR2; /*!< status register 2 */ + __IO uint8_t EGR; /*!< event generation register */ + __IO uint8_t CCMR1; /*!< CC mode register 1 */ + __IO uint8_t CCMR2; /*!< CC mode register 2 */ + __IO uint8_t CCER1; /*!< CC enable register 1 */ + __IO uint8_t CNTRH; /*!< counter high */ + __IO uint8_t CNTRL; /*!< counter low */ + __IO uint8_t PSCR; /*!< prescaler register */ + __IO uint8_t ARRH; /*!< auto-reload register high */ + __IO uint8_t ARRL; /*!< auto-reload register low */ + __IO uint8_t CCR1H; /*!< capture/compare register 1 high */ + __IO uint8_t CCR1L; /*!< capture/compare register 1 low */ + __IO uint8_t CCR2H; /*!< capture/compare register 2 high */ + __IO uint8_t CCR2L; /*!< capture/compare register 2 low */ +} +TIM3_TypeDef; + +/** @addtogroup TIM3_Registers_Reset_Value + * @{ + */ + +#define TIM3_CR1_RESET_VALUE ((uint8_t)0x00) +#define TIM3_IER_RESET_VALUE ((uint8_t)0x00) +#define TIM3_SR1_RESET_VALUE ((uint8_t)0x00) +#define TIM3_SR2_RESET_VALUE ((uint8_t)0x00) +#define TIM3_EGR_RESET_VALUE ((uint8_t)0x00) +#define TIM3_CCMR1_RESET_VALUE ((uint8_t)0x00) +#define TIM3_CCMR2_RESET_VALUE ((uint8_t)0x00) +#define TIM3_CCER1_RESET_VALUE ((uint8_t)0x00) +#define TIM3_CNTRH_RESET_VALUE ((uint8_t)0x00) +#define TIM3_CNTRL_RESET_VALUE ((uint8_t)0x00) +#define TIM3_PSCR_RESET_VALUE ((uint8_t)0x00) +#define TIM3_ARRH_RESET_VALUE ((uint8_t)0xFF) +#define TIM3_ARRL_RESET_VALUE ((uint8_t)0xFF) +#define TIM3_CCR1H_RESET_VALUE ((uint8_t)0x00) +#define TIM3_CCR1L_RESET_VALUE ((uint8_t)0x00) +#define TIM3_CCR2H_RESET_VALUE ((uint8_t)0x00) +#define TIM3_CCR2L_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup TIM3_Registers_Bits_Definition + * @{ + */ +/*CR1*/ +#define TIM3_CR1_ARPE ((uint8_t)0x80) /*!< Auto-Reload Preload Enable mask. */ +#define TIM3_CR1_OPM ((uint8_t)0x08) /*!< One Pulse Mode mask. */ +#define TIM3_CR1_URS ((uint8_t)0x04) /*!< Update Request Source mask. */ +#define TIM3_CR1_UDIS ((uint8_t)0x02) /*!< Update DIsable mask. */ +#define TIM3_CR1_CEN ((uint8_t)0x01) /*!< Counter Enable mask. */ +/*IER*/ +#define TIM3_IER_CC2IE ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Enable mask. */ +#define TIM3_IER_CC1IE ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Enable mask. */ +#define TIM3_IER_UIE ((uint8_t)0x01) /*!< Update Interrupt Enable mask. */ +/*SR1*/ +#define TIM3_SR1_CC2IF ((uint8_t)0x04) /*!< Capture/Compare 2 Interrupt Flag mask. */ +#define TIM3_SR1_CC1IF ((uint8_t)0x02) /*!< Capture/Compare 1 Interrupt Flag mask. */ +#define TIM3_SR1_UIF ((uint8_t)0x01) /*!< Update Interrupt Flag mask. */ +/*SR2*/ +#define TIM3_SR2_CC2OF ((uint8_t)0x04) /*!< Capture/Compare 2 Overcapture Flag mask. */ +#define TIM3_SR2_CC1OF ((uint8_t)0x02) /*!< Capture/Compare 1 Overcapture Flag mask. */ +/*EGR*/ +#define TIM3_EGR_CC2G ((uint8_t)0x04) /*!< Capture/Compare 2 Generation mask. */ +#define TIM3_EGR_CC1G ((uint8_t)0x02) /*!< Capture/Compare 1 Generation mask. */ +#define TIM3_EGR_UG ((uint8_t)0x01) /*!< Update Generation mask. */ +/*CCMR*/ +#define TIM3_CCMR_ICxPSC ((uint8_t)0x0C) /*!< Input Capture x Prescaler mask. */ +#define TIM3_CCMR_ICxF ((uint8_t)0xF0) /*!< Input Capture x Filter mask. */ +#define TIM3_CCMR_OCM ((uint8_t)0x70) /*!< Output Compare x Mode mask. */ +#define TIM3_CCMR_OCxPE ((uint8_t)0x08) /*!< Output Compare x Preload Enable mask. */ +#define TIM3_CCMR_CCxS ((uint8_t)0x03) /*!< Capture/Compare x Selection mask. */ +/*CCER1*/ +#define TIM3_CCER1_CC2P ((uint8_t)0x20) /*!< Capture/Compare 2 output Polarity mask. */ +#define TIM3_CCER1_CC2E ((uint8_t)0x10) /*!< Capture/Compare 2 output enable mask. */ +#define TIM3_CCER1_CC1P ((uint8_t)0x02) /*!< Capture/Compare 1 output Polarity mask. */ +#define TIM3_CCER1_CC1E ((uint8_t)0x01) /*!< Capture/Compare 1 output enable mask. */ +/*CNTR*/ +#define TIM3_CNTRH_CNT ((uint8_t)0xFF) /*!< Counter Value (MSB) mask. */ +#define TIM3_CNTRL_CNT ((uint8_t)0xFF) /*!< Counter Value (LSB) mask. */ +/*PSCR*/ +#define TIM3_PSCR_PSC ((uint8_t)0xFF) /*!< Prescaler Value (MSB) mask. */ +/*ARR*/ +#define TIM3_ARRH_ARR ((uint8_t)0xFF) /*!< Autoreload Value (MSB) mask. */ +#define TIM3_ARRL_ARR ((uint8_t)0xFF) /*!< Autoreload Value (LSB) mask. */ +/*CCR1*/ +#define TIM3_CCR1H_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (MSB) mask. */ +#define TIM3_CCR1L_CCR1 ((uint8_t)0xFF) /*!< Capture/Compare 1 Value (LSB) mask. */ +/*CCR2*/ +#define TIM3_CCR2H_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (MSB) mask. */ +#define TIM3_CCR2L_CCR2 ((uint8_t)0xFF) /*!< Capture/Compare 2 Value (LSB) mask. */ +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ +/** + * @brief 8-bit system timer (TIM4) + */ + +typedef struct TIM4_struct +{ + __IO uint8_t CR1; /*!< control register 1 */ +#if defined(STM8S103) || defined(STM8S003) + uint8_t RESERVED1; /*!< Reserved register */ + uint8_t RESERVED2; /*!< Reserved register */ +#endif + __IO uint8_t IER; /*!< interrupt enable register */ + __IO uint8_t SR1; /*!< status register 1 */ + __IO uint8_t EGR; /*!< event generation register */ + __IO uint8_t CNTR; /*!< counter register */ + __IO uint8_t PSCR; /*!< prescaler register */ + __IO uint8_t ARR; /*!< auto-reload register */ +} +TIM4_TypeDef; + +/** @addtogroup TIM4_Registers_Reset_Value + * @{ + */ + +#define TIM4_CR1_RESET_VALUE ((uint8_t)0x00) +#define TIM4_IER_RESET_VALUE ((uint8_t)0x00) +#define TIM4_SR1_RESET_VALUE ((uint8_t)0x00) +#define TIM4_EGR_RESET_VALUE ((uint8_t)0x00) +#define TIM4_CNTR_RESET_VALUE ((uint8_t)0x00) +#define TIM4_PSCR_RESET_VALUE ((uint8_t)0x00) +#define TIM4_ARR_RESET_VALUE ((uint8_t)0xFF) + +/** + * @} + */ + +/** @addtogroup TIM4_Registers_Bits_Definition + * @{ + */ +/*CR1*/ +#define TIM4_CR1_ARPE ((uint8_t)0x80) /*!< Auto-Reload Preload Enable mask. */ +#define TIM4_CR1_OPM ((uint8_t)0x08) /*!< One Pulse Mode mask. */ +#define TIM4_CR1_URS ((uint8_t)0x04) /*!< Update Request Source mask. */ +#define TIM4_CR1_UDIS ((uint8_t)0x02) /*!< Update DIsable mask. */ +#define TIM4_CR1_CEN ((uint8_t)0x01) /*!< Counter Enable mask. */ +/*IER*/ +#define TIM4_IER_UIE ((uint8_t)0x01) /*!< Update Interrupt Enable mask. */ +/*SR1*/ +#define TIM4_SR1_UIF ((uint8_t)0x01) /*!< Update Interrupt Flag mask. */ +/*EGR*/ +#define TIM4_EGR_UG ((uint8_t)0x01) /*!< Update Generation mask. */ +/*CNTR*/ +#define TIM4_CNTR_CNT ((uint8_t)0xFF) /*!< Counter Value (LSB) mask. */ +/*PSCR*/ +#define TIM4_PSCR_PSC ((uint8_t)0x07) /*!< Prescaler Value mask. */ +/*ARR*/ +#define TIM4_ARR_ARR ((uint8_t)0xFF) /*!< Autoreload Value mask. */ + +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ +/** + * @brief 16-bit timer with synchro module (TIM5) + */ + +typedef struct TIM5_struct +{ + __IO uint8_t CR1; /*! + #define enableInterrupts() _rim_() /* enable interrupts */ + #define disableInterrupts() _sim_() /* disable interrupts */ + #define rim() _rim_() /* enable interrupts */ + #define sim() _sim_() /* disable interrupts */ + #define nop() _nop_() /* No Operation */ + #define trap() _trap_() /* Trap (soft IT) */ + #define wfi() _wfi_() /* Wait For Interrupt */ + #define halt() _halt_() /* Halt */ +#elif defined(_COSMIC_) + #define enableInterrupts() {_asm("rim\n");} /* enable interrupts */ + #define disableInterrupts() {_asm("sim\n");} /* disable interrupts */ + #define rim() {_asm("rim\n");} /* enable interrupts */ + #define sim() {_asm("sim\n");} /* disable interrupts */ + #define nop() {_asm("nop\n");} /* No Operation */ + #define trap() {_asm("trap\n");} /* Trap (soft IT) */ + #define wfi() {_asm("wfi\n");} /* Wait For Interrupt */ + #define halt() {_asm("halt\n");} /* Halt */ +#else /*_IAR_*/ + #include + #define enableInterrupts() __enable_interrupt() /* enable interrupts */ + #define disableInterrupts() __disable_interrupt() /* disable interrupts */ + #define rim() __enable_interrupt() /* enable interrupts */ + #define sim() __disable_interrupt() /* disable interrupts */ + #define nop() __no_operation() /* No Operation */ + #define trap() __trap() /* Trap (soft IT) */ + #define wfi() __wait_for_interrupt() /* Wait For Interrupt */ + #define halt() __halt() /* Halt */ +#endif /*_RAISONANCE_*/ + +/*============================== Interrupt vector Handling ========================*/ + +#ifdef _COSMIC_ + #define INTERRUPT_HANDLER(a,b) @far @interrupt void a(void) + #define INTERRUPT_HANDLER_TRAP(a) void @far @interrupt a(void) +#endif /* _COSMIC_ */ + +#ifdef _RAISONANCE_ + #define INTERRUPT_HANDLER(a,b) void a(void) interrupt b + #define INTERRUPT_HANDLER_TRAP(a) void a(void) trap +#endif /* _RAISONANCE_ */ + +#ifdef _IAR_ + #define STRINGVECTOR(x) #x + #define VECTOR_ID(x) STRINGVECTOR( vector = (x) ) + #define INTERRUPT_HANDLER( a, b ) \ + _Pragma( VECTOR_ID( (b)+2 ) ) \ + __interrupt void (a)( void ) + #define INTERRUPT_HANDLER_TRAP(a) \ + _Pragma( VECTOR_ID( 1 ) ) \ + __interrupt void (a) (void) +#endif /* _IAR_ */ + +/*============================== Interrupt Handler declaration ========================*/ +#ifdef _COSMIC_ + #define INTERRUPT @far @interrupt +#elif defined(_IAR_) + #define INTERRUPT __interrupt +#endif /* _COSMIC_ */ + +/*============================== Handling bits ====================================*/ +/*----------------------------------------------------------------------------- +Method : I +Description : Handle the bit from the character variables. +Comments : The different parameters of commands are + - VAR : Name of the character variable where the bit is located. + - Place : Bit position in the variable (7 6 5 4 3 2 1 0) + - Value : Can be 0 (reset bit) or not 0 (set bit) + The "MskBit" command allows to select some bits in a source + variables and copy it in a destination var (return the value). + The "ValBit" command returns the value of a bit in a char + variable: the bit is reset if it returns 0 else the bit is set. + This method generates not an optimised code yet. +-----------------------------------------------------------------------------*/ +#define SetBit(VAR,Place) ( (VAR) |= (uint8_t)((uint8_t)1<<(uint8_t)(Place)) ) +#define ClrBit(VAR,Place) ( (VAR) &= (uint8_t)((uint8_t)((uint8_t)1<<(uint8_t)(Place))^(uint8_t)255) ) + +#define ChgBit(VAR,Place) ( (VAR) ^= (uint8_t)((uint8_t)1<<(uint8_t)(Place)) ) +#define AffBit(VAR,Place,Value) ((Value) ? \ + ((VAR) |= ((uint8_t)1<<(Place))) : \ + ((VAR) &= (((uint8_t)1<<(Place))^(uint8_t)255))) +#define MskBit(Dest,Msk,Src) ( (Dest) = ((Msk) & (Src)) | ((~(Msk)) & (Dest)) ) + +#define ValBit(VAR,Place) ((uint8_t)(VAR) & (uint8_t)((uint8_t)1<<(uint8_t)(Place))) + +#define BYTE_0(n) ((uint8_t)((n) & (uint8_t)0xFF)) /*!< Returns the low byte of the 32-bit value */ +#define BYTE_1(n) ((uint8_t)(BYTE_0((n) >> (uint8_t)8))) /*!< Returns the second byte of the 32-bit value */ +#define BYTE_2(n) ((uint8_t)(BYTE_0((n) >> (uint8_t)16))) /*!< Returns the third byte of the 32-bit value */ +#define BYTE_3(n) ((uint8_t)(BYTE_0((n) >> (uint8_t)24))) /*!< Returns the high byte of the 32-bit value */ + +/*============================== Assert Macros ====================================*/ +#define IS_STATE_VALUE_OK(SensitivityValue) \ + (((SensitivityValue) == ENABLE) || \ + ((SensitivityValue) == DISABLE)) + +/*----------------------------------------------------------------------------- +Method : II +Description : Handle directly the bit. +Comments : The idea is to handle directly with the bit name. For that, it is + necessary to have RAM area descriptions (example: HW register...) + and the following command line for each area. + This method generates the most optimized code. +-----------------------------------------------------------------------------*/ + +#define AREA 0x00 /* The area of bits begins at address 0x10. */ + +#define BitClr(BIT) ( *((unsigned char *) (AREA+(BIT)/8)) &= (~(1<<(7-(BIT)%8))) ) +#define BitSet(BIT) ( *((unsigned char *) (AREA+(BIT)/8)) |= (1<<(7-(BIT)%8)) ) +#define BitVal(BIT) ( *((unsigned char *) (AREA+(BIT)/8)) & (1<<(7-(BIT)%8)) ) + +/* Exported functions ------------------------------------------------------- */ + +#endif /* __STM8S_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_adc1.h b/4_EXT_INT_1PORT/lib/inc/stm8s_adc1.h new file mode 100644 index 0000000..6a1cee8 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_adc1.h @@ -0,0 +1,338 @@ +/** + ****************************************************************************** + * @file stm8s_adc1.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the prototypes/macros for the ADC1 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_ADC1_H +#define __STM8S_ADC1_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup ADC1_Exported_Types + * @{ + */ + +/** + * @brief ADC1 clock prescaler selection + */ + +typedef enum +{ + ADC1_PRESSEL_FCPU_D2 = (uint8_t)0x00, /**< Prescaler selection fADC1 = fcpu/2 */ + ADC1_PRESSEL_FCPU_D3 = (uint8_t)0x10, /**< Prescaler selection fADC1 = fcpu/3 */ + ADC1_PRESSEL_FCPU_D4 = (uint8_t)0x20, /**< Prescaler selection fADC1 = fcpu/4 */ + ADC1_PRESSEL_FCPU_D6 = (uint8_t)0x30, /**< Prescaler selection fADC1 = fcpu/6 */ + ADC1_PRESSEL_FCPU_D8 = (uint8_t)0x40, /**< Prescaler selection fADC1 = fcpu/8 */ + ADC1_PRESSEL_FCPU_D10 = (uint8_t)0x50, /**< Prescaler selection fADC1 = fcpu/10 */ + ADC1_PRESSEL_FCPU_D12 = (uint8_t)0x60, /**< Prescaler selection fADC1 = fcpu/12 */ + ADC1_PRESSEL_FCPU_D18 = (uint8_t)0x70 /**< Prescaler selection fADC1 = fcpu/18 */ +} ADC1_PresSel_TypeDef; + +/** + * @brief ADC1 External conversion trigger event selection + */ +typedef enum +{ + ADC1_EXTTRIG_TIM = (uint8_t)0x00, /**< Conversion from Internal TIM1 TRGO event */ + ADC1_EXTTRIG_GPIO = (uint8_t)0x10 /**< Conversion from External interrupt on ADC_ETR pin*/ +} ADC1_ExtTrig_TypeDef; + +/** + * @brief ADC1 data alignment + */ +typedef enum +{ + ADC1_ALIGN_LEFT = (uint8_t)0x00, /**< Data alignment left */ + ADC1_ALIGN_RIGHT = (uint8_t)0x08 /**< Data alignment right */ +} ADC1_Align_TypeDef; + +/** + * @brief ADC1 Interrupt source + */ +typedef enum +{ + ADC1_IT_AWDIE = (uint16_t)0x010, /**< Analog WDG interrupt enable */ + ADC1_IT_EOCIE = (uint16_t)0x020, /**< EOC interrupt enable */ + ADC1_IT_AWD = (uint16_t)0x140, /**< Analog WDG status */ + ADC1_IT_AWS0 = (uint16_t)0x110, /**< Analog channel 0 status */ + ADC1_IT_AWS1 = (uint16_t)0x111, /**< Analog channel 1 status */ + ADC1_IT_AWS2 = (uint16_t)0x112, /**< Analog channel 2 status */ + ADC1_IT_AWS3 = (uint16_t)0x113, /**< Analog channel 3 status */ + ADC1_IT_AWS4 = (uint16_t)0x114, /**< Analog channel 4 status */ + ADC1_IT_AWS5 = (uint16_t)0x115, /**< Analog channel 5 status */ + ADC1_IT_AWS6 = (uint16_t)0x116, /**< Analog channel 6 status */ + ADC1_IT_AWS7 = (uint16_t)0x117, /**< Analog channel 7 status */ + ADC1_IT_AWS8 = (uint16_t)0x118, /**< Analog channel 8 status */ + ADC1_IT_AWS9 = (uint16_t)0x119, /**< Analog channel 9 status */ + ADC1_IT_AWS12 = (uint16_t)0x11C, /**< Analog channel 12 status */ + /* refer to product datasheet for channel 12 availability */ + ADC1_IT_EOC = (uint16_t)0x080 /**< EOC pending bit */ + +} ADC1_IT_TypeDef; + +/** + * @brief ADC1 Flags + */ +typedef enum +{ + ADC1_FLAG_OVR = (uint8_t)0x41, /**< Overrun status flag */ + ADC1_FLAG_AWD = (uint8_t)0x40, /**< Analog WDG status */ + ADC1_FLAG_AWS0 = (uint8_t)0x10, /**< Analog channel 0 status */ + ADC1_FLAG_AWS1 = (uint8_t)0x11, /**< Analog channel 1 status */ + ADC1_FLAG_AWS2 = (uint8_t)0x12, /**< Analog channel 2 status */ + ADC1_FLAG_AWS3 = (uint8_t)0x13, /**< Analog channel 3 status */ + ADC1_FLAG_AWS4 = (uint8_t)0x14, /**< Analog channel 4 status */ + ADC1_FLAG_AWS5 = (uint8_t)0x15, /**< Analog channel 5 status */ + ADC1_FLAG_AWS6 = (uint8_t)0x16, /**< Analog channel 6 status */ + ADC1_FLAG_AWS7 = (uint8_t)0x17, /**< Analog channel 7 status */ + ADC1_FLAG_AWS8 = (uint8_t)0x18, /**< Analog channel 8 status*/ + ADC1_FLAG_AWS9 = (uint8_t)0x19, /**< Analog channel 9 status */ + ADC1_FLAG_AWS12 = (uint8_t)0x1C, /**< Analog channel 12 status */ + /* refer to product datasheet for channel 12 availability */ + ADC1_FLAG_EOC = (uint8_t)0x80 /**< EOC falg */ +}ADC1_Flag_TypeDef; + + +/** + * @brief ADC1 schmitt Trigger + */ +typedef enum +{ + ADC1_SCHMITTTRIG_CHANNEL0 = (uint8_t)0x00, /**< Schmitt trigger disable on AIN0 */ + ADC1_SCHMITTTRIG_CHANNEL1 = (uint8_t)0x01, /**< Schmitt trigger disable on AIN1 */ + ADC1_SCHMITTTRIG_CHANNEL2 = (uint8_t)0x02, /**< Schmitt trigger disable on AIN2 */ + ADC1_SCHMITTTRIG_CHANNEL3 = (uint8_t)0x03, /**< Schmitt trigger disable on AIN3 */ + ADC1_SCHMITTTRIG_CHANNEL4 = (uint8_t)0x04, /**< Schmitt trigger disable on AIN4 */ + ADC1_SCHMITTTRIG_CHANNEL5 = (uint8_t)0x05, /**< Schmitt trigger disable on AIN5 */ + ADC1_SCHMITTTRIG_CHANNEL6 = (uint8_t)0x06, /**< Schmitt trigger disable on AIN6 */ + ADC1_SCHMITTTRIG_CHANNEL7 = (uint8_t)0x07, /**< Schmitt trigger disable on AIN7 */ + ADC1_SCHMITTTRIG_CHANNEL8 = (uint8_t)0x08, /**< Schmitt trigger disable on AIN8 */ + ADC1_SCHMITTTRIG_CHANNEL9 = (uint8_t)0x09, /**< Schmitt trigger disable on AIN9 */ + ADC1_SCHMITTTRIG_CHANNEL12 = (uint8_t)0x0C, /**< Schmitt trigger disable on AIN12 */ + /* refer to product datasheet for channel 12 availability */ + ADC1_SCHMITTTRIG_ALL = (uint8_t)0xFF /**< Schmitt trigger disable on All channels */ +} ADC1_SchmittTrigg_TypeDef; + +/** + * @brief ADC1 conversion mode selection + */ + +typedef enum +{ + ADC1_CONVERSIONMODE_SINGLE = (uint8_t)0x00, /**< Single conversion mode */ + ADC1_CONVERSIONMODE_CONTINUOUS = (uint8_t)0x01 /**< Continuous conversion mode */ +} ADC1_ConvMode_TypeDef; + +/** + * @brief ADC1 analog channel selection + */ + +typedef enum +{ + ADC1_CHANNEL_0 = (uint8_t)0x00, /**< Analog channel 0 */ + ADC1_CHANNEL_1 = (uint8_t)0x01, /**< Analog channel 1 */ + ADC1_CHANNEL_2 = (uint8_t)0x02, /**< Analog channel 2 */ + ADC1_CHANNEL_3 = (uint8_t)0x03, /**< Analog channel 3 */ + ADC1_CHANNEL_4 = (uint8_t)0x04, /**< Analog channel 4 */ + ADC1_CHANNEL_5 = (uint8_t)0x05, /**< Analog channel 5 */ + ADC1_CHANNEL_6 = (uint8_t)0x06, /**< Analog channel 6 */ + ADC1_CHANNEL_7 = (uint8_t)0x07, /**< Analog channel 7 */ + ADC1_CHANNEL_8 = (uint8_t)0x08, /**< Analog channel 8 */ + ADC1_CHANNEL_9 = (uint8_t)0x09, /**< Analog channel 9 */ + ADC1_CHANNEL_12 = (uint8_t)0x0C /**< Analog channel 12 */ + /* refer to product datasheet for channel 12 availability */ +} ADC1_Channel_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/* Exported macros ------------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup ADC1_Private_Macros + * @brief Macros used by the assert function to check the different functions parameters. + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different prescaler's values. + */ +#define IS_ADC1_PRESSEL_OK(PRESCALER) (((PRESCALER) == ADC1_PRESSEL_FCPU_D2) || \ + ((PRESCALER) == ADC1_PRESSEL_FCPU_D3) || \ + ((PRESCALER) == ADC1_PRESSEL_FCPU_D4) || \ + ((PRESCALER) == ADC1_PRESSEL_FCPU_D6) || \ + ((PRESCALER) == ADC1_PRESSEL_FCPU_D8) || \ + ((PRESCALER) == ADC1_PRESSEL_FCPU_D10) || \ + ((PRESCALER) == ADC1_PRESSEL_FCPU_D12) || \ + ((PRESCALER) == ADC1_PRESSEL_FCPU_D18)) + +/** + * @brief Macro used by the assert function to check the different external trigger values. + */ +#define IS_ADC1_EXTTRIG_OK(EXTRIG) (((EXTRIG) == ADC1_EXTTRIG_TIM) || \ + ((EXTRIG) == ADC1_EXTTRIG_GPIO)) + +/** + * @brief Macro used by the assert function to check the different alignment modes. + */ +#define IS_ADC1_ALIGN_OK(ALIGN) (((ALIGN) == ADC1_ALIGN_LEFT) || \ + ((ALIGN) == ADC1_ALIGN_RIGHT)) + +/** + * @brief Macro used by the assert function to check the Interrupt source. + */ +#define IS_ADC1_IT_OK(IT) (((IT) == ADC1_IT_EOCIE) || \ + ((IT) == ADC1_IT_AWDIE)) + +/** + * @brief Macro used by the assert function to check the ADC1 Flag. + */ +#define IS_ADC1_FLAG_OK(FLAG) (((FLAG) == ADC1_FLAG_EOC)|| \ + ((FLAG) == ADC1_FLAG_OVR) || \ + ((FLAG) == ADC1_FLAG_AWD) || \ + ((FLAG) == ADC1_FLAG_AWS0) || \ + ((FLAG) == ADC1_FLAG_AWS1) || \ + ((FLAG) == ADC1_FLAG_AWS2) || \ + ((FLAG) == ADC1_FLAG_AWS3) || \ + ((FLAG) == ADC1_FLAG_AWS4) || \ + ((FLAG) == ADC1_FLAG_AWS5) || \ + ((FLAG) == ADC1_FLAG_AWS6) || \ + ((FLAG) == ADC1_FLAG_AWS7) || \ + ((FLAG) == ADC1_FLAG_AWS8) || \ + ((FLAG) == ADC1_FLAG_AWS9)) + +/** + * @brief Macro used by the assert function to check the ADC1 pending bits. + */ +#define IS_ADC1_ITPENDINGBIT_OK(ITPENDINGBIT) (((ITPENDINGBIT) == ADC1_IT_EOC) || \ + ((ITPENDINGBIT) == ADC1_IT_AWD) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS0) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS1) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS2) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS3) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS4) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS5) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS6) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS7) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS8) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS12) || \ + ((ITPENDINGBIT) == ADC1_IT_AWS9)) + +/** + * @brief Macro used by the assert function to check the different schmitt trigger values. + */ +#define IS_ADC1_SCHMITTTRIG_OK(SCHMITTTRIG) (((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL0) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL1) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL2) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL3) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL4) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL5) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL6) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL7) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL8) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL12) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_ALL) || \ + ((SCHMITTTRIG) == ADC1_SCHMITTTRIG_CHANNEL9)) + +/** + * @brief Macro used by the assert function to check the different conversion modes. + */ +#define IS_ADC1_CONVERSIONMODE_OK(MODE) (((MODE) == ADC1_CONVERSIONMODE_SINGLE) || \ + ((MODE) == ADC1_CONVERSIONMODE_CONTINUOUS)) + +/** + * @brief Macro used by the assert function to check the different channels values. + */ +#define IS_ADC1_CHANNEL_OK(CHANNEL) (((CHANNEL) == ADC1_CHANNEL_0) || \ + ((CHANNEL) == ADC1_CHANNEL_1) || \ + ((CHANNEL) == ADC1_CHANNEL_2) || \ + ((CHANNEL) == ADC1_CHANNEL_3) || \ + ((CHANNEL) == ADC1_CHANNEL_4) || \ + ((CHANNEL) == ADC1_CHANNEL_5) || \ + ((CHANNEL) == ADC1_CHANNEL_6) || \ + ((CHANNEL) == ADC1_CHANNEL_7) || \ + ((CHANNEL) == ADC1_CHANNEL_8) || \ + ((CHANNEL) == ADC1_CHANNEL_12) || \ + ((CHANNEL) == ADC1_CHANNEL_9)) + +/** + * @brief Macro used by the assert function to check the possible buffer values. + */ +#define IS_ADC1_BUFFER_OK(BUFFER) ((BUFFER) <= (uint8_t)0x09) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup ADC1_Exported_Functions + * @{ + */ +void ADC1_DeInit(void); +void ADC1_Init(ADC1_ConvMode_TypeDef ADC1_ConversionMode, + ADC1_Channel_TypeDef ADC1_Channel, + ADC1_PresSel_TypeDef ADC1_PrescalerSelection, + ADC1_ExtTrig_TypeDef ADC1_ExtTrigger, + FunctionalState ADC1_ExtTriggerState, ADC1_Align_TypeDef ADC1_Align, + ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel, + FunctionalState ADC1_SchmittTriggerState); +void ADC1_Cmd(FunctionalState NewState); +void ADC1_ScanModeCmd(FunctionalState NewState); +void ADC1_DataBufferCmd(FunctionalState NewState); +void ADC1_ITConfig(ADC1_IT_TypeDef ADC1_IT, FunctionalState NewState); +void ADC1_PrescalerConfig(ADC1_PresSel_TypeDef ADC1_Prescaler); +void ADC1_SchmittTriggerConfig(ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel, + FunctionalState NewState); +void ADC1_ConversionConfig(ADC1_ConvMode_TypeDef ADC1_ConversionMode, + ADC1_Channel_TypeDef ADC1_Channel, + ADC1_Align_TypeDef ADC1_Align); +void ADC1_ExternalTriggerConfig(ADC1_ExtTrig_TypeDef ADC1_ExtTrigger, FunctionalState NewState); +void ADC1_AWDChannelConfig(ADC1_Channel_TypeDef Channel, FunctionalState NewState); +void ADC1_StartConversion(void); +uint16_t ADC1_GetConversionValue(void); +void ADC1_SetHighThreshold(uint16_t Threshold); +void ADC1_SetLowThreshold(uint16_t Threshold); +uint16_t ADC1_GetBufferValue(uint8_t Buffer); +FlagStatus ADC1_GetAWDChannelStatus(ADC1_Channel_TypeDef Channel); +FlagStatus ADC1_GetFlagStatus(ADC1_Flag_TypeDef Flag); +void ADC1_ClearFlag(ADC1_Flag_TypeDef Flag); +ITStatus ADC1_GetITStatus(ADC1_IT_TypeDef ITPendingBit); +void ADC1_ClearITPendingBit(ADC1_IT_TypeDef ITPendingBit); +/** + * @} + */ + +#endif /* __STM8S_ADC1_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_adc2.h b/4_EXT_INT_1PORT/lib/inc/stm8s_adc2.h new file mode 100644 index 0000000..2f9af43 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_adc2.h @@ -0,0 +1,256 @@ +/** + ****************************************************************************** + * @file stm8s_adc2.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the prototypes/macros for the ADC2 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_ADC2_H +#define __STM8S_ADC2_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup ADC2_Exported_Types + * @{ + */ + +/** + * @brief ADC2 clock prescaler selection + */ + +typedef enum { + ADC2_PRESSEL_FCPU_D2 = (uint8_t)0x00, /**< Prescaler selection fADC2 = fcpu/2 */ + ADC2_PRESSEL_FCPU_D3 = (uint8_t)0x10, /**< Prescaler selection fADC2 = fcpu/3 */ + ADC2_PRESSEL_FCPU_D4 = (uint8_t)0x20, /**< Prescaler selection fADC2 = fcpu/4 */ + ADC2_PRESSEL_FCPU_D6 = (uint8_t)0x30, /**< Prescaler selection fADC2 = fcpu/6 */ + ADC2_PRESSEL_FCPU_D8 = (uint8_t)0x40, /**< Prescaler selection fADC2 = fcpu/8 */ + ADC2_PRESSEL_FCPU_D10 = (uint8_t)0x50, /**< Prescaler selection fADC2 = fcpu/10 */ + ADC2_PRESSEL_FCPU_D12 = (uint8_t)0x60, /**< Prescaler selection fADC2 = fcpu/12 */ + ADC2_PRESSEL_FCPU_D18 = (uint8_t)0x70 /**< Prescaler selection fADC2 = fcpu/18 */ +} ADC2_PresSel_TypeDef; + +/** + * @brief ADC2 External conversion trigger event selection + */ +typedef enum { + ADC2_EXTTRIG_TIM = (uint8_t)0x00, /**< Conversion from Internal TIM TRGO event */ + ADC2_EXTTRIG_GPIO = (uint8_t)0x01 /**< Conversion from External interrupt on ADC_ETR pin*/ +} ADC2_ExtTrig_TypeDef; + +/** + * @brief ADC2 data alignment + */ +typedef enum { + ADC2_ALIGN_LEFT = (uint8_t)0x00, /**< Data alignment left */ + ADC2_ALIGN_RIGHT = (uint8_t)0x08 /**< Data alignment right */ +} ADC2_Align_TypeDef; + +/** + * @brief ADC2 schmitt Trigger + */ +typedef enum { + ADC2_SCHMITTTRIG_CHANNEL0 = (uint8_t)0x00, /**< Schmitt trigger disable on AIN0 */ + ADC2_SCHMITTTRIG_CHANNEL1 = (uint8_t)0x01, /**< Schmitt trigger disable on AIN1 */ + ADC2_SCHMITTTRIG_CHANNEL2 = (uint8_t)0x02, /**< Schmitt trigger disable on AIN2 */ + ADC2_SCHMITTTRIG_CHANNEL3 = (uint8_t)0x03, /**< Schmitt trigger disable on AIN3 */ + ADC2_SCHMITTTRIG_CHANNEL4 = (uint8_t)0x04, /**< Schmitt trigger disable on AIN4 */ + ADC2_SCHMITTTRIG_CHANNEL5 = (uint8_t)0x05, /**< Schmitt trigger disable on AIN5 */ + ADC2_SCHMITTTRIG_CHANNEL6 = (uint8_t)0x06, /**< Schmitt trigger disable on AIN6 */ + ADC2_SCHMITTTRIG_CHANNEL7 = (uint8_t)0x07, /**< Schmitt trigger disable on AIN7 */ + ADC2_SCHMITTTRIG_CHANNEL8 = (uint8_t)0x08, /**< Schmitt trigger disable on AIN8 */ + ADC2_SCHMITTTRIG_CHANNEL9 = (uint8_t)0x09, /**< Schmitt trigger disable on AIN9 */ + ADC2_SCHMITTTRIG_CHANNEL10 = (uint8_t)0x0A, /**< Schmitt trigger disable on AIN10 */ + ADC2_SCHMITTTRIG_CHANNEL11 = (uint8_t)0x0B, /**< Schmitt trigger disable on AIN11 */ + ADC2_SCHMITTTRIG_CHANNEL12 = (uint8_t)0x0C, /**< Schmitt trigger disable on AIN12 */ + ADC2_SCHMITTTRIG_CHANNEL13 = (uint8_t)0x0D, /**< Schmitt trigger disable on AIN13 */ + ADC2_SCHMITTTRIG_CHANNEL14 = (uint8_t)0x0E, /**< Schmitt trigger disable on AIN14 */ + ADC2_SCHMITTTRIG_CHANNEL15 = (uint8_t)0x0F, /**< Schmitt trigger disable on AIN15 */ + ADC2_SCHMITTTRIG_ALL = (uint8_t)0x1F /**< Schmitt trigger disable on all channels */ + +} ADC2_SchmittTrigg_TypeDef; + +/** + * @brief ADC2 conversion mode selection + */ + +typedef enum { + ADC2_CONVERSIONMODE_SINGLE = (uint8_t)0x00, /**< Single conversion mode */ + ADC2_CONVERSIONMODE_CONTINUOUS = (uint8_t)0x01 /**< Continuous conversion mode */ +} ADC2_ConvMode_TypeDef; + +/** + * @brief ADC2 analog channel selection + */ + +typedef enum { + ADC2_CHANNEL_0 = (uint8_t)0x00, /**< Analog channel 0 */ + ADC2_CHANNEL_1 = (uint8_t)0x01, /**< Analog channel 1 */ + ADC2_CHANNEL_2 = (uint8_t)0x02, /**< Analog channel 2 */ + ADC2_CHANNEL_3 = (uint8_t)0x03, /**< Analog channel 3 */ + ADC2_CHANNEL_4 = (uint8_t)0x04, /**< Analog channel 4 */ + ADC2_CHANNEL_5 = (uint8_t)0x05, /**< Analog channel 5 */ + ADC2_CHANNEL_6 = (uint8_t)0x06, /**< Analog channel 6 */ + ADC2_CHANNEL_7 = (uint8_t)0x07, /**< Analog channel 7 */ + ADC2_CHANNEL_8 = (uint8_t)0x08, /**< Analog channel 8 */ + ADC2_CHANNEL_9 = (uint8_t)0x09, /**< Analog channel 9 */ + ADC2_CHANNEL_10 = (uint8_t)0x0A, /**< Analog channel 10 */ + ADC2_CHANNEL_11 = (uint8_t)0x0B, /**< Analog channel 11 */ + ADC2_CHANNEL_12 = (uint8_t)0x0C, /**< Analog channel 12 */ + ADC2_CHANNEL_13 = (uint8_t)0x0D, /**< Analog channel 13 */ + ADC2_CHANNEL_14 = (uint8_t)0x0E, /**< Analog channel 14 */ + ADC2_CHANNEL_15 = (uint8_t)0x0F /**< Analog channel 15 */ +} ADC2_Channel_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/* Exported macros ------------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup ADC2_Private_Macros + * @brief Macros used by the assert function to check the different functions parameters. + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different prescaler's values. + */ +#define IS_ADC2_PRESSEL_OK(PRESCALER) (((PRESCALER) == ADC2_PRESSEL_FCPU_D2) || \ + ((PRESCALER) == ADC2_PRESSEL_FCPU_D3) || \ + ((PRESCALER) == ADC2_PRESSEL_FCPU_D4) || \ + ((PRESCALER) == ADC2_PRESSEL_FCPU_D6) || \ + ((PRESCALER) == ADC2_PRESSEL_FCPU_D8) || \ + ((PRESCALER) == ADC2_PRESSEL_FCPU_D10) || \ + ((PRESCALER) == ADC2_PRESSEL_FCPU_D12) || \ + ((PRESCALER) == ADC2_PRESSEL_FCPU_D18)) + +/** + * @brief Macro used by the assert function to check the different external trigger values. + */ +#define IS_ADC2_EXTTRIG_OK(EXTRIG) (((EXTRIG) == ADC2_EXTTRIG_TIM) || \ + ((EXTRIG) == ADC2_EXTTRIG_GPIO)) + +/** + * @brief Macro used by the assert function to check the different alignment modes. + */ +#define IS_ADC2_ALIGN_OK(ALIGN) (((ALIGN) == ADC2_ALIGN_LEFT) || \ + ((ALIGN) == ADC2_ALIGN_RIGHT)) + + +/** + * @brief Macro used by the assert function to check the different schmitt trigger values. + */ +#define IS_ADC2_SCHMITTTRIG_OK(SCHMITTTRIG) (((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL0) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL1) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL2) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL3) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL4) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL5) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL6) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL7) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL8) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL9) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL10) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL11) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL12) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL13) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL14) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_CHANNEL15) || \ + ((SCHMITTTRIG) == ADC2_SCHMITTTRIG_ALL)) + +/** + * @brief Macro used by the assert function to check the different conversion modes. + */ +#define IS_ADC2_CONVERSIONMODE_OK(MODE) (((MODE) == ADC2_CONVERSIONMODE_SINGLE) || \ + ((MODE) == ADC2_CONVERSIONMODE_CONTINUOUS)) + +/** + * @brief Macro used by the assert function to check the different channels values. + */ +#define IS_ADC2_CHANNEL_OK(CHANNEL) (((CHANNEL) == ADC2_CHANNEL_0) || \ + ((CHANNEL) == ADC2_CHANNEL_1) || \ + ((CHANNEL) == ADC2_CHANNEL_2) || \ + ((CHANNEL) == ADC2_CHANNEL_3) || \ + ((CHANNEL) == ADC2_CHANNEL_4) || \ + ((CHANNEL) == ADC2_CHANNEL_5) || \ + ((CHANNEL) == ADC2_CHANNEL_6) || \ + ((CHANNEL) == ADC2_CHANNEL_7) || \ + ((CHANNEL) == ADC2_CHANNEL_8) || \ + ((CHANNEL) == ADC2_CHANNEL_9) || \ + ((CHANNEL) == ADC2_CHANNEL_10) || \ + ((CHANNEL) == ADC2_CHANNEL_11) || \ + ((CHANNEL) == ADC2_CHANNEL_12) || \ + ((CHANNEL) == ADC2_CHANNEL_13) || \ + ((CHANNEL) == ADC2_CHANNEL_14) || \ + ((CHANNEL) == ADC2_CHANNEL_15)) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup ADC2_Exported_Functions + * @{ + */ +void ADC2_DeInit(void); +void ADC2_Init(ADC2_ConvMode_TypeDef ADC2_ConversionMode, + ADC2_Channel_TypeDef ADC2_Channel, + ADC2_PresSel_TypeDef ADC2_PrescalerSelection, + ADC2_ExtTrig_TypeDef ADC2_ExtTrigger, + FunctionalState ADC2_ExtTriggerState, + ADC2_Align_TypeDef ADC2_Align, + ADC2_SchmittTrigg_TypeDef ADC2_SchmittTriggerChannel, + FunctionalState ADC2_SchmittTriggerState); +void ADC2_Cmd(FunctionalState NewState); +void ADC2_ITConfig(FunctionalState NewState); +void ADC2_PrescalerConfig(ADC2_PresSel_TypeDef ADC2_Prescaler); +void ADC2_SchmittTriggerConfig(ADC2_SchmittTrigg_TypeDef ADC2_SchmittTriggerChannel, + FunctionalState NewState); +void ADC2_ConversionConfig(ADC2_ConvMode_TypeDef ADC2_ConversionMode, + ADC2_Channel_TypeDef ADC2_Channel, + ADC2_Align_TypeDef ADC2_Align); +void ADC2_ExternalTriggerConfig(ADC2_ExtTrig_TypeDef ADC2_ExtTrigger, FunctionalState NewState); +void ADC2_StartConversion(void); +uint16_t ADC2_GetConversionValue(void); +FlagStatus ADC2_GetFlagStatus(void); +void ADC2_ClearFlag(void); +ITStatus ADC2_GetITStatus(void); +void ADC2_ClearITPendingBit(void); +/** + * @} + */ + +#endif /* __STM8S_ADC2_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_awu.h b/4_EXT_INT_1PORT/lib/inc/stm8s_awu.h new file mode 100644 index 0000000..2de5b7c --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_awu.h @@ -0,0 +1,147 @@ +/** + ****************************************************************************** + * @file stm8s_awu.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the AWU peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_AWU_H +#define __STM8S_AWU_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup AWU_Exported_Types + * @{ + */ + +/** + * @brief AWU TimeBase selection + */ + +typedef enum +{ + AWU_TIMEBASE_NO_IT = (uint8_t)0, /*!< No AWU interrupt selected */ + AWU_TIMEBASE_250US = (uint8_t)1, /*!< AWU Timebase equals 0.25 ms */ + AWU_TIMEBASE_500US = (uint8_t)2, /*!< AWU Timebase equals 0.5 ms */ + AWU_TIMEBASE_1MS = (uint8_t)3, /*!< AWU Timebase equals 1 ms */ + AWU_TIMEBASE_2MS = (uint8_t)4, /*!< AWU Timebase equals 2 ms */ + AWU_TIMEBASE_4MS = (uint8_t)5, /*!< AWU Timebase equals 4 ms */ + AWU_TIMEBASE_8MS = (uint8_t)6, /*!< AWU Timebase equals 8 ms */ + AWU_TIMEBASE_16MS = (uint8_t)7, /*!< AWU Timebase equals 16 ms */ + AWU_TIMEBASE_32MS = (uint8_t)8, /*!< AWU Timebase equals 32 ms */ + AWU_TIMEBASE_64MS = (uint8_t)9, /*!< AWU Timebase equals 64 ms */ + AWU_TIMEBASE_128MS = (uint8_t)10, /*!< AWU Timebase equals 128 ms */ + AWU_TIMEBASE_256MS = (uint8_t)11, /*!< AWU Timebase equals 256 ms */ + AWU_TIMEBASE_512MS = (uint8_t)12, /*!< AWU Timebase equals 512 ms */ + AWU_TIMEBASE_1S = (uint8_t)13, /*!< AWU Timebase equals 1 s */ + AWU_TIMEBASE_2S = (uint8_t)14, /*!< AWU Timebase equals 2 s */ + AWU_TIMEBASE_12S = (uint8_t)15, /*!< AWU Timebase equals 12 s */ + AWU_TIMEBASE_30S = (uint8_t)16 /*!< AWU Timebase equals 30 s */ +} AWU_Timebase_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @addtogroup AWU_Exported_Constants + * @{ + */ + +#define LSI_FREQUENCY_MIN ((uint32_t)110000) /*!< LSI minimum value in Hertz */ +#define LSI_FREQUENCY_MAX ((uint32_t)150000) /*!< LSI maximum value in Hertz */ + +/** + * @} + */ + +/* Exported macros ------------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup AWU_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different functions parameters. + */ + +/** + * @brief Macro used by the assert function to check the AWU timebases + */ +#define IS_AWU_TIMEBASE_OK(TB) \ + (((TB) == AWU_TIMEBASE_NO_IT) || \ + ((TB) == AWU_TIMEBASE_250US) || \ + ((TB) == AWU_TIMEBASE_500US) || \ + ((TB) == AWU_TIMEBASE_1MS) || \ + ((TB) == AWU_TIMEBASE_2MS) || \ + ((TB) == AWU_TIMEBASE_4MS) || \ + ((TB) == AWU_TIMEBASE_8MS) || \ + ((TB) == AWU_TIMEBASE_16MS) || \ + ((TB) == AWU_TIMEBASE_32MS) || \ + ((TB) == AWU_TIMEBASE_64MS) || \ + ((TB) == AWU_TIMEBASE_128MS) || \ + ((TB) == AWU_TIMEBASE_256MS) || \ + ((TB) == AWU_TIMEBASE_512MS) || \ + ((TB) == AWU_TIMEBASE_1S) || \ + ((TB) == AWU_TIMEBASE_2S) || \ + ((TB) == AWU_TIMEBASE_12S) || \ + ((TB) == AWU_TIMEBASE_30S)) + +/** + * @brief Macro used by the assert function to check the LSI frequency (in Hz) + */ +#define IS_LSI_FREQUENCY_OK(FREQ) \ + (((FREQ) >= LSI_FREQUENCY_MIN) && \ + ((FREQ) <= LSI_FREQUENCY_MAX)) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup AWU_Exported_Functions + * @{ + */ +void AWU_DeInit(void); +void AWU_Init(AWU_Timebase_TypeDef AWU_TimeBase); +void AWU_Cmd(FunctionalState NewState); +void AWU_LSICalibrationConfig(uint32_t LSIFreqHz); +void AWU_IdleModeEnable(void); +FlagStatus AWU_GetFlagStatus(void); + +/** + * @} + */ + +#endif /* __STM8S_AWU_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_beep.h b/4_EXT_INT_1PORT/lib/inc/stm8s_beep.h new file mode 100644 index 0000000..d9170a1 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_beep.h @@ -0,0 +1,119 @@ +/** + ****************************************************************************** + * @file stm8s_beep.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the BEEP peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_BEEP_H +#define __STM8S_BEEP_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup BEEP_Exported_Types + * @{ + */ + +/** + * @brief BEEP Frequency selection + */ +typedef enum { + BEEP_FREQUENCY_1KHZ = (uint8_t)0x00, /*!< Beep signal output frequency equals to 1 KHz */ + BEEP_FREQUENCY_2KHZ = (uint8_t)0x40, /*!< Beep signal output frequency equals to 2 KHz */ + BEEP_FREQUENCY_4KHZ = (uint8_t)0x80 /*!< Beep signal output frequency equals to 4 KHz */ +} BEEP_Frequency_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @addtogroup BEEP_Exported_Constants + * @{ + */ + +#define BEEP_CALIBRATION_DEFAULT ((uint8_t)0x0B) /*!< Default value when calibration is not done */ + +#define LSI_FREQUENCY_MIN ((uint32_t)110000) /*!< LSI minimum value in Hertz */ +#define LSI_FREQUENCY_MAX ((uint32_t)150000) /*!< LSI maximum value in Hertz */ + +/** + * @} + */ + +/* Exported macros -----------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup BEEP_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different functions parameters. + */ + +/** + * @brief Macro used by the assert function to check the BEEP frequencies. + */ +#define IS_BEEP_FREQUENCY_OK(FREQ) \ + (((FREQ) == BEEP_FREQUENCY_1KHZ) || \ + ((FREQ) == BEEP_FREQUENCY_2KHZ) || \ + ((FREQ) == BEEP_FREQUENCY_4KHZ)) + +/** + * @brief Macro used by the assert function to check the LSI frequency (in Hz). + */ +#define IS_LSI_FREQUENCY_OK(FREQ) \ + (((FREQ) >= LSI_FREQUENCY_MIN) && \ + ((FREQ) <= LSI_FREQUENCY_MAX)) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup BEEP_Exported_Functions + * @{ + */ + +void BEEP_DeInit(void); +void BEEP_Init(BEEP_Frequency_TypeDef BEEP_Frequency); +void BEEP_Cmd(FunctionalState NewState); +void BEEP_LSICalibrationConfig(uint32_t LSIFreqHz); + + +/** + * @} + */ + +#endif /* __STM8S_BEEP_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_can.h b/4_EXT_INT_1PORT/lib/inc/stm8s_can.h new file mode 100644 index 0000000..ee52088 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_can.h @@ -0,0 +1,521 @@ +/** + ****************************************************************************** + * @file stm8s_can.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the CAN peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_CAN_H +#define __STM8S_CAN_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported constants --------------------------------------------------------*/ +#define CAN_STDID_SIZE ((uint16_t)0x07FF) +#define CAN_EXTID_SIZE ((uint32_t)0x1FFFFFFF) +#define CAN_DLC_MAX ((uint8_t)0x08) + + +/** @addtogroup CAN_Exported_Types + * @{ + */ + + +/** + * @brief CAN Page Mapping + */ +typedef enum +{ + CAN_Page_TxMailBox0 = ((uint8_t) 0), /*!< CAN TX mailbox 0 reg page */ + CAN_Page_TxMailBox1 = ((uint8_t) 1), /*!< CAN TX mailbox 1 reg page */ + CAN_Page_TxMailBox2 = ((uint8_t) 5), /*!< CAN TX mailbox 2 reg page */ + CAN_Page_Filter01 = ((uint8_t) 2), /*!< CAN Filters 0 & 1 reg page*/ + CAN_Page_Filter23 = ((uint8_t) 3), /*!< CAN Filters 2 & 3 reg page*/ + CAN_Page_Filter45 = ((uint8_t) 4), /*!< CAN Filters 4 & 5 reg page*/ + CAN_Page_Config = ((uint8_t) 6), /*!< CAN Configuration control/status reg page*/ + CAN_Page_RxFifo = ((uint8_t) 7) /*!< CAN RX FIFO registers page */ +}CAN_Page_TypeDef; + + + +/** + * @brief CAN sleep constants + */ +typedef enum { + CAN_InitStatus_Failed =0, /*!< CAN initialization failed */ + CAN_InitStatus_Success =! CAN_InitStatus_Failed /*!< CAN initialization OK*/ +} CAN_InitStatus_TypeDef; + + + /** + * @brief CAN operating mode */ + typedef enum +{ + CAN_OperatingMode_Initialization =((uint8_t)0x00), /*!< Initialization mode */ + CAN_OperatingMode_Normal =((uint8_t)0x01), /*!< Normal mode */ + CAN_OperatingMode_Sleep =((uint8_t)0x02) /*!< sleep mode */ +}CAN_OperatingMode_TypeDef; + + /** + * @brief CAN operating mode status */ + typedef enum +{ + CAN_ModeStatus_Failed = ((uint8_t)0x00), /*!< CAN entering the specific mode failed */ + CAN_ModeStatus_Success =! CAN_ModeStatus_Failed /*!< CAN entering the specific mode Succeed */ +}CAN_ModeStatus_TypeDef; + + /** + * @brief CAN Time Triggered Communication mode + */ +typedef enum +{ + CAN_MasterCtrl_AllDisabled =((uint8_t)0x00), /*!< CAN ALL Master Control Option are DISABLED */ + CAN_MasterCtrl_AllEnabled =((uint8_t)0xFC), /*!< CAN ALL Master Control Option are DISABLED */ + CAN_MasterCtrl_TimeTriggerCOMMode =((uint8_t)0x80), /*!< CAN Time Triggered Communication mode ENABLED */ + CAN_MasterCtrl_AutoBusOffManagement =((uint8_t)0x40), /*!< CAN Auto Bus Off Management ENABLED */ + CAN_MasterCtrl_AutoWakeUpMode =((uint8_t)0x20), /*!< CAN Automatic WakeUp Mode ENABLED , sleep mode is left automatically by hardware */ + CAN_MasterCtrl_NoAutoReTx =((uint8_t)0x10), /*!< CAN Non Automatic Retransmission ENABLED, MSG will be transmitted only once */ + CAN_MasterCtrl_RxFifoLockedMode =((uint8_t)0x08), /*!< CAN Receive FIFO Locked against overrun ENABLED */ + CAN_MasterCtrl_TxFifoPriority =((uint8_t)0x04) /*!< CAN Transmit FIFO Priority driven by the request order (not by the identifier of the MSG) */ + }CAN_MasterCtrl_TypeDef; + +/** + * @brief CAN mode options */ +typedef enum +{ + CAN_Mode_Normal =((uint8_t)0x00), /*!< normal mode */ + CAN_Mode_LoopBack =((uint8_t)0x01), /*!< loopback mode */ + CAN_Mode_Silent =((uint8_t)0x02), /*!< silent mode */ + CAN_Mode_Silent_LoopBack =((uint8_t)0x03) /*!< loopback combined with silent mode */ +}CAN_Mode_TypeDef; + +/** + * @brief CAN synchronisation jump width (SJW)*/ +typedef enum +{ + CAN_SynJumpWidth_1TimeQuantum =((uint8_t)0x00), /*!< 1 time quantum */ + CAN_SynJumpWidth_2TimeQuantum =((uint8_t)0x40), /*!< 2 time quantum */ + CAN_SynJumpWidth_3TimeQuantum =((uint8_t)0x80), /*!< 3 time quantum */ + CAN_SynJumpWidth_4TimeQuantum =((uint8_t)0xC0) /*!< 4 time quantum */ +}CAN_SynJumpWidth_TypeDef; + +/** + * @brief time quantum in bit segment 1 */ +typedef enum +{ + CAN_BitSeg1_1TimeQuantum =((uint8_t)0x00), /*!< 1 time quantum */ + CAN_BitSeg1_2TimeQuantum =((uint8_t)0x01), /*!< 2 time quantum */ + CAN_BitSeg1_3TimeQuantum =((uint8_t)0x02), /*!< 3 time quantum */ + CAN_BitSeg1_4TimeQuantum =((uint8_t)0x03) , /*!< 4 time quantum */ + CAN_BitSeg1_5TimeQuantum =((uint8_t)0x04) , /*!< 5 time quantum */ + CAN_BitSeg1_6TimeQuantum =((uint8_t)0x05) , /*!< 6 time quantum */ + CAN_BitSeg1_7TimeQuantum =((uint8_t)0x06) , /*!< 7 time quantum */ + CAN_BitSeg1_8TimeQuantum =((uint8_t)0x07), /*!< 8 time quantum */ + CAN_BitSeg1_9TimeQuantum =((uint8_t)0x08), /*!< 9 time quantum */ + CAN_BitSeg1_10TimeQuantum =((uint8_t)0x09), /*!< 10 time quantum */ + CAN_BitSeg1_11TimeQuantum =((uint8_t)0x0A), /*!< 11 time quantum */ + CAN_BitSeg1_12TimeQuantum =((uint8_t)0x0B), /*!< 12 time quantum */ + CAN_BitSeg1_13TimeQuantum =((uint8_t)0x0C), /*!< 13 time quantum */ + CAN_BitSeg1_14TimeQuantum =((uint8_t)0x0D), /*!< 14 time quantum */ + CAN_BitSeg1_15TimeQuantum =((uint8_t)0x0E), /*!< 15 time quantum */ + CAN_BitSeg1_16TimeQuantum =((uint8_t)0x0F) /*!< 16 time quantum */ +}CAN_BitSeg1_TypeDef; + +/** + * @brief time quantum in bit segment 2 */ +typedef enum +{ + CAN_BitSeg2_1TimeQuantum = ((uint8_t)0x00), /*!< 1 time quantum */ + CAN_BitSeg2_2TimeQuantum = ((uint8_t)0x10), /*!< 2 time quantum */ + CAN_BitSeg2_3TimeQuantum = ((uint8_t)0x20), /*!< 3 time quantum */ + CAN_BitSeg2_4TimeQuantum = ((uint8_t)0x30), /*!< 4 time quantum */ + CAN_BitSeg2_5TimeQuantum = ((uint8_t)0x40), /*!< 5 time quantum */ + CAN_BitSeg2_6TimeQuantum = ((uint8_t)0x50), /*!< 6 time quantum */ + CAN_BitSeg2_7TimeQuantum = ((uint8_t)0x60), /*!< 7 time quantum */ + CAN_BitSeg2_8TimeQuantum = ((uint8_t)0x70) /*!< 8 time quantum */ +}CAN_BitSeg2_TypeDef; + + +/** + * @brief CAN filter number */ +typedef enum +{ + CAN_FilterNumber_0 = ((uint8_t)0x00), /*!< Filter number 0 */ + CAN_FilterNumber_1 = ((uint8_t)0x01), /*!< Filter number 1 */ + CAN_FilterNumber_2 = ((uint8_t)0x02), /*!< Filter number 2 */ + CAN_FilterNumber_3 = ((uint8_t)0x03), /*!< Filter number 3 */ + CAN_FilterNumber_4 = ((uint8_t)0x04), /*!< Filter number 4 */ + CAN_FilterNumber_5 = ((uint8_t)0x05) /*!< Filter number 5 */ +}CAN_FilterNumber_TypeDef; + +/** + * @brief CAN filter mode */ +typedef enum +{ + CAN_FilterMode_IdMask = ((uint8_t)0x00), /*!< id/mask mode */ + CAN_FilterMode_IdMask_IdList = ((uint8_t)0x10), /*!< Id/Mask mode First and IdList mode second */ + CAN_FilterMode_IdList_IdMask = ((uint8_t)0x11), /*!< IdList mode First and IdMask mode second */ + CAN_FilterMode_IdList = ((uint8_t)0x01) /*!< identifier list mode */ +}CAN_FilterMode_TypeDef; + +/** + * @brief CAN filter scale */ +typedef enum +{ + CAN_FilterScale_8Bit =((uint8_t)0x00), /*!< 8-bit filter scale */ + CAN_FilterScale_16_8Bit =((uint8_t)0x02), /*!< 16/8-bit filter scale */ + CAN_FilterScale_16Bit =((uint8_t)0x04), /*!< 16-bit filter scale */ + CAN_FilterScale_32Bit =((uint8_t)0x06) /*!< 32-bit filter scale */ +}CAN_FilterScale_TypeDef; + + +/** + * @brief CAN Tx mailboxes*/ +typedef enum +{ + CAN_TransmitMailBox_0 = ((uint8_t) 0x00), /*!< CAN TX mailbox 0 reg page */ + CAN_TransmitMailBox_1 = ((uint8_t) 0x01), /*!< CAN TX mailbox 1 reg page */ + CAN_TransmitMailBox_2 = ((uint8_t) 0x05) /*!< CAN TX mailbox 2 reg page */ +}CAN_TransmitMailBox_TypeDef; + +/** + * @brief CAN Pending Messages number*/ +typedef enum +{ + CAN_NbrPendingMessage_0 = ((uint8_t)0x00), /*!< No Msg Pending */ + CAN_NbrPendingMessage_1 = ((uint8_t)0x01), /*!< 1 Msg Pending */ + CAN_NbrPendingMessage_2 = ((uint8_t)0x02), /*!< 2 Msg Pending */ + CAN_NbrPendingMessage_3 = ((uint8_t)0x03) /*!< 3 Msg Pending */ +}CAN_NbrPendingMessage_TypeDef; + +/** + * @brief CAN identifier type */ +typedef enum +{ + CAN_Id_Standard =((uint8_t)0x00), /*!< Standard Id */ + CAN_Id_Extended =((uint8_t)0x40) /*!< Extended Id */ +}CAN_Id_TypeDef; + +/** + * @brief CAN remote transmission request */ +typedef enum +{ + CAN_RTR_Data = ((uint8_t)0x00), /*!< Data frame */ + CAN_RTR_Remote = ((uint8_t)0x20) /*!< Remote frame */ +}CAN_RTR_TypeDef; + +/** + * @brief CAN transmit Status */ +typedef enum +{ + CAN_TxStatus_Failed =((uint8_t)0xF0), /*!< CAN transmission failed */ + CAN_TxStatus_Ok =((uint8_t)0xF1), /*!< CAN transmission succeeded */ + CAN_TxStatus_Pending =((uint8_t)0xF2), /*!< CAN transmission pending */ + CAN_TxStatus_NoMailBox =((uint8_t)0xF4), /*!< CAN cell did not provide an empty mailbox */ + CAN_TxStatus_MailBoxEmpty =((uint8_t)0xF5), /*!< CAN Tx mailbox is Empty */ + CAN_TxStatus_MailBox0Ok =((uint8_t)0x00), /*!< CAN transmission succeeded by mail box 1*/ + CAN_TxStatus_MailBox1Ok =((uint8_t)0x01), /*!< CAN transmission succeeded by mail box 2*/ + CAN_TxStatus_MailBox2Ok =((uint8_t)0x05) /*!< CAN transmission succeeded by mail box 3*/ +}CAN_TxStatus_TypeDef; + +/** + * @brief CAN sleep Status */ +typedef enum +{ + CAN_Sleep_Failed = ((uint8_t)0x00), /*!< CAN did not enter the sleep mode */ + CAN_Sleep_Ok = ((uint8_t)0x01) /*!< CAN entered the sleep mode */ +}CAN_Sleep_TypeDef; +/** + * @brief CAN wake up status */ +typedef enum +{ + CAN_WakeUp_Failed = ((uint8_t)0x00), /*!< CAN did not leave the sleep mode */ + CAN_WakeUp_Ok = ((uint8_t)0x01) /*!< CAN leaved the sleep mode */ +}CAN_WakeUp_TypeDef; + +/** + * @brief CAN flags */ +typedef enum +{ + /* if the flag is 0x3XXX, it means that it can be got (CAN_GetFlagStatus) and Cleared (CAN_ClearFlag) */ + /* if the flag is 0x1XXX, it means that it can only be got (CAN_GetFlagStatus) */ + /*Transmit Flags*/ + CAN_FLAG_RQCP0 =((uint16_t)0x3401), /*!< Request MailBox0 Flag */ + CAN_FLAG_RQCP1 =((uint16_t)0x3402), /*!< Request MailBox1 Flag */ + CAN_FLAG_RQCP2 =((uint16_t)0x3404), /*!< Request MailBox2 Flag */ + /*Receive Flags*/ + CAN_FLAG_FMP =((uint16_t)0x1203), /*!< FIFO Message Pending Flag */ + CAN_FLAG_FF =((uint16_t)0x3208), /*!< FIFO Full Flag */ + CAN_FLAG_FOV =((uint16_t)0x3210), /*!< FIFO Overrun Flag */ + /*Wake up Flag*/ + CAN_FLAG_WKU =((uint16_t)0x3108), /*!< wake up Flag */ + /*Error Flags*/ + CAN_FLAG_EWG =((uint16_t)0x1001), /*!< Error Warning Flag */ + CAN_FLAG_EPV =((uint16_t)0x1002), /*!< Error Passive Flag */ + CAN_FLAG_BOF =((uint16_t)0x1004), /*!< Bus-Off Flag */ + CAN_FLAG_LEC =((uint16_t)0x3070) /*!< Last error code Flag */ +}CAN_FLAG_TypeDef; + +/** + * @brief CAN interrupts */ +typedef enum +{ + /*Transmit Interruption*/ + CAN_IT_TME =((uint16_t)0x0001), /*!< Transmit mailbox empty interrupt */ + /*Receive Interruptions*/ + CAN_IT_FMP =((uint16_t)0x0002), /*!< FIFO message pending interrupt */ + CAN_IT_FF =((uint16_t)0x0004), /*!< FIFO full interrupt */ + CAN_IT_FOV =((uint16_t)0x0008), /*!< FIFO overrun interrupt */ + /*Wake Up Interruption*/ + CAN_IT_WKU =((uint16_t)0x0080), /*!< Wake-up interrupt */ + /*Error Interruptions*/ + CAN_IT_ERR =((uint16_t)0x4000), /*!< Genaral Error interrupt */ + CAN_IT_EWG =((uint16_t)0x0100), /*!< Error warning interrupt */ + CAN_IT_EPV =((uint16_t)0x0200), /*!< Error passive interrupt */ + CAN_IT_BOF =((uint16_t)0x0400), /*!< Bus-off interrupt */ + CAN_IT_LEC =((uint16_t)0x0800) /*!< Last error code interrupt */ +} CAN_IT_TypeDef; + +/** + * @brief CAN ST7 Compatibility*/ +typedef enum +{ + CAN_ST7Compatibility_Enable = ((uint8_t)0x00), /*!< CAN is compatible with ST7 beCAN (only 2 mailboxes are available)*/ + CAN_ST7Compatibility_Disable = ((uint8_t)0x10) /*!< CAN is not compatible with ST7 beCAN ( 3 mailboxes are available)*/ +}CAN_ST7Compatibility_TypeDef; + +/** + * @brief CAN Error Code description */ +typedef enum +{ + CAN_ErrorCode_NoErr = ((uint8_t)0x00), /*!< No Error */ + CAN_ErrorCode_StuffErr = ((uint8_t)0x10), /*!< Stuff Error */ + CAN_ErrorCode_FormErr = ((uint8_t)0x20), /*!< Form Error */ + CAN_ErrorCode_ACKErr = ((uint8_t)0x30), /*!< Acknowledgment Error */ + CAN_ErrorCode_BitRecessiveErr = ((uint8_t)0x40), /*!< Bit Recessive Error */ + CAN_ErrorCode_BitDominantErr = ((uint8_t)0x50), /*!< Bit Dominant Error */ + CAN_ErrorCode_CRCErr = ((uint8_t)0x60), /*!< CRC Error */ + CAN_ErrorCode_SoftwareSetErr = ((uint8_t)0x70) /*!< Software Set Error */ +}CAN_ErrorCode_TypeDef; +/** + * @} + */ +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup CAN_Private_Macros + * @{ + */ +/** + * @brief Macro used by the assert function in order to check the CAN ST7 Compatibility parameters. + */ +#define IS_CAN_ST7_COMPATIBILITY_OK(STATE) (((STATE) == CAN_ST7Compatibility_Enable) || ((STATE) == CAN_ST7Compatibility_Disable)) +/** + * @brief Macro used by the assert function in order to check CAN operating mode. + */ +#define IS_CAN_OPERATINGMODE_OK(MODE) (((MODE) == CAN_OperatingMode_Initialization) ||\ + ((MODE) == CAN_OperatingMode_Normal)|| \ + ((MODE) == CAN_OperatingMode_Sleep)) +/** + * @brief Macro used by the assert function in order to check CAN Time Triggered Communication mode. + */ +#define IS_CAN_MASTERCTRL_OK(MODE) (((MODE) == CAN_MasterCtrl_AllDisabled) || \ + (((MODE) <= CAN_MasterCtrl_AllEnabled) && ((MODE) >= CAN_MasterCtrl_TxFifoPriority))) +/** + * @brief Macro used by the assert function in order to check CAN mode options . + */ +#define IS_CAN_MODE_OK(MODE) (((MODE) == CAN_Mode_Normal) || ((MODE) == CAN_Mode_LoopBack)|| \ + ((MODE) == CAN_Mode_Silent) || ((MODE) == CAN_Mode_Silent_LoopBack)) +/** + * @brief Macro used by the assert function in order to check the CAN synchronisation jump width (SJW). + */ +#define IS_CAN_SYNJUMPWIDTH_OK(SJW) (((SJW) == CAN_SynJumpWidth_1TimeQuantum) || ((SJW) == CAN_SynJumpWidth_2TimeQuantum)|| \ + ((SJW) == CAN_SynJumpWidth_3TimeQuantum) || ((SJW) == CAN_SynJumpWidth_4TimeQuantum)) +/** + * @brief Macro used by the assert function in order to check time quantum in bit segment 1 . + */ +#define IS_CAN_BITSEG1_OK(BS1) ((BS1) <= CAN_BitSeg1_16TimeQuantum) +/** + * @brief Macro used by the assert function in order to check time quantum in bit segment 2. + */ +#define IS_CAN_BITSEG2_OK(BS2) ((((BS2) >= CAN_BitSeg2_2TimeQuantum) && ((BS2) <= CAN_BitSeg2_8TimeQuantum))|| ((BS2) == CAN_BitSeg2_1TimeQuantum)) +/** + * @brief Macro used by the assert function in order to check CAN clock prescaler. + */ +#define IS_CAN_PRESCALER_OK(PRESCALER) (((PRESCALER) >= 1) && ((PRESCALER) <= 64)) +/** + * @brief Macro used by the assert function in order to check CAN filter number. + */ +#define IS_CAN_FILTER_NUMBER_OK(NUMBER) (((NUMBER) == CAN_FilterNumber_0) || \ + ((NUMBER) == CAN_FilterNumber_1) || \ + ((NUMBER) == CAN_FilterNumber_2) || \ + ((NUMBER) == CAN_FilterNumber_3) || \ + ((NUMBER) == CAN_FilterNumber_4) || \ + ((NUMBER) == CAN_FilterNumber_5)) +/** + * @brief Macro used by the assert function in order to check CAN filter mode. + */ +#define IS_CAN_FILTER_MODE_OK(MODE) (((MODE) == CAN_FilterMode_IdMask) || \ + ((MODE) == CAN_FilterMode_IdMask_IdList) || \ + ((MODE) == CAN_FilterMode_IdList_IdMask) || \ + ((MODE) == CAN_FilterMode_IdList)) +/** + * @brief Macro used by the assert function in order to check CAN filter scale. + */ +#define IS_CAN_FILTER_SCALE_OK(SCALE) (((SCALE) == CAN_FilterScale_8Bit)|| \ + ((SCALE) == CAN_FilterScale_16_8Bit) ||\ + ((SCALE) == CAN_FilterScale_16Bit )||\ + ((SCALE) == CAN_FilterScale_32Bit)) +/** + * @brief Macro used by the assert function in order to check CAN Tx mailboxes. + */ +#define IS_CAN_TRANSMITMAILBOX_OK(TRANSMITMAILBOX) (((TRANSMITMAILBOX) == CAN_TransmitMailBox_0) || \ + ((TRANSMITMAILBOX) == CAN_TransmitMailBox_1) || \ + ((TRANSMITMAILBOX) == CAN_TransmitMailBox_2)) +/** + * @brief Macro used by the assert function in order to check the Standard ID to be sent. + */ +#define IS_CAN_STDID_OK(STDID) ((STDID) <= ((uint16_t)CAN_STDID_SIZE)) +/** + * @brief Macro used by the assert function in order to check the Extended ID to be sent. + */ +#define IS_CAN_EXTID_OK(EXTID) ((EXTID) <= ((uint32_t)CAN_EXTID_SIZE)) +/** + * @brief Macro used by the assert function in order to check the DLC to be sent. + */ +#define IS_CAN_DLC_OK(DLC) ((DLC) <= CAN_DLC_MAX) +/** + * @brief Macro used by the assert function in order to check the type of the ID to be sent. + */ +#define IS_CAN_IDTYPE_OK(IDTYPE) (((IDTYPE) == CAN_Id_Standard) || ((IDTYPE) == CAN_Id_Extended)) +/** + * @brief Macro used by the assert function in order to check CAN transmission Frame Type. + */ +#define IS_CAN_RTR_OK(RTR) (((RTR) == CAN_RTR_Data) || ((RTR) == CAN_RTR_Remote)) + +/** + * @brief Macro used by the assert function in order to check CAN flags which can be got by @ref CAN_GetFlagStatus + */ +#define IS_CAN_FLAG_STATUS_OK(FLAG) (((FLAG) == CAN_FLAG_RQCP0) || ((FLAG) == CAN_FLAG_RQCP1) ||\ + ((FLAG) == CAN_FLAG_RQCP2) || ((FLAG) == CAN_FLAG_FMP) ||\ + ((FLAG) == CAN_FLAG_FF) || ((FLAG) == CAN_FLAG_FOV) ||\ + ((FLAG) == CAN_FLAG_WKU) || ((FLAG) == CAN_FLAG_EWG) ||\ + ((FLAG) == CAN_FLAG_EPV) || ((FLAG) == CAN_FLAG_BOF) ||\ + ((FLAG) == CAN_FLAG_LEC)) +/** + * @brief Macro used by the assert function in order to check CAN flags which can be cleared by @ref CAN_ClearFlag + */ +#define IS_CAN_FLAG_CLEAR_OK(FLAG) (((FLAG) == CAN_FLAG_RQCP0) || ((FLAG) == CAN_FLAG_RQCP1) ||\ + ((FLAG) == CAN_FLAG_RQCP2) || ((FLAG) == CAN_FLAG_FF) ||\ + ((FLAG) == CAN_FLAG_FOV) || ((FLAG) == CAN_FLAG_WKU) ||\ + ((FLAG) == CAN_FLAG_LEC)) +/** + * @brief Macro used by the assert function in order to check the CAN Configuration interrupts. + */ +#define CAN_IT_CONFIG_MASK ~(uint16_t)(CAN_IT_TME|CAN_IT_FMP|CAN_IT_FF|CAN_IT_FOV|CAN_IT_WKU|CAN_IT_EWG|CAN_IT_EPV|CAN_IT_BOF|CAN_IT_LEC|CAN_IT_ERR) +#define IS_CAN_IT_CONFIG_OK(IT) (((IT) != 0x0000) && ((uint16_t)((uint16_t)(IT) & (uint16_t)CAN_IT_CONFIG_MASK) == 0x0000)) +/** + * @brief Macro used by the assert function in order to check the CAN status interrupts. + */ +#define IS_CAN_IT_STATUS_OK(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FMP) ||\ + ((IT) == CAN_IT_FF) || ((IT) == CAN_IT_FOV) || \ + ((IT) == CAN_IT_WKU) || ((IT) == CAN_IT_ERR) || \ + ((IT) == CAN_IT_EWG) || ((IT) == CAN_IT_EPV) || \ + ((IT) == CAN_IT_BOF) || ((IT) == CAN_IT_LEC) ) +/** + * @brief Macro used by the assert function in order to check the CAN Pending bit interrupts. + */ +#define IS_CAN_IT_PENDING_BIT_OK(IT) (((IT) == CAN_IT_TME) || ((IT) == CAN_IT_FF) ||\ + ((IT) == CAN_IT_FOV) || ((IT) == CAN_IT_WKU) ||\ + ((IT) == CAN_IT_ERR) || ((IT) == CAN_IT_EWG) ||\ + ((IT) == CAN_IT_EPV) || ((IT) == CAN_IT_BOF)||\ + ((IT) == CAN_IT_LEC)) +/** + * @brief Macro used by the assert function in order to check the Last Error Code. + */ +#define IS_CAN_LAST_ERROR_CODE_OK(CODE) (((CODE) & 0x8F) == 0x00) +/** + * @} + */ + +/* Exported function prototypes --------------------------------------------- */ +/** @addtogroup CAN_Exported_Functions + * @{ + */ +void CAN_DeInit(void); +CAN_InitStatus_TypeDef CAN_Init(CAN_MasterCtrl_TypeDef CAN_MasterCtrl, + CAN_Mode_TypeDef CAN_Mode, + CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth, + CAN_BitSeg1_TypeDef CAN_BitSeg1, + CAN_BitSeg2_TypeDef CAN_BitSeg2, + uint8_t CAN_Prescaler); + +void CAN_FilterInit(CAN_FilterNumber_TypeDef CAN_FilterNumber, + FunctionalState CAN_FilterActivation, + CAN_FilterMode_TypeDef CAN_FilterMode, + CAN_FilterScale_TypeDef CAN_FilterScale, + uint8_t CAN_FilterID1, + uint8_t CAN_FilterID2, + uint8_t CAN_FilterID3, + uint8_t CAN_FilterID4, + uint8_t CAN_FilterIDMask1, + uint8_t CAN_FilterIDMask2, + uint8_t CAN_FilterIDMask3, + uint8_t CAN_FilterIDMask4); +void CAN_ITConfig(CAN_IT_TypeDef CAN_IT, FunctionalState NewState); +void CAN_ST7CompatibilityCmd(CAN_ST7Compatibility_TypeDef CAN_ST7Compatibility); +CAN_TxStatus_TypeDef CAN_Transmit( uint32_t CAN_Id, + CAN_Id_TypeDef CAN_IDE, + CAN_RTR_TypeDef CAN_RTR, + uint8_t CAN_DLC, + uint8_t *CAN_Data); +void CAN_TTComModeCmd(FunctionalState NewState); +CAN_TxStatus_TypeDef CAN_TransmitStatus(CAN_TransmitMailBox_TypeDef CAN_TransmitMailbox); +void CAN_CancelTransmit(CAN_TransmitMailBox_TypeDef CAN_TransmitMailbox); +void CAN_FIFORelease(void); +CAN_NbrPendingMessage_TypeDef CAN_MessagePending(void); +void CAN_Receive(void); +uint32_t CAN_GetReceivedId(void); +CAN_Id_TypeDef CAN_GetReceivedIDE(void); +CAN_RTR_TypeDef CAN_GetReceivedRTR(void); +uint8_t CAN_GetReceivedDLC(void); +uint8_t CAN_GetReceivedData(uint8_t CAN_DataIndex); +uint8_t CAN_GetReceivedFMI(void); +uint16_t CAN_GetMessageTimeStamp(void); +CAN_Sleep_TypeDef CAN_Sleep(void); +CAN_WakeUp_TypeDef CAN_WakeUp(void); +CAN_ModeStatus_TypeDef CAN_OperatingModeRequest(CAN_OperatingMode_TypeDef CAN_OperatingMode); +CAN_ErrorCode_TypeDef CAN_GetLastErrorCode(void); +CAN_Page_TypeDef CAN_GetSelectedPage(void); +void CAN_SelectPage(CAN_Page_TypeDef CAN_Page); +FlagStatus CAN_GetFlagStatus(CAN_FLAG_TypeDef CAN_Flag); +void CAN_ClearFlag(CAN_FLAG_TypeDef CAN_Flag); +ITStatus CAN_GetITStatus(CAN_IT_TypeDef CAN_IT); +void CAN_ClearITPendingBit(CAN_IT_TypeDef CAN_IT); +/** + * @} + */ +#endif /* __STM8S_CAN_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_clk.h b/4_EXT_INT_1PORT/lib/inc/stm8s_clk.h new file mode 100644 index 0000000..0dbce09 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_clk.h @@ -0,0 +1,382 @@ +/** + ****************************************************************************** + * @file stm8s_clk.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the CLK peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_CLK_H +#define __STM8S_CLK_H + +/* Includes ------------------------------------------------------------------*/ +/* Contains the description of all STM8 hardware registers */ +#include "stm8s.h" + +/* Exported types ------------------------------------------------------------*/ +/** @addtogroup CLK_Exported_Types + * @{ + */ + +/** + * @brief Switch Mode Auto, Manual. + */ +typedef enum { + CLK_SWITCHMODE_MANUAL = (uint8_t)0x00, /*!< Enable the manual clock switching mode */ + CLK_SWITCHMODE_AUTO = (uint8_t)0x01 /*!< Enable the automatic clock switching mode */ +} CLK_SwitchMode_TypeDef; + +/** + * @brief Current Clock State. + */ +typedef enum { + CLK_CURRENTCLOCKSTATE_DISABLE = (uint8_t)0x00, /*!< Current clock disable */ + CLK_CURRENTCLOCKSTATE_ENABLE = (uint8_t)0x01 /*!< Current clock enable */ +} CLK_CurrentClockState_TypeDef; + +/** + * @brief Clock security system configuration. + */ +typedef enum { + CLK_CSSCONFIG_ENABLEWITHIT = (uint8_t)0x05, /*!< Enable CSS with detection interrupt */ + CLK_CSSCONFIG_ENABLE = (uint8_t)0x01, /*!< Enable CSS without detection interrupt */ + CLK_CSSCONFIG_DISABLE = (uint8_t)0x00 /*!< Leave CSS desactivated (to be used in CLK_Init() function) */ +} CLK_CSSConfig_TypeDef; + +/** + * @brief CLK Clock Source. + */ +typedef enum { + CLK_SOURCE_HSI = (uint8_t)0xE1, /*!< Clock Source HSI. */ + CLK_SOURCE_LSI = (uint8_t)0xD2, /*!< Clock Source LSI. */ + CLK_SOURCE_HSE = (uint8_t)0xB4 /*!< Clock Source HSE. */ +} CLK_Source_TypeDef; + +/** + * @brief CLK HSI Calibration Value. + */ +typedef enum { + CLK_HSITRIMVALUE_0 = (uint8_t)0x00, /*!< HSI Calibration Value 0 */ + CLK_HSITRIMVALUE_1 = (uint8_t)0x01, /*!< HSI Calibration Value 1 */ + CLK_HSITRIMVALUE_2 = (uint8_t)0x02, /*!< HSI Calibration Value 2 */ + CLK_HSITRIMVALUE_3 = (uint8_t)0x03, /*!< HSI Calibration Value 3 */ + CLK_HSITRIMVALUE_4 = (uint8_t)0x04, /*!< HSI Calibration Value 4 */ + CLK_HSITRIMVALUE_5 = (uint8_t)0x05, /*!< HSI Calibration Value 5 */ + CLK_HSITRIMVALUE_6 = (uint8_t)0x06, /*!< HSI Calibration Value 6 */ + CLK_HSITRIMVALUE_7 = (uint8_t)0x07 /*!< HSI Calibration Value 7 */ +} CLK_HSITrimValue_TypeDef; + +/** + * @brief CLK Clock Output + */ +typedef enum { + CLK_OUTPUT_HSI = (uint8_t)0x00, /*!< Clock Output HSI */ + CLK_OUTPUT_LSI = (uint8_t)0x02, /*!< Clock Output LSI */ + CLK_OUTPUT_HSE = (uint8_t)0x04, /*!< Clock Output HSE */ + CLK_OUTPUT_CPU = (uint8_t)0x08, /*!< Clock Output CPU */ + CLK_OUTPUT_CPUDIV2 = (uint8_t)0x0A, /*!< Clock Output CPU/2 */ + CLK_OUTPUT_CPUDIV4 = (uint8_t)0x0C, /*!< Clock Output CPU/4 */ + CLK_OUTPUT_CPUDIV8 = (uint8_t)0x0E, /*!< Clock Output CPU/8 */ + CLK_OUTPUT_CPUDIV16 = (uint8_t)0x10, /*!< Clock Output CPU/16 */ + CLK_OUTPUT_CPUDIV32 = (uint8_t)0x12, /*!< Clock Output CPU/32 */ + CLK_OUTPUT_CPUDIV64 = (uint8_t)0x14, /*!< Clock Output CPU/64 */ + CLK_OUTPUT_HSIRC = (uint8_t)0x16, /*!< Clock Output HSI RC */ + CLK_OUTPUT_MASTER = (uint8_t)0x18, /*!< Clock Output Master */ + CLK_OUTPUT_OTHERS = (uint8_t)0x1A /*!< Clock Output OTHER */ +} CLK_Output_TypeDef; + +/** + * @brief CLK Enable peripheral + */ +/* Elements values convention: 0xXY + X = choice between the peripheral registers + X = 0 : PCKENR1 + X = 1 : PCKENR2 + Y = Peripheral position in the register +*/ +typedef enum { + CLK_PERIPHERAL_I2C = (uint8_t)0x00, /*!< Peripheral Clock Enable 1, I2C */ + CLK_PERIPHERAL_SPI = (uint8_t)0x01, /*!< Peripheral Clock Enable 1, SPI */ +#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8AF52Ax) || defined(STM8AF62Ax) + CLK_PERIPHERAL_UART1 = (uint8_t)0x02, /*!< Peripheral Clock Enable 1, UART1 */ +#else + CLK_PERIPHERAL_UART1 = (uint8_t)0x03, /*!< Peripheral Clock Enable 1, UART1 */ +#endif + CLK_PERIPHERAL_UART2 = (uint8_t)0x03, /*!< Peripheral Clock Enable 1, UART2 */ + CLK_PERIPHERAL_UART3 = (uint8_t)0x03, /*!< Peripheral Clock Enable 1, UART3 */ + CLK_PERIPHERAL_TIMER6 = (uint8_t)0x04, /*!< Peripheral Clock Enable 1, Timer6 */ + CLK_PERIPHERAL_TIMER4 = (uint8_t)0x04, /*!< Peripheral Clock Enable 1, Timer4 */ + CLK_PERIPHERAL_TIMER5 = (uint8_t)0x05, /*!< Peripheral Clock Enable 1, Timer5 */ + CLK_PERIPHERAL_TIMER2 = (uint8_t)0x05, /*!< Peripheral Clock Enable 1, Timer2 */ + CLK_PERIPHERAL_TIMER3 = (uint8_t)0x06, /*!< Peripheral Clock Enable 1, Timer3 */ + CLK_PERIPHERAL_TIMER1 = (uint8_t)0x07, /*!< Peripheral Clock Enable 1, Timer1 */ + CLK_PERIPHERAL_AWU = (uint8_t)0x12, /*!< Peripheral Clock Enable 2, AWU */ + CLK_PERIPHERAL_ADC = (uint8_t)0x13, /*!< Peripheral Clock Enable 2, ADC */ + CLK_PERIPHERAL_CAN = (uint8_t)0x17 /*!< Peripheral Clock Enable 2, CAN */ +} CLK_Peripheral_TypeDef; + +/** + * @brief CLK Flags. + */ +/* Elements values convention: 0xXZZ + X = choice between the flags registers + X = 1 : ICKR + X = 2 : ECKR + X = 3 : SWCR + X = 4 : CSSR + X = 5 : CCOR + ZZ = flag mask in the register (same as map file) +*/ +typedef enum { + CLK_FLAG_LSIRDY = (uint16_t)0x0110, /*!< Low speed internal oscillator ready Flag */ + CLK_FLAG_HSIRDY = (uint16_t)0x0102, /*!< High speed internal oscillator ready Flag */ + CLK_FLAG_HSERDY = (uint16_t)0x0202, /*!< High speed external oscillator ready Flag */ + CLK_FLAG_SWIF = (uint16_t)0x0308, /*!< Clock switch interrupt Flag */ + CLK_FLAG_SWBSY = (uint16_t)0x0301, /*!< Switch busy Flag */ + CLK_FLAG_CSSD = (uint16_t)0x0408, /*!< Clock security system detection Flag */ + CLK_FLAG_AUX = (uint16_t)0x0402, /*!< Auxiliary oscillator connected to master clock */ + CLK_FLAG_CCOBSY = (uint16_t)0x0504, /*!< Configurable clock output busy */ + CLK_FLAG_CCORDY = (uint16_t)0x0502 /*!< Configurable clock output ready */ +}CLK_Flag_TypeDef; + +/** + * @brief CLK interrupt configuration and Flags cleared by software. + */ +typedef enum { + CLK_IT_CSSD = (uint8_t)0x0C, /*!< Clock security system detection Flag */ + CLK_IT_SWIF = (uint8_t)0x1C /*!< Clock switch interrupt Flag */ +}CLK_IT_TypeDef; + +/** + * @brief CLK Clock Divisor. + */ + +/* Warning: + 0xxxxxx = HSI divider + 1xxxxxx = CPU divider + Other bits correspond to the divider's bits mapping +*/ +typedef enum { + CLK_PRESCALER_HSIDIV1 = (uint8_t)0x00, /*!< High speed internal clock prescaler: 1 */ + CLK_PRESCALER_HSIDIV2 = (uint8_t)0x08, /*!< High speed internal clock prescaler: 2 */ + CLK_PRESCALER_HSIDIV4 = (uint8_t)0x10, /*!< High speed internal clock prescaler: 4 */ + CLK_PRESCALER_HSIDIV8 = (uint8_t)0x18, /*!< High speed internal clock prescaler: 8 */ + CLK_PRESCALER_CPUDIV1 = (uint8_t)0x80, /*!< CPU clock division factors 1 */ + CLK_PRESCALER_CPUDIV2 = (uint8_t)0x81, /*!< CPU clock division factors 2 */ + CLK_PRESCALER_CPUDIV4 = (uint8_t)0x82, /*!< CPU clock division factors 4 */ + CLK_PRESCALER_CPUDIV8 = (uint8_t)0x83, /*!< CPU clock division factors 8 */ + CLK_PRESCALER_CPUDIV16 = (uint8_t)0x84, /*!< CPU clock division factors 16 */ + CLK_PRESCALER_CPUDIV32 = (uint8_t)0x85, /*!< CPU clock division factors 32 */ + CLK_PRESCALER_CPUDIV64 = (uint8_t)0x86, /*!< CPU clock division factors 64 */ + CLK_PRESCALER_CPUDIV128 = (uint8_t)0x87 /*!< CPU clock division factors 128 */ +} CLK_Prescaler_TypeDef; + +/** + * @brief SWIM Clock divider. + */ +typedef enum { + CLK_SWIMDIVIDER_2 = (uint8_t)0x00, /*!< SWIM clock is divided by 2 */ + CLK_SWIMDIVIDER_OTHER = (uint8_t)0x01 /*!< SWIM clock is not divided by 2 */ +}CLK_SWIMDivider_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @addtogroup CLK_Exported_Constants + * @{ + */ +#define CLK_TIMEOUT ((uint16_t)0xFFFF) /*!< Max Timeout for the clock switch operation. */ +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ +/** @addtogroup CLK_Private_Macros + * @{ + */ + +/** + * @brief Macros used by the assert function in order to check the different functions parameters. + */ + +/** + * @brief Macros used by the assert function in order to check the clock switching modes. + */ +#define IS_CLK_SWITCHMODE_OK(MODE) (((MODE) == CLK_SWITCHMODE_MANUAL) || ((MODE) == CLK_SWITCHMODE_AUTO)) + +/** + * @brief Macros used by the assert function in order to check the current clock state. + */ +#define IS_CLK_CURRENTCLOCKSTATE_OK(STATE) (((STATE) == CLK_CURRENTCLOCKSTATE_DISABLE) ||\ + ((STATE) == CLK_CURRENTCLOCKSTATE_ENABLE)) + +/** + * @brief Macros used by the assert function in order to check the CSS configuration. + */ +#define IS_CLK_CSSCONFIG_OK(CSSVALUE) (((CSSVALUE) == CLK_CSSCONFIG_ENABLEWITHIT) ||\ + ((CSSVALUE) == CLK_CSSCONFIG_ENABLE) ||\ + ((CSSVALUE) == CLK_CSSCONFIG_DISABLE)) + +/** + * @brief Macros used by the assert function in order to check the different clock sources. + */ +#define IS_CLK_SOURCE_OK(SOURCE) (((SOURCE) == CLK_SOURCE_HSI) ||\ + ((SOURCE) == CLK_SOURCE_LSI) ||\ + ((SOURCE) == CLK_SOURCE_HSE)) + +/** + * @brief Macros used by the assert function in order to check the different HSI trimming values. + */ +#define IS_CLK_HSITRIMVALUE_OK(TRIMVALUE) (((TRIMVALUE) == CLK_HSITRIMVALUE_0) ||\ + ((TRIMVALUE) == CLK_HSITRIMVALUE_1) ||\ + ((TRIMVALUE) == CLK_HSITRIMVALUE_2) ||\ + ((TRIMVALUE) == CLK_HSITRIMVALUE_3) ||\ + ((TRIMVALUE) == CLK_HSITRIMVALUE_4) ||\ + ((TRIMVALUE) == CLK_HSITRIMVALUE_5) ||\ + ((TRIMVALUE) == CLK_HSITRIMVALUE_6) ||\ + ((TRIMVALUE) == CLK_HSITRIMVALUE_7)) + +/** + * @brief Macros used by the assert function in order to check the different clocks to output. + */ +#define IS_CLK_OUTPUT_OK(OUTPUT) (((OUTPUT) == CLK_OUTPUT_HSI) ||\ + ((OUTPUT) == CLK_OUTPUT_HSE) ||\ + ((OUTPUT) == CLK_OUTPUT_LSI) ||\ + ((OUTPUT) == CLK_OUTPUT_CPU) ||\ + ((OUTPUT) == CLK_OUTPUT_CPUDIV2) ||\ + ((OUTPUT) == CLK_OUTPUT_CPUDIV4) ||\ + ((OUTPUT) == CLK_OUTPUT_CPUDIV8) ||\ + ((OUTPUT) == CLK_OUTPUT_CPUDIV16) ||\ + ((OUTPUT) == CLK_OUTPUT_CPUDIV32) ||\ + ((OUTPUT) == CLK_OUTPUT_CPUDIV64) ||\ + ((OUTPUT) == CLK_OUTPUT_HSIRC) ||\ + ((OUTPUT) == CLK_OUTPUT_MASTER) ||\ + ((OUTPUT) == CLK_OUTPUT_OTHERS)) + +/** + * @brief Macros used by the assert function in order to check the different peripheral's clock. + */ +#define IS_CLK_PERIPHERAL_OK(PERIPHERAL) (((PERIPHERAL) == CLK_PERIPHERAL_I2C) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_SPI) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_UART3) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_UART2) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_UART1) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_TIMER4) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_TIMER2) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_TIMER5) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_TIMER6) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_TIMER3) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_TIMER1) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_CAN) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_ADC) ||\ + ((PERIPHERAL) == CLK_PERIPHERAL_AWU)) + +/** + * @brief Macros used by the assert function in order to check the different clock flags. + */ +#define IS_CLK_FLAG_OK(FLAG) (((FLAG) == CLK_FLAG_LSIRDY) ||\ + ((FLAG) == CLK_FLAG_HSIRDY) ||\ + ((FLAG) == CLK_FLAG_HSERDY) ||\ + ((FLAG) == CLK_FLAG_SWIF) ||\ + ((FLAG) == CLK_FLAG_SWBSY) ||\ + ((FLAG) == CLK_FLAG_CSSD) ||\ + ((FLAG) == CLK_FLAG_AUX) ||\ + ((FLAG) == CLK_FLAG_CCOBSY) ||\ + ((FLAG) == CLK_FLAG_CCORDY)) + +/** + * @brief Macros used by the assert function in order to check the different clock IT pending bits. + */ +#define IS_CLK_IT_OK(IT) (((IT) == CLK_IT_CSSD) || ((IT) == CLK_IT_SWIF)) + +/** + * @brief Macros used by the assert function in order to check the different HSI prescaler values. + */ +#define IS_CLK_HSIPRESCALER_OK(PRESCALER) (((PRESCALER) == CLK_PRESCALER_HSIDIV1) ||\ + ((PRESCALER) == CLK_PRESCALER_HSIDIV2) ||\ + ((PRESCALER) == CLK_PRESCALER_HSIDIV4) ||\ + ((PRESCALER) == CLK_PRESCALER_HSIDIV8)) + +/** + * @brief Macros used by the assert function in order to check the different clock prescaler values. + */ +#define IS_CLK_PRESCALER_OK(PRESCALER) (((PRESCALER) == CLK_PRESCALER_HSIDIV1) ||\ + ((PRESCALER) == CLK_PRESCALER_HSIDIV2) ||\ + ((PRESCALER) == CLK_PRESCALER_HSIDIV4) ||\ + ((PRESCALER) == CLK_PRESCALER_HSIDIV8) ||\ + ((PRESCALER) == CLK_PRESCALER_CPUDIV1) ||\ + ((PRESCALER) == CLK_PRESCALER_CPUDIV2) ||\ + ((PRESCALER) == CLK_PRESCALER_CPUDIV4) ||\ + ((PRESCALER) == CLK_PRESCALER_CPUDIV8) ||\ + ((PRESCALER) == CLK_PRESCALER_CPUDIV16) ||\ + ((PRESCALER) == CLK_PRESCALER_CPUDIV32) ||\ + ((PRESCALER) == CLK_PRESCALER_CPUDIV64) ||\ + ((PRESCALER) == CLK_PRESCALER_CPUDIV128)) + +/** + * @brief Macros used by the assert function in order to check the different SWIM dividers values. + */ +#define IS_CLK_SWIMDIVIDER_OK(SWIMDIVIDER) (((SWIMDIVIDER) == CLK_SWIMDIVIDER_2) || ((SWIMDIVIDER) == CLK_SWIMDIVIDER_OTHER)) + +/** + * @} + */ + +/** @addtogroup CLK_Exported_functions + * @{ + */ +void CLK_DeInit(void); +void CLK_HSECmd(FunctionalState NewState); +void CLK_HSICmd(FunctionalState NewState); +void CLK_LSICmd(FunctionalState NewState); +void CLK_CCOCmd(FunctionalState NewState); +void CLK_ClockSwitchCmd(FunctionalState NewState); +void CLK_FastHaltWakeUpCmd(FunctionalState NewState); +void CLK_SlowActiveHaltWakeUpCmd(FunctionalState NewState); +void CLK_PeripheralClockConfig(CLK_Peripheral_TypeDef CLK_Peripheral, FunctionalState NewState); +ErrorStatus CLK_ClockSwitchConfig(CLK_SwitchMode_TypeDef CLK_SwitchMode, CLK_Source_TypeDef CLK_NewClock, FunctionalState ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState); +void CLK_HSIPrescalerConfig(CLK_Prescaler_TypeDef HSIPrescaler); +void CLK_CCOConfig(CLK_Output_TypeDef CLK_CCO); +void CLK_ITConfig(CLK_IT_TypeDef CLK_IT, FunctionalState NewState); +void CLK_SYSCLKConfig(CLK_Prescaler_TypeDef CLK_Prescaler); +void CLK_SWIMConfig(CLK_SWIMDivider_TypeDef CLK_SWIMDivider); +void CLK_ClockSecuritySystemEnable(void); +void CLK_SYSCLKEmergencyClear(void); +void CLK_AdjustHSICalibrationValue(CLK_HSITrimValue_TypeDef CLK_HSICalibrationValue); +uint32_t CLK_GetClockFreq(void); +CLK_Source_TypeDef CLK_GetSYSCLKSource(void); +FlagStatus CLK_GetFlagStatus(CLK_Flag_TypeDef CLK_FLAG); +ITStatus CLK_GetITStatus(CLK_IT_TypeDef CLK_IT); +void CLK_ClearITPendingBit(CLK_IT_TypeDef CLK_IT); + +/** + * @} + */ +#endif /* __STM8S_CLK_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_exti.h b/4_EXT_INT_1PORT/lib/inc/stm8s_exti.h new file mode 100644 index 0000000..6522bbd --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_exti.h @@ -0,0 +1,134 @@ +/** + ****************************************************************************** + * @file stm8s_exti.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the EXTI peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_EXTI_H +#define __STM8S_EXTI_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup EXTI_Exported_Types + * @{ + */ + +/** + * @brief EXTI Sensitivity values for PORTA to PORTE + */ +typedef enum { + EXTI_SENSITIVITY_FALL_LOW = (uint8_t)0x00, /*!< Interrupt on Falling edge and Low level */ + EXTI_SENSITIVITY_RISE_ONLY = (uint8_t)0x01, /*!< Interrupt on Rising edge only */ + EXTI_SENSITIVITY_FALL_ONLY = (uint8_t)0x02, /*!< Interrupt on Falling edge only */ + EXTI_SENSITIVITY_RISE_FALL = (uint8_t)0x03 /*!< Interrupt on Rising and Falling edges */ +} EXTI_Sensitivity_TypeDef; + +/** + * @brief EXTI Sensitivity values for TLI + */ +typedef enum { + EXTI_TLISENSITIVITY_FALL_ONLY = (uint8_t)0x00, /*!< Top Level Interrupt on Falling edge only */ + EXTI_TLISENSITIVITY_RISE_ONLY = (uint8_t)0x04 /*!< Top Level Interrupt on Rising edge only */ +} EXTI_TLISensitivity_TypeDef; + +/** + * @brief EXTI PortNum possible values + */ +typedef enum { + EXTI_PORT_GPIOA = (uint8_t)0x00, /*!< GPIO Port A */ + EXTI_PORT_GPIOB = (uint8_t)0x01, /*!< GPIO Port B */ + EXTI_PORT_GPIOC = (uint8_t)0x02, /*!< GPIO Port C */ + EXTI_PORT_GPIOD = (uint8_t)0x03, /*!< GPIO Port D */ + EXTI_PORT_GPIOE = (uint8_t)0x04 /*!< GPIO Port E */ +} EXTI_Port_TypeDef; + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup EXTI_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function in order to check the different sensitivity values for PORTA to PORTE. + */ +#define IS_EXTI_SENSITIVITY_OK(SensitivityValue) \ + (((SensitivityValue) == EXTI_SENSITIVITY_FALL_LOW) || \ + ((SensitivityValue) == EXTI_SENSITIVITY_RISE_ONLY) || \ + ((SensitivityValue) == EXTI_SENSITIVITY_FALL_ONLY) || \ + ((SensitivityValue) == EXTI_SENSITIVITY_RISE_FALL)) + +/** + * @brief Macro used by the assert function in order to check the different sensitivity values for TLI. + */ +#define IS_EXTI_TLISENSITIVITY_OK(SensitivityValue) \ + (((SensitivityValue) == EXTI_TLISENSITIVITY_FALL_ONLY) || \ + ((SensitivityValue) == EXTI_TLISENSITIVITY_RISE_ONLY)) + +/** + * @brief Macro used by the assert function in order to check the different Port values + */ +#define IS_EXTI_PORT_OK(PORT) \ + (((PORT) == EXTI_PORT_GPIOA) ||\ + ((PORT) == EXTI_PORT_GPIOB) ||\ + ((PORT) == EXTI_PORT_GPIOC) ||\ + ((PORT) == EXTI_PORT_GPIOD) ||\ + ((PORT) == EXTI_PORT_GPIOE)) + +/** + * @brief Macro used by the assert function in order to check the different values of the EXTI PinMask + */ +#define IS_EXTI_PINMASK_OK(PinMask) ((((PinMask) & (uint8_t)0x00) == (uint8_t)0x00) && ((PinMask) != (uint8_t)0x00)) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup EXTI_Exported_Functions + * @{ + */ + +void EXTI_DeInit(void); +void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue); +void EXTI_SetTLISensitivity(EXTI_TLISensitivity_TypeDef SensitivityValue); +EXTI_Sensitivity_TypeDef EXTI_GetExtIntSensitivity(EXTI_Port_TypeDef Port); +EXTI_TLISensitivity_TypeDef EXTI_GetTLISensitivity(void); + +/** + * @} + */ + +#endif /* __STM8S_EXTI_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_flash.h b/4_EXT_INT_1PORT/lib/inc/stm8s_flash.h new file mode 100644 index 0000000..f36e985 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_flash.h @@ -0,0 +1,300 @@ +/** + ****************************************************************************** + * @file stm8s_flash.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the FLASH peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_FLASH_H +#define __STM8S_FLASH_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported constants --------------------------------------------------------*/ + +/** @addtogroup FLASH_Exported_Constants + * @{ + */ + +#define FLASH_PROG_START_PHYSICAL_ADDRESS ((uint32_t)0x008000) /*!< Program memory: start address */ + +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF52Ax) || defined (STM8AF62Ax) + #define FLASH_PROG_END_PHYSICAL_ADDRESS ((uint32_t)0x027FFF) /*!< Program memory: end address */ + #define FLASH_PROG_BLOCKS_NUMBER ((uint16_t)1024) /*!< Program memory: total number of blocks */ + #define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000) /*!< Data EEPROM memory: start address */ + #define FLASH_DATA_END_PHYSICAL_ADDRESS ((uint32_t)0x0047FF) /*!< Data EEPROM memory: end address */ + #define FLASH_DATA_BLOCKS_NUMBER ((uint16_t)16) /*!< Data EEPROM memory: total number of blocks */ + #define FLASH_BLOCK_SIZE ((uint8_t)128) /*!< Number of bytes in a block (common for Program and Data memories) */ +#endif /* STM8S208, STM8S207, STM8S007, STM8AF52Ax, STM8AF62Ax */ + +#if defined(STM8S105) || defined(STM8S005) || defined(STM8AF626x) + #define FLASH_PROG_END_PHYSICAL_ADDRESS ((uint32_t)0xFFFF) /*!< Program memory: end address */ + #define FLASH_PROG_BLOCKS_NUMBER ((uint16_t)256) /*!< Program memory: total number of blocks */ + #define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000) /*!< Data EEPROM memory: start address */ + #define FLASH_DATA_END_PHYSICAL_ADDRESS ((uint32_t)0x0043FF) /*!< Data EEPROM memory: end address */ + #define FLASH_DATA_BLOCKS_NUMBER ((uint16_t)8) /*!< Data EEPROM memory: total number of blocks */ + #define FLASH_BLOCK_SIZE ((uint8_t)128) /*!< Number of bytes in a block (common for Program and Data memories) */ +#endif /* STM8S105 or STM8AF626x */ + +#if defined(STM8S103) || defined(STM8S003) || defined(STM8S903) || defined(STM8AF622x) + #define FLASH_PROG_END_PHYSICAL_ADDRESS ((uint32_t)0x9FFF) /*!< Program memory: end address */ + #define FLASH_PROG_BLOCKS_NUMBER ((uint16_t)128) /*!< Program memory: total number of blocks */ + #define FLASH_DATA_START_PHYSICAL_ADDRESS ((uint32_t)0x004000) /*!< Data EEPROM memory: start address */ + #define FLASH_DATA_END_PHYSICAL_ADDRESS ((uint32_t)0x00427F) /*!< Data EEPROM memory: end address */ + #define FLASH_DATA_BLOCKS_NUMBER ((uint16_t)10) /*!< Data EEPROM memory: total number of blocks */ + #define FLASH_BLOCK_SIZE ((uint8_t)64) /*!< Number of bytes in a block (common for Program and Data memories) */ +#endif /* STM8S103 or STM8S003 or STM8S903 or STM8AF622x*/ + +#define FLASH_RASS_KEY1 ((uint8_t)0x56) /*!< First RASS key */ +#define FLASH_RASS_KEY2 ((uint8_t)0xAE) /*!< Second RASS key */ + +#define OPTION_BYTE_START_PHYSICAL_ADDRESS ((uint16_t)0x4800) +#define OPTION_BYTE_END_PHYSICAL_ADDRESS ((uint16_t)0x487F) +#define FLASH_OPTIONBYTE_ERROR ((uint16_t)0x5555) /*!< Error code option byte + (if value read is not equal to complement value read) */ +/** + * @} + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup FLASH_Exported_Types + * @{ + */ + +/** + * @brief FLASH Memory types + */ +typedef enum { + FLASH_MEMTYPE_PROG = (uint8_t)0xFD, /*!< Program memory */ + FLASH_MEMTYPE_DATA = (uint8_t)0xF7 /*!< Data EEPROM memory */ +} FLASH_MemType_TypeDef; + +/** + * @brief FLASH programming modes + */ +typedef enum { + FLASH_PROGRAMMODE_STANDARD = (uint8_t)0x00, /*!< Standard programming mode */ + FLASH_PROGRAMMODE_FAST = (uint8_t)0x10 /*!< Fast programming mode */ +} FLASH_ProgramMode_TypeDef; + +/** + * @brief FLASH fixed programming time + */ +typedef enum { + FLASH_PROGRAMTIME_STANDARD = (uint8_t)0x00, /*!< Standard programming time fixed at 1/2 tprog */ + FLASH_PROGRAMTIME_TPROG = (uint8_t)0x01 /*!< Programming time fixed at tprog */ +} FLASH_ProgramTime_TypeDef; + +/** + * @brief FLASH Low Power mode select + */ +typedef enum { + FLASH_LPMODE_POWERDOWN = (uint8_t)0x04, /*!< HALT: Power-Down / ACTIVE-HALT: Power-Down */ + FLASH_LPMODE_STANDBY = (uint8_t)0x08, /*!< HALT: Standby / ACTIVE-HALT: Standby */ + FLASH_LPMODE_POWERDOWN_STANDBY = (uint8_t)0x00, /*!< HALT: Power-Down / ACTIVE-HALT: Standby */ + FLASH_LPMODE_STANDBY_POWERDOWN = (uint8_t)0x0C /*!< HALT: Standby / ACTIVE-HALT: Power-Down */ +} +FLASH_LPMode_TypeDef; + +/** + * @brief FLASH status of the last operation + */ +typedef enum { +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ + defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined(STM8AF626x) + FLASH_STATUS_END_HIGH_VOLTAGE = (uint8_t)0x40, /*!< End of high voltage */ +#endif /* STM8S208, STM8S207, STM8S105, STM8AF62Ax, STM8AF52Ax, STM8AF626x */ + FLASH_STATUS_SUCCESSFUL_OPERATION = (uint8_t)0x04, /*!< End of operation flag */ + FLASH_STATUS_TIMEOUT = (uint8_t)0x02, /*!< Time out error */ + FLASH_STATUS_WRITE_PROTECTION_ERROR = (uint8_t)0x01 /*!< Write attempted to protected page */ +} FLASH_Status_TypeDef; + +/** + * @brief FLASH flags definition + * - Warning : FLAG value = mapping position register + */ +typedef enum { +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ + defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined(STM8AF626x) + FLASH_FLAG_HVOFF = (uint8_t)0x40, /*!< End of high voltage flag */ +#endif /* STM8S208, STM8S207, STM8S105, STM8AF62Ax, STM8AF52Ax, STM8AF626x */ + FLASH_FLAG_DUL = (uint8_t)0x08, /*!< Data EEPROM unlocked flag */ + FLASH_FLAG_EOP = (uint8_t)0x04, /*!< End of programming (write or erase operation) flag */ + FLASH_FLAG_PUL = (uint8_t)0x02, /*!< Flash Program memory unlocked flag */ + FLASH_FLAG_WR_PG_DIS = (uint8_t)0x01 /*!< Write attempted to protected page flag */ +} FLASH_Flag_TypeDef; + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ + +/** + * @brief Macros used by the assert function in order to check the different functions parameters. + * @addtogroup FLASH_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function in order to check the different sensitivity values for the flash program Address + */ + +#define IS_FLASH_PROG_ADDRESS_OK(ADDRESS) (((ADDRESS) >= FLASH_PROG_START_PHYSICAL_ADDRESS) && \ + ((ADDRESS) <= FLASH_PROG_END_PHYSICAL_ADDRESS)) + +/** + * @brief Macro used by the assert function in order to check the different sensitivity values for the data eeprom Address + */ + +#define IS_FLASH_DATA_ADDRESS_OK(ADDRESS) (((ADDRESS) >= FLASH_DATA_START_PHYSICAL_ADDRESS) && \ + ((ADDRESS) <= FLASH_DATA_END_PHYSICAL_ADDRESS)) + +/** + * @brief Macro used by the assert function in order to check the different sensitivity values for the data eeprom and flash program Address + */ +#define IS_FLASH_ADDRESS_OK(ADDRESS)((((ADDRESS) >= FLASH_PROG_START_PHYSICAL_ADDRESS) && ((ADDRESS) <= FLASH_PROG_END_PHYSICAL_ADDRESS)) || \ + (((ADDRESS) >= FLASH_DATA_START_PHYSICAL_ADDRESS) && ((ADDRESS) <= FLASH_DATA_END_PHYSICAL_ADDRESS))) + +/** + * @brief Macro used by the assert function in order to check the different sensitivity values for the flash program Block number + */ +#define IS_FLASH_PROG_BLOCK_NUMBER_OK(BLOCKNUM) ((BLOCKNUM) < FLASH_PROG_BLOCKS_NUMBER) + +/** + * @brief Macro used by the assert function in order to check the different sensitivity values for the data eeprom Block number + */ +#define IS_FLASH_DATA_BLOCK_NUMBER_OK(BLOCKNUM) ((BLOCKNUM) < FLASH_DATA_BLOCKS_NUMBER) + +/** + * @brief Macro used by the assert function in order to check the different sensitivity values for the flash memory type + */ + +#define IS_MEMORY_TYPE_OK(MEMTYPE) (((MEMTYPE) == FLASH_MEMTYPE_PROG) || \ + ((MEMTYPE) == FLASH_MEMTYPE_DATA)) + +/** + * @brief Macro used by the assert function in order to check the different sensitivity values for the flash program mode + */ + +#define IS_FLASH_PROGRAM_MODE_OK(MODE) (((MODE) == FLASH_PROGRAMMODE_STANDARD) || \ + ((MODE) == FLASH_PROGRAMMODE_FAST)) + +/** + * @brief Macro used by the assert function in order to check the program time mode + */ + +#define IS_FLASH_PROGRAM_TIME_OK(TIME) (((TIME) == FLASH_PROGRAMTIME_STANDARD) || \ + ((TIME) == FLASH_PROGRAMTIME_TPROG)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the low power mode + */ + +#define IS_FLASH_LOW_POWER_MODE_OK(LPMODE) (((LPMODE) == FLASH_LPMODE_POWERDOWN) || \ + ((LPMODE) == FLASH_LPMODE_STANDBY) || \ + ((LPMODE) == FLASH_LPMODE_POWERDOWN_STANDBY) || \ + ((LPMODE) == FLASH_LPMODE_STANDBY_POWERDOWN)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the option bytes Address + */ +#define IS_OPTION_BYTE_ADDRESS_OK(ADDRESS) (((ADDRESS) >= OPTION_BYTE_START_PHYSICAL_ADDRESS) && \ + ((ADDRESS) <= OPTION_BYTE_END_PHYSICAL_ADDRESS)) + + +/** + * @brief Macro used by the assert function in order to check the different flags values + */ +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ + defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined(STM8AF626x) + #define IS_FLASH_FLAGS_OK(FLAG) (((FLAG) == FLASH_FLAG_HVOFF) || \ + ((FLAG) == FLASH_FLAG_DUL) || \ + ((FLAG) == FLASH_FLAG_EOP) || \ + ((FLAG) == FLASH_FLAG_PUL) || \ + ((FLAG) == FLASH_FLAG_WR_PG_DIS)) +#else /* STM8S103, STM8S903, STM8AF622x */ + #define IS_FLASH_FLAGS_OK(FLAG) (((FLAG) == FLASH_FLAG_DUL) || \ + ((FLAG) == FLASH_FLAG_EOP) || \ + ((FLAG) == FLASH_FLAG_PUL) || \ + ((FLAG) == FLASH_FLAG_WR_PG_DIS)) +#endif /* STM8S208, STM8S207, STM8S105, STM8AF62Ax, STM8AF52Ax, STM8AF626x */ +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup FLASH_Exported_Functions + * @{ + */ +void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType); +void FLASH_Lock(FLASH_MemType_TypeDef FLASH_MemType); +void FLASH_DeInit(void); +void FLASH_ITConfig(FunctionalState NewState); +void FLASH_EraseByte(uint32_t Address); +void FLASH_ProgramByte(uint32_t Address, uint8_t Data); +uint8_t FLASH_ReadByte(uint32_t Address); +void FLASH_ProgramWord(uint32_t Address, uint32_t Data); +uint16_t FLASH_ReadOptionByte(uint16_t Address); +void FLASH_ProgramOptionByte(uint16_t Address, uint8_t Data); +void FLASH_EraseOptionByte(uint16_t Address); +void FLASH_SetLowPowerMode(FLASH_LPMode_TypeDef FLASH_LPMode); +void FLASH_SetProgrammingTime(FLASH_ProgramTime_TypeDef FLASH_ProgTime); +FLASH_LPMode_TypeDef FLASH_GetLowPowerMode(void); +FLASH_ProgramTime_TypeDef FLASH_GetProgrammingTime(void); +uint32_t FLASH_GetBootSize(void); +FlagStatus FLASH_GetFlagStatus(FLASH_Flag_TypeDef FLASH_FLAG); + +/** +@code + All the functions declared below must be executed from RAM exclusively, except + for the FLASH_WaitForLastOperation function which can be executed from Flash. + + Steps of the execution from RAM differs from one toolchain to another. + for more details refer to stm8s_flash.c file. + + To enable execution from RAM you can either uncomment the following define + in the stm8s.h file or define it in your toolchain compiler preprocessor + - #define RAM_EXECUTION (1) + +@endcode +*/ +IN_RAM(void FLASH_EraseBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType)); +IN_RAM(void FLASH_ProgramBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType, + FLASH_ProgramMode_TypeDef FLASH_ProgMode, uint8_t *Buffer)); +IN_RAM(FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType)); + +/** + * @} + */ + +#endif /*__STM8S_FLASH_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_gpio.h b/4_EXT_INT_1PORT/lib/inc/stm8s_gpio.h new file mode 100644 index 0000000..9aba121 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_gpio.h @@ -0,0 +1,156 @@ +/** + ****************************************************************************** + * @file stm8s_gpio.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the GPIO peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_GPIO_H +#define __STM8S_GPIO_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported variables ------------------------------------------------------- */ +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup GPIO_Exported_Types + * @{ + */ + +/** + * @brief GPIO modes + * + * Bits definitions: + * - Bit 7: 0 = INPUT mode + * 1 = OUTPUT mode + * 1 = PULL-UP (input) or PUSH-PULL (output) + * - Bit 5: 0 = No external interrupt (input) or No slope control (output) + * 1 = External interrupt (input) or Slow control enabled (output) + * - Bit 4: 0 = Low level (output) + * 1 = High level (output push-pull) or HI-Z (output open-drain) + */ +typedef enum +{ + GPIO_MODE_IN_FL_NO_IT = (uint8_t)0x00, /*!< Input floating, no external interrupt */ + GPIO_MODE_IN_PU_NO_IT = (uint8_t)0x40, /*!< Input pull-up, no external interrupt */ + GPIO_MODE_IN_FL_IT = (uint8_t)0x20, /*!< Input floating, external interrupt */ + GPIO_MODE_IN_PU_IT = (uint8_t)0x60, /*!< Input pull-up, external interrupt */ + GPIO_MODE_OUT_OD_LOW_FAST = (uint8_t)0xA0, /*!< Output open-drain, low level, 10MHz */ + GPIO_MODE_OUT_PP_LOW_FAST = (uint8_t)0xE0, /*!< Output push-pull, low level, 10MHz */ + GPIO_MODE_OUT_OD_LOW_SLOW = (uint8_t)0x80, /*!< Output open-drain, low level, 2MHz */ + GPIO_MODE_OUT_PP_LOW_SLOW = (uint8_t)0xC0, /*!< Output push-pull, low level, 2MHz */ + GPIO_MODE_OUT_OD_HIZ_FAST = (uint8_t)0xB0, /*!< Output open-drain, high-impedance level,10MHz */ + GPIO_MODE_OUT_PP_HIGH_FAST = (uint8_t)0xF0, /*!< Output push-pull, high level, 10MHz */ + GPIO_MODE_OUT_OD_HIZ_SLOW = (uint8_t)0x90, /*!< Output open-drain, high-impedance level, 2MHz */ + GPIO_MODE_OUT_PP_HIGH_SLOW = (uint8_t)0xD0 /*!< Output push-pull, high level, 2MHz */ +}GPIO_Mode_TypeDef; + +/** + * @brief Definition of the GPIO pins. Used by the @ref GPIO_Init function in + * order to select the pins to be initialized. + */ + +typedef enum +{ + GPIO_PIN_0 = ((uint8_t)0x01), /*!< Pin 0 selected */ + GPIO_PIN_1 = ((uint8_t)0x02), /*!< Pin 1 selected */ + GPIO_PIN_2 = ((uint8_t)0x04), /*!< Pin 2 selected */ + GPIO_PIN_3 = ((uint8_t)0x08), /*!< Pin 3 selected */ + GPIO_PIN_4 = ((uint8_t)0x10), /*!< Pin 4 selected */ + GPIO_PIN_5 = ((uint8_t)0x20), /*!< Pin 5 selected */ + GPIO_PIN_6 = ((uint8_t)0x40), /*!< Pin 6 selected */ + GPIO_PIN_7 = ((uint8_t)0x80), /*!< Pin 7 selected */ + GPIO_PIN_LNIB = ((uint8_t)0x0F), /*!< Low nibble pins selected */ + GPIO_PIN_HNIB = ((uint8_t)0xF0), /*!< High nibble pins selected */ + GPIO_PIN_ALL = ((uint8_t)0xFF) /*!< All pins selected */ +}GPIO_Pin_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/* Exported macros -----------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup GPIO_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different functions parameters. + */ + +/** + * @brief Macro used by the assert function in order to check the different + * values of GPIOMode_TypeDef. + */ +#define IS_GPIO_MODE_OK(MODE) \ + (((MODE) == GPIO_MODE_IN_FL_NO_IT) || \ + ((MODE) == GPIO_MODE_IN_PU_NO_IT) || \ + ((MODE) == GPIO_MODE_IN_FL_IT) || \ + ((MODE) == GPIO_MODE_IN_PU_IT) || \ + ((MODE) == GPIO_MODE_OUT_OD_LOW_FAST) || \ + ((MODE) == GPIO_MODE_OUT_PP_LOW_FAST) || \ + ((MODE) == GPIO_MODE_OUT_OD_LOW_SLOW) || \ + ((MODE) == GPIO_MODE_OUT_PP_LOW_SLOW) || \ + ((MODE) == GPIO_MODE_OUT_OD_HIZ_FAST) || \ + ((MODE) == GPIO_MODE_OUT_PP_HIGH_FAST) || \ + ((MODE) == GPIO_MODE_OUT_OD_HIZ_SLOW) || \ + ((MODE) == GPIO_MODE_OUT_PP_HIGH_SLOW)) + +/** + * @brief Macro used by the assert function in order to check the different + * values of GPIO_Pins. + */ +#define IS_GPIO_PIN_OK(PIN) ((PIN) != (uint8_t)0x00) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ +/** @addtogroup GPIO_Exported_Functions + * @{ + */ + +void GPIO_DeInit(GPIO_TypeDef* GPIOx); +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode); +void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal); +void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); +void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); +void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); +uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx); +uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); +BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin); +void GPIO_ExternalPullUpConfig(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, FunctionalState NewState); +/** + * @} + */ + +#endif /* __STM8L_GPIO_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_i2c.h b/4_EXT_INT_1PORT/lib/inc/stm8s_i2c.h new file mode 100644 index 0000000..eb05487 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_i2c.h @@ -0,0 +1,632 @@ +/** + ****************************************************************************** + * @file stm8s_i2c.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the I2C peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_I2C_H +#define __STM8S_I2C_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup I2C_Exported_Types + * @{ + */ + +/** + * @brief I2C duty cycle (fast mode only) + */ +typedef enum +{ + I2C_DUTYCYCLE_2 = (uint8_t)0x00, /*!< Fast mode Tlow/THigh = 2 */ + I2C_DUTYCYCLE_16_9 = (uint8_t)0x40 /*!< Fast mode Tlow/Thigh = 16/9 */ +} I2C_DutyCycle_TypeDef; + +/** + * @brief I2C Acknowledgement configuration + */ +typedef enum +{ + I2C_ACK_NONE = (uint8_t)0x00, /*!< No acknowledge */ + I2C_ACK_CURR = (uint8_t)0x01, /*!< Acknowledge on the current byte */ + I2C_ACK_NEXT = (uint8_t)0x02 /*!< Acknowledge on the next byte */ +} I2C_Ack_TypeDef; + +/** + * @brief I2C Addressing Mode (slave mode only) + */ +typedef enum +{ + I2C_ADDMODE_7BIT = (uint8_t)0x00, /*!< 7-bit slave address (10-bit address not acknowledged) */ + I2C_ADDMODE_10BIT = (uint8_t)0x80 /*!< 10-bit slave address (7-bit address not acknowledged) */ +} I2C_AddMode_TypeDef; + +/** + * @brief I2C Interrupt sources + * Warning: the values correspond to the bit position in the ITR register + */ +typedef enum +{ + I2C_IT_ERR = (uint8_t)0x01, /*!< Error Interruption */ + I2C_IT_EVT = (uint8_t)0x02, /*!< Event Interruption */ + I2C_IT_BUF = (uint8_t)0x04 /*!< Buffer Interruption */ +} I2C_IT_TypeDef; + +/** + * @brief I2C transfer direction + * Warning: the values correspond to the ADD0 bit position in the OARL register + */ +typedef enum +{ + I2C_DIRECTION_TX = (uint8_t)0x00, /*!< Transmission direction */ + I2C_DIRECTION_RX = (uint8_t)0x01 /*!< Reception direction */ +} I2C_Direction_TypeDef; + +/** + * @brief I2C Flags + * @brief Elements values convention: 0xXXYY + * X = SRx registers index + * X = 1 : SR1 + * X = 2 : SR2 + * X = 3 : SR3 + * Y = Flag mask in the register + */ + +typedef enum +{ + /* SR1 register flags */ + I2C_FLAG_TXEMPTY = (uint16_t)0x0180, /*!< Transmit Data Register Empty flag */ + I2C_FLAG_RXNOTEMPTY = (uint16_t)0x0140, /*!< Read Data Register Not Empty flag */ + I2C_FLAG_STOPDETECTION = (uint16_t)0x0110, /*!< Stop detected flag */ + I2C_FLAG_HEADERSENT = (uint16_t)0x0108, /*!< 10-bit Header sent flag */ + I2C_FLAG_TRANSFERFINISHED = (uint16_t)0x0104, /*!< Data Byte Transfer Finished flag */ + I2C_FLAG_ADDRESSSENTMATCHED = (uint16_t)0x0102, /*!< Address Sent/Matched (master/slave) flag */ + I2C_FLAG_STARTDETECTION = (uint16_t)0x0101, /*!< Start bit sent flag */ + + /* SR2 register flags */ + I2C_FLAG_WAKEUPFROMHALT = (uint16_t)0x0220, /*!< Wake Up From Halt Flag */ + I2C_FLAG_OVERRUNUNDERRUN = (uint16_t)0x0208, /*!< Overrun/Underrun flag */ + I2C_FLAG_ACKNOWLEDGEFAILURE = (uint16_t)0x0204, /*!< Acknowledge Failure Flag */ + I2C_FLAG_ARBITRATIONLOSS = (uint16_t)0x0202, /*!< Arbitration Loss Flag */ + I2C_FLAG_BUSERROR = (uint16_t)0x0201, /*!< Misplaced Start or Stop condition */ + + /* SR3 register flags */ + I2C_FLAG_GENERALCALL = (uint16_t)0x0310, /*!< General Call header received Flag */ + I2C_FLAG_TRANSMITTERRECEIVER = (uint16_t)0x0304, /*!< Transmitter Receiver Flag */ + I2C_FLAG_BUSBUSY = (uint16_t)0x0302, /*!< Bus Busy Flag */ + I2C_FLAG_MASTERSLAVE = (uint16_t)0x0301 /*!< Master Slave Flag */ +} I2C_Flag_TypeDef; + +/** + * @brief I2C Pending bits + * Elements values convention: 0xXYZZ + * X = SRx registers index + * X = 1 : SR1 + * X = 2 : SR2 + * Y = Position of the corresponding Interrupt + * ZZ = flag mask in the dedicated register(X register) + */ + +typedef enum +{ + /* SR1 register flags */ + I2C_ITPENDINGBIT_TXEMPTY = (uint16_t)0x1680, /*!< Transmit Data Register Empty */ + I2C_ITPENDINGBIT_RXNOTEMPTY = (uint16_t)0x1640, /*!< Read Data Register Not Empty */ + I2C_ITPENDINGBIT_STOPDETECTION = (uint16_t)0x1210, /*!< Stop detected */ + I2C_ITPENDINGBIT_HEADERSENT = (uint16_t)0x1208, /*!< 10-bit Header sent */ + I2C_ITPENDINGBIT_TRANSFERFINISHED = (uint16_t)0x1204, /*!< Data Byte Transfer Finished */ + I2C_ITPENDINGBIT_ADDRESSSENTMATCHED = (uint16_t)0x1202, /*!< Address Sent/Matched (master/slave) */ + I2C_ITPENDINGBIT_STARTDETECTION = (uint16_t)0x1201, /*!< Start bit sent */ + + /* SR2 register flags */ + I2C_ITPENDINGBIT_WAKEUPFROMHALT = (uint16_t)0x2220, /*!< Wake Up From Halt */ + I2C_ITPENDINGBIT_OVERRUNUNDERRUN = (uint16_t)0x2108, /*!< Overrun/Underrun */ + I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE = (uint16_t)0x2104, /*!< Acknowledge Failure */ + I2C_ITPENDINGBIT_ARBITRATIONLOSS = (uint16_t)0x2102, /*!< Arbitration Loss */ + I2C_ITPENDINGBIT_BUSERROR = (uint16_t)0x2101 /*!< Misplaced Start or Stop condition */ +} I2C_ITPendingBit_TypeDef; + +/** + * @brief I2C possible events + * Values convention: 0xXXYY + * XX = Event SR3 corresponding value + * YY = Event SR1 corresponding value + * @note if Event = EV3_2 the rule above does not apply + * YY = Event SR2 corresponding value + */ + +typedef enum +{ + /*======================================== + + 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 */ + I2C_EVENT_MASTER_MODE_SELECT = (uint16_t)0x0301, /*!< 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 */ + I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED = (uint16_t)0x0782, /*!< BUSY, MSL, ADDR, TXE and TRA flags */ + I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED = (uint16_t)0x0302, /*!< BUSY, MSL and ADDR flags */ + /* --EV9 */ + I2C_EVENT_MASTER_MODE_ADDRESS10 = (uint16_t)0x0308, /*!< 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 ensures 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 */ + I2C_EVENT_MASTER_BYTE_RECEIVED = (uint16_t)0x0340, /*!< BUSY, MSL and RXNE flags */ + + /* Master TRANSMITTER mode --------------------------*/ + /* --EV8 */ + I2C_EVENT_MASTER_BYTE_TRANSMITTING = (uint16_t)0x0780, /*!< TRA, BUSY, MSL, TXE flags */ + /* --EV8_2 */ + + I2C_EVENT_MASTER_BYTE_TRANSMITTED = (uint16_t)0x0784, /*!< EV8_2: 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 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 */ + I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED = (uint16_t)0x0202, /*!< BUSY and ADDR flags */ + I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED = (uint16_t)0x0682, /*!< TRA, BUSY, TXE and ADDR flags */ + + /* 2) Case of General Call enabled for the slave */ + I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED = (uint16_t)0x1200, /*!< EV2: GENCALL and BUSY flags */ + + /** + * @brief Communication events + * + * Wait on one of these events when EV1 has already been checked : + * + * - 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 transfer. + * - 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 */ + I2C_EVENT_SLAVE_BYTE_RECEIVED = (uint16_t)0x0240, /*!< BUSY and RXNE flags */ + /* --EV4 */ + I2C_EVENT_SLAVE_STOP_DETECTED = (uint16_t)0x0010, /*!< STOPF flag */ + + /* Slave TRANSMITTER mode -----------------------*/ + /* --EV3 */ + I2C_EVENT_SLAVE_BYTE_TRANSMITTED = (uint16_t)0x0684, /*!< TRA, BUSY, TXE and BTF flags */ + I2C_EVENT_SLAVE_BYTE_TRANSMITTING = (uint16_t)0x0680, /*!< TRA, BUSY and TXE flags */ + /* --EV3_2 */ + I2C_EVENT_SLAVE_ACK_FAILURE = (uint16_t)0x0004 /*!< AF flag */ +} I2C_Event_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/** @addtogroup I2C_Exported_Constants + * @{ + */ +#define I2C_MAX_STANDARD_FREQ ((uint32_t)100000) +#define I2C_MAX_FAST_FREQ ((uint32_t)400000) +#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) + #define I2C_MAX_INPUT_FREQ ((uint8_t)24) +#else + #define I2C_MAX_INPUT_FREQ ((uint8_t)16) +#endif + +/** + *@} + */ + +/* Exported macros -----------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup I2C_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different functions parameters. + */ + +/** + * @brief Macro used by the assert function to check the different I2C duty cycles. + */ +#define IS_I2C_DUTYCYCLE_OK(DUTY) \ + (((DUTY) == I2C_DUTYCYCLE_2) || \ + ((DUTY) == I2C_DUTYCYCLE_16_9)) + +/** + * @brief Macro used by the assert function to check the different acknowledgement configuration + */ +#define IS_I2C_ACK_OK(ACK) \ + (((ACK) == I2C_ACK_NONE) || \ + ((ACK) == I2C_ACK_CURR) || \ + ((ACK) == I2C_ACK_NEXT)) + +/** + * @brief Macro used by the assert function to check the different I2C addressing modes. + */ +#define IS_I2C_ADDMODE_OK(ADDMODE) \ + (((ADDMODE) == I2C_ADDMODE_7BIT) || \ + ((ADDMODE) == I2C_ADDMODE_10BIT)) + +/** + * @brief Macro used by the assert function to check the different I2C interrupt types. + */ +#define IS_I2C_INTERRUPT_OK(IT) \ + (((IT) == I2C_IT_ERR) || \ + ((IT) == I2C_IT_EVT) || \ + ((IT) == I2C_IT_BUF) || \ + ((IT) == (I2C_IT_ERR | I2C_IT_EVT)) || \ + ((IT) == (I2C_IT_ERR | I2C_IT_BUF)) || \ + ((IT) == (I2C_IT_EVT | I2C_IT_BUF)) || \ + ((IT) == (I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR))) +/** + * @brief Macro used by the assert function to check the different I2C communcation direction. + */ +#define IS_I2C_DIRECTION_OK(DIR) \ + (((DIR) == I2C_DIRECTION_TX) || \ + ((DIR) == I2C_DIRECTION_RX)) + +/** + * @brief Macro used by the assert function to check the different I2C flags. + */ +#define IS_I2C_FLAG_OK(FLAG) \ + (((FLAG) == I2C_FLAG_TXEMPTY) || \ + ((FLAG) == I2C_FLAG_RXNOTEMPTY) || \ + ((FLAG) == I2C_FLAG_STOPDETECTION) || \ + ((FLAG) == I2C_FLAG_HEADERSENT) || \ + ((FLAG) == I2C_FLAG_TRANSFERFINISHED) || \ + ((FLAG) == I2C_FLAG_ADDRESSSENTMATCHED) || \ + ((FLAG) == I2C_FLAG_STARTDETECTION) || \ + ((FLAG) == I2C_FLAG_WAKEUPFROMHALT) || \ + ((FLAG) == I2C_FLAG_OVERRUNUNDERRUN) || \ + ((FLAG) == I2C_FLAG_ACKNOWLEDGEFAILURE) || \ + ((FLAG) == I2C_FLAG_ARBITRATIONLOSS) || \ + ((FLAG) == I2C_FLAG_BUSERROR) || \ + ((FLAG) == I2C_FLAG_GENERALCALL) || \ + ((FLAG) == I2C_FLAG_TRANSMITTERRECEIVER) || \ + ((FLAG) == I2C_FLAG_BUSBUSY) || \ + ((FLAG) == I2C_FLAG_MASTERSLAVE)) +/** + * @brief Macro used by the assert function to check the I2C flags to clear. + */ + +#define IS_I2C_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & (uint16_t)0xFD00) == 0x00) \ + && ((uint16_t)(FLAG) != 0x00)) + +/** + * @brief Macro used by the assert function to check the different I2C possible pending bits. + */ +#define IS_I2C_ITPENDINGBIT_OK(ITPENDINGBIT) \ + (((ITPENDINGBIT) == I2C_ITPENDINGBIT_TXEMPTY) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_RXNOTEMPTY) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_STOPDETECTION) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_HEADERSENT) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_TRANSFERFINISHED) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_ADDRESSSENTMATCHED) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_STARTDETECTION) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_WAKEUPFROMHALT) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_OVERRUNUNDERRUN) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_ARBITRATIONLOSS) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_BUSERROR)) + +/** + * @brief Macro used by the assert function to check the different I2C possible + * pending bits to clear by writing 0. + */ +#define IS_I2C_CLEAR_ITPENDINGBIT_OK(ITPENDINGBIT) \ + (((ITPENDINGBIT) == I2C_ITPENDINGBIT_WAKEUPFROMHALT) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_OVERRUNUNDERRUN) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_ARBITRATIONLOSS) || \ + ((ITPENDINGBIT) == I2C_ITPENDINGBIT_BUSERROR)) + +/** + * @brief Macro used by the assert function to check the different I2C possible events. + */ +#define IS_I2C_EVENT_OK(EVENT) (((EVENT) == I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_RECEIVED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_RECEIVED | (uint16_t)I2C_FLAG_GENERALCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_BYTE_TRANSMITTED) || \ + ((EVENT) == (I2C_EVENT_SLAVE_BYTE_TRANSMITTED | (uint16_t)I2C_FLAG_GENERALCALL)) || \ + ((EVENT) == I2C_EVENT_SLAVE_ACK_FAILURE) || \ + ((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)) + +/** + * @brief Macro used by the assert function to check the different I2C possible own address. + */ +#define IS_I2C_OWN_ADDRESS_OK(ADDRESS) \ + ((ADDRESS) <= (uint16_t)0x03FF) + +/* The address must be even */ +#define IS_I2C_ADDRESS_OK(ADD) \ + (((ADD) & (uint8_t)0x01) == (uint8_t)0x00) + +/** + * @brief Macro used by the assert function to check that I2C Input clock frequency must be between 1MHz and 50MHz. + */ +#define IS_I2C_INPUT_CLOCK_FREQ_OK(FREQ) \ + (((FREQ) >= (uint8_t)1) && ((FREQ) <= I2C_MAX_INPUT_FREQ)) + + +/** + * @brief Macro used by the assert function to check that I2C Output clock frequency must be between 1Hz and 400kHz. + */ +#define IS_I2C_OUTPUT_CLOCK_FREQ_OK(FREQ) \ + (((FREQ) >= (uint8_t)1) && ((FREQ) <= I2C_MAX_FAST_FREQ)) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ +/** @addtogroup I2C_Exported_Functions + * @{ + */ + +void I2C_DeInit(void); +void I2C_Init(uint32_t OutputClockFrequencyHz, uint16_t OwnAddress, + I2C_DutyCycle_TypeDef I2C_DutyCycle, I2C_Ack_TypeDef Ack, + I2C_AddMode_TypeDef AddMode, uint8_t InputClockFrequencyMHz ); +void I2C_Cmd(FunctionalState NewState); +void I2C_GeneralCallCmd(FunctionalState NewState); +void I2C_GenerateSTART(FunctionalState NewState); +void I2C_GenerateSTOP(FunctionalState NewState); +void I2C_SoftwareResetCmd(FunctionalState NewState); +void I2C_StretchClockCmd(FunctionalState NewState); +void I2C_AcknowledgeConfig(I2C_Ack_TypeDef Ack); +void I2C_FastModeDutyCycleConfig(I2C_DutyCycle_TypeDef I2C_DutyCycle); +void I2C_ITConfig(I2C_IT_TypeDef I2C_IT, FunctionalState NewState); +uint8_t I2C_ReceiveData(void); +void I2C_Send7bitAddress(uint8_t Address, I2C_Direction_TypeDef Direction); +void I2C_SendData(uint8_t Data); +/** + * @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, SR2 and SR3) 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 + * (RM0016). + * - 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). + * - I2C_IRQHandler() which is called when the I2C interrupts occur. + * - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into the + * I2Cx_IRQHandler() function in order to determine which error occurred. + * - 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 SR1 + * & SR3 status registers in a single word (uint16_t) (Status Register 3 value + * is shifted left by 8 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 (stm8s_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_Event_TypeDef I2C_Event); +/** + * + * 2) Advanced state monitoring + ******************************************************************************* + */ +I2C_Event_TypeDef I2C_GetLastEvent(void); +/** + * + * 3) Flag-based state monitoring + ******************************************************************************* + */ +FlagStatus I2C_GetFlagStatus(I2C_Flag_TypeDef I2C_Flag); +/** + * + ******************************************************************************* + */ +void I2C_ClearFlag(I2C_Flag_TypeDef I2C_FLAG); +ITStatus I2C_GetITStatus(I2C_ITPendingBit_TypeDef I2C_ITPendingBit); +void I2C_ClearITPendingBit(I2C_ITPendingBit_TypeDef I2C_ITPendingBit); + + +/** + * @} + */ + +#endif /* __STM8S_I2C_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_itc.h b/4_EXT_INT_1PORT/lib/inc/stm8s_itc.h new file mode 100644 index 0000000..f1590d1 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_itc.h @@ -0,0 +1,186 @@ +/** + ****************************************************************************** + * @file stm8s_itc.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the ITC peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_ITC_H +#define __STM8S_ITC_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup ITC_Exported_Types + * @{ + */ + +/** + * @brief ITC Interrupt Lines selection + */ +typedef enum { + ITC_IRQ_TLI = (uint8_t)0, /*!< Software interrupt */ + ITC_IRQ_AWU = (uint8_t)1, /*!< Auto wake up from halt interrupt */ + ITC_IRQ_CLK = (uint8_t)2, /*!< Clock controller interrupt */ + ITC_IRQ_PORTA = (uint8_t)3, /*!< Port A external interrupts */ + ITC_IRQ_PORTB = (uint8_t)4, /*!< Port B external interrupts */ + ITC_IRQ_PORTC = (uint8_t)5, /*!< Port C external interrupts */ + ITC_IRQ_PORTD = (uint8_t)6, /*!< Port D external interrupts */ + ITC_IRQ_PORTE = (uint8_t)7, /*!< Port E external interrupts */ + +#if defined(STM8S208) || defined(STM8AF52Ax) + ITC_IRQ_CAN_RX = (uint8_t)8, /*!< beCAN RX interrupt */ + ITC_IRQ_CAN_TX = (uint8_t)9, /*!< beCAN TX/ER/SC interrupt */ +#endif /*STM8S208 or STM8AF52Ax */ + +#if defined(STM8S903) || defined(STM8AF622x) + ITC_IRQ_PORTF = (uint8_t)8, /*!< Port F external interrupts */ +#endif /*STM8S903 or STM8AF622x */ + + ITC_IRQ_SPI = (uint8_t)10, /*!< SPI interrupt */ + ITC_IRQ_TIM1_OVF = (uint8_t)11, /*!< TIM1 update/overflow/underflow/trigger/ + break interrupt*/ + ITC_IRQ_TIM1_CAPCOM = (uint8_t)12, /*!< TIM1 capture/compare interrupt */ + +#if defined(STM8S903) || defined(STM8AF622x) + ITC_IRQ_TIM5_OVFTRI = (uint8_t)13, /*!< TIM5 update/overflow/underflow/trigger/ + interrupt */ + ITC_IRQ_TIM5_CAPCOM = (uint8_t)14, /*!< TIM5 capture/compare interrupt */ +#else + ITC_IRQ_TIM2_OVF = (uint8_t)13, /*!< TIM2 update /overflow interrupt */ + ITC_IRQ_TIM2_CAPCOM = (uint8_t)14, /*!< TIM2 capture/compare interrupt */ +#endif /*STM8S903 or STM8AF622x */ + + ITC_IRQ_TIM3_OVF = (uint8_t)15, /*!< TIM3 update /overflow interrupt*/ + ITC_IRQ_TIM3_CAPCOM = (uint8_t)16, /*!< TIM3 update /overflow interrupt */ + +#if defined(STM8S208) ||defined(STM8S207) || defined (STM8S007) || defined(STM8S103) || \ + defined(STM8S003) ||defined(STM8S903) || defined (STM8AF52Ax) || defined (STM8AF62Ax) + ITC_IRQ_UART1_TX = (uint8_t)17, /*!< UART1 TX interrupt */ + ITC_IRQ_UART1_RX = (uint8_t)18, /*!< UART1 RX interrupt */ +#endif /*STM8S208 or STM8S207 or STM8S007 or STM8S103 or STM8S003 or STM8S903 or STM8AF52Ax or STM8AF62Ax */ +#if defined(STM8AF622x) + ITC_IRQ_UART4_TX = (uint8_t)17, /*!< UART4 TX interrupt */ + ITC_IRQ_UART4_RX = (uint8_t)18, /*!< UART4 RX interrupt */ +#endif /*STM8AF622x */ + + ITC_IRQ_I2C = (uint8_t)19, /*!< I2C interrupt */ + +#if defined(STM8S105) || defined(STM8S005) || defined(STM8AF626x) + ITC_IRQ_UART2_TX = (uint8_t)20, /*!< USART2 TX interrupt */ + ITC_IRQ_UART2_RX = (uint8_t)21, /*!< USART2 RX interrupt */ +#endif /*STM8S105 or STM8AF626x */ + +#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8AF52Ax) || defined(STM8AF62Ax) + ITC_IRQ_UART3_TX = (uint8_t)20, /*!< USART3 TX interrupt */ + ITC_IRQ_UART3_RX = (uint8_t)21, /*!< USART3 RX interrupt */ + ITC_IRQ_ADC2 = (uint8_t)22, /*!< ADC2 interrupt */ +#endif /*STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax */ + +#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || defined(STM8S903) || defined(STM8AF626x) || defined(STM8AF622x) + ITC_IRQ_ADC1 = (uint8_t)22, /*!< ADC2 interrupt */ +#endif /*STM8S105 or STM8S005 or STM8S003 or STM8S103 or STM8S903 or STM8AF626x or STM8AF622x */ + +#if defined(STM8S903) || defined(STM8AF622x) + ITC_IRQ_TIM6_OVFTRI = (uint8_t)23, /*!< TIM6 update/overflow/underflow/trigger/ + interrupt */ +#else + ITC_IRQ_TIM4_OVF = (uint8_t)23, /*!< TIM4 update /overflow interrupt */ +#endif /*STM8S903 or STM8AF622x */ + + ITC_IRQ_EEPROM_EEC = (uint8_t)24 /*!< Flash interrupt */ +} ITC_Irq_TypeDef; + +/** + * @brief ITC Priority Levels selection + */ +typedef enum { + ITC_PRIORITYLEVEL_0 = (uint8_t)0x02, /*!< Software priority level 0 (cannot be written) */ + ITC_PRIORITYLEVEL_1 = (uint8_t)0x01, /*!< Software priority level 1 */ + ITC_PRIORITYLEVEL_2 = (uint8_t)0x00, /*!< Software priority level 2 */ + ITC_PRIORITYLEVEL_3 = (uint8_t)0x03 /*!< Software priority level 3 */ +} ITC_PriorityLevel_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ + +/** @addtogroup ITC_Exported_Constants + * @{ + */ +#define CPU_SOFT_INT_DISABLED ((uint8_t)0x28) /*!< Mask for I1 and I0 bits in CPU_CC register */ + +/** + * @} + */ + +/* Private macros ------------------------------------------------------------*/ + +/** + * @brief Macros used by the assert function in order to check the different functions parameters. + * @addtogroup ITC_Private_Macros + * @{ + */ + +/* Used by assert function */ +#define IS_ITC_IRQ_OK(IRQ) ((IRQ) <= (uint8_t)24) + +/* Used by assert function */ +#define IS_ITC_PRIORITY_OK(PriorityValue) \ + (((PriorityValue) == ITC_PRIORITYLEVEL_0) || \ + ((PriorityValue) == ITC_PRIORITYLEVEL_1) || \ + ((PriorityValue) == ITC_PRIORITYLEVEL_2) || \ + ((PriorityValue) == ITC_PRIORITYLEVEL_3)) + +/* Used by assert function */ +#define IS_ITC_INTERRUPTS_DISABLED (ITC_GetSoftIntStatus() == CPU_SOFT_INT_DISABLED) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup ITC_Exported_Functions + * @{ + */ + +uint8_t ITC_GetCPUCC(void); +void ITC_DeInit(void); +uint8_t ITC_GetSoftIntStatus(void); +void ITC_SetSoftwarePriority(ITC_Irq_TypeDef IrqNum, ITC_PriorityLevel_TypeDef PriorityValue); +ITC_PriorityLevel_TypeDef ITC_GetSoftwarePriority(ITC_Irq_TypeDef IrqNum); + +/** + * @} + */ + +#endif /* __STM8S_ITC_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_iwdg.h b/4_EXT_INT_1PORT/lib/inc/stm8s_iwdg.h new file mode 100644 index 0000000..ae18ecd --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_iwdg.h @@ -0,0 +1,131 @@ +/** + ****************************************************************************** + * @file stm8s_iwdg.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototypes and macros for the IWDG peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_IWDG_H +#define __STM8S_IWDG_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/** @addtogroup IWDG_Private_Define + * @{ + */ + +/** + * @brief Define used to prevent watchdog reset + */ +#define IWDG_KEY_REFRESH ((uint8_t)0xAA) /*!< This value written in the Key register prevent the watchdog reset */ + +/** + * @brief Define used to start the watchdog counter down + */ +#define IWDG_KEY_ENABLE ((uint8_t)0xCC) /*!< This value written in the Key register start the watchdog counting down*/ + +/** + * @} + */ + +/** @addtogroup IWDG_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function in order to check the different + * values of the prescaler. + */ +#define IS_IWDG_PRESCALER_OK(VALUE) (((VALUE) == IWDG_Prescaler_4 ) || \ + ((VALUE) == IWDG_Prescaler_8 ) || \ + ((VALUE) == IWDG_Prescaler_16 ) || \ + ((VALUE) == IWDG_Prescaler_32 ) || \ + ((VALUE) == IWDG_Prescaler_64 ) || \ + ((VALUE) == IWDG_Prescaler_128 ) || \ + ((VALUE) == IWDG_Prescaler_256)) + +/** + * @brief Macro used by the assert function in order to check the different + * values of the counter register. + */ +#define IS_IWDG_WRITEACCESS_MODE_OK(MODE) (((MODE) == IWDG_WriteAccess_Enable) || ((MODE) == IWDG_WriteAccess_Disable)) + +/** + * @} + */ + +/** @addtogroup IWDG_Exported_Types + * @{ + */ + +/** IWDG write access enumeration */ +typedef enum +{ + IWDG_WriteAccess_Enable = (uint8_t)0x55, /*!< Code 0x55 in Key register, allow write access to Prescaler and Reload registers */ + IWDG_WriteAccess_Disable = (uint8_t)0x00 /*!< Code 0x00 in Key register, not allow write access to Prescaler and Reload registers */ +} IWDG_WriteAccess_TypeDef; + +/** IWDG prescaler enumaration */ +typedef enum +{ + IWDG_Prescaler_4 = (uint8_t)0x00, /*!< Used to set prescaler register to 4 */ + IWDG_Prescaler_8 = (uint8_t)0x01, /*!< Used to set prescaler register to 8 */ + IWDG_Prescaler_16 = (uint8_t)0x02, /*!< Used to set prescaler register to 16 */ + IWDG_Prescaler_32 = (uint8_t)0x03, /*!< Used to set prescaler register to 32 */ + IWDG_Prescaler_64 = (uint8_t)0x04, /*!< Used to set prescaler register to 64 */ + IWDG_Prescaler_128 = (uint8_t)0x05, /*!< Used to set prescaler register to 128 */ + IWDG_Prescaler_256 = (uint8_t)0x06 /*!< Used to set prescaler register to 256 */ +} IWDG_Prescaler_TypeDef; + +/** + * @} + */ + +/** @addtogroup IWDG_Exported_Functions + * @{ + */ + +void IWDG_WriteAccessCmd(IWDG_WriteAccess_TypeDef IWDG_WriteAccess); +void IWDG_SetPrescaler(IWDG_Prescaler_TypeDef IWDG_Prescaler); +void IWDG_SetReload(uint8_t IWDG_Reload); +void IWDG_ReloadCounter(void); +void IWDG_Enable(void); + +/** + * @} + */ + +#endif /* __STM8S_IWDG_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_rst.h b/4_EXT_INT_1PORT/lib/inc/stm8s_rst.h new file mode 100644 index 0000000..b402462 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_rst.h @@ -0,0 +1,92 @@ +/** + ****************************************************************************** + * @file stm8s_rst.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the RST peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_RST_H +#define __STM8S_RST_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/** @addtogroup RST_Exported_Types + * @{ + */ +typedef enum { + RST_FLAG_EMCF = (uint8_t)0x10, /*!< EMC reset flag */ + RST_FLAG_SWIMF = (uint8_t)0x08, /*!< SWIM reset flag */ + RST_FLAG_ILLOPF = (uint8_t)0x04, /*!< Illigal opcode reset flag */ + RST_FLAG_IWDGF = (uint8_t)0x02, /*!< Independent watchdog reset flag */ + RST_FLAG_WWDGF = (uint8_t)0x01 /*!< Window watchdog reset flag */ +}RST_Flag_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/* Exported macros -----------------------------------------------------------*/ + +/** @addtogroup RST_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different functions parameters. + */ +/** + * @brief Macro used by the assert function to check the different RST flags. + */ +#define IS_RST_FLAG_OK(FLAG) (((FLAG) == RST_FLAG_EMCF) || \ + ((FLAG) == RST_FLAG_SWIMF) ||\ + ((FLAG) == RST_FLAG_ILLOPF) ||\ + ((FLAG) == RST_FLAG_IWDGF) ||\ + ((FLAG) == RST_FLAG_WWDGF)) + +/** + * @} + */ + +/** @addtogroup RST_Exported_functions + * @{ + */ +FlagStatus RST_GetFlagStatus(RST_Flag_TypeDef RST_Flag); +void RST_ClearFlag(RST_Flag_TypeDef RST_Flag); + +/** + * @} + */ + +#endif /* __STM8S_RST_H */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_spi.h b/4_EXT_INT_1PORT/lib/inc/stm8s_spi.h new file mode 100644 index 0000000..56bc156 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_spi.h @@ -0,0 +1,336 @@ +/** + ****************************************************************************** + * @file stm8s_spi.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the SPI peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_SPI_H +#define __STM8S_SPI_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/** @addtogroup SPI_Exported_Types + * @{ + */ + +/** + * @brief SPI data direction mode + * Warning: element values correspond to BDM, BDOE, RXONLY bits position + */ +typedef enum { + SPI_DATADIRECTION_2LINES_FULLDUPLEX = (uint8_t)0x00, /*!< 2-line uni-directional data mode enable */ + SPI_DATADIRECTION_2LINES_RXONLY = (uint8_t)0x04, /*!< Receiver only in 2 line uni-directional data mode */ + SPI_DATADIRECTION_1LINE_RX = (uint8_t)0x80, /*!< Receiver only in 1 line bi-directional data mode */ + SPI_DATADIRECTION_1LINE_TX = (uint8_t)0xC0 /*!< Transmit only in 1 line bi-directional data mode */ +} SPI_DataDirection_TypeDef; + +/** + * @brief SPI Slave Select management + * Warning: element values correspond to LSBFIRST bit position + */ +typedef enum +{ + SPI_NSS_SOFT = (uint8_t)0x02, /*!< Software slave management disabled */ + SPI_NSS_HARD = (uint8_t)0x00 /*!< Software slave management enabled */ +} SPI_NSS_TypeDef; + + +/** + * @brief SPI direction transmit/receive + */ + +typedef enum { + SPI_DIRECTION_RX = (uint8_t)0x00, /*!< Selects Rx receive direction in bi-directional mode */ + SPI_DIRECTION_TX = (uint8_t)0x01 /*!< Selects Tx transmission direction in bi-directional mode */ +} SPI_Direction_TypeDef; + +/** + * @brief SPI master/slave mode + * Warning: element values correspond to MSTR bit position + */ +typedef enum { + SPI_MODE_MASTER = (uint8_t)0x04, /*!< SPI Master configuration */ + SPI_MODE_SLAVE = (uint8_t)0x00 /*!< SPI Slave configuration */ +} SPI_Mode_TypeDef; + +/** + * @brief SPI BaudRate Prescaler + * Warning: element values correspond to BR bits position + */ +typedef enum { + SPI_BAUDRATEPRESCALER_2 = (uint8_t)0x00, /*!< SPI frequency = frequency(CPU)/2 */ + SPI_BAUDRATEPRESCALER_4 = (uint8_t)0x08, /*!< SPI frequency = frequency(CPU)/4 */ + SPI_BAUDRATEPRESCALER_8 = (uint8_t)0x10, /*!< SPI frequency = frequency(CPU)/8 */ + SPI_BAUDRATEPRESCALER_16 = (uint8_t)0x18, /*!< SPI frequency = frequency(CPU)/16 */ + SPI_BAUDRATEPRESCALER_32 = (uint8_t)0x20, /*!< SPI frequency = frequency(CPU)/32 */ + SPI_BAUDRATEPRESCALER_64 = (uint8_t)0x28, /*!< SPI frequency = frequency(CPU)/64 */ + SPI_BAUDRATEPRESCALER_128 = (uint8_t)0x30, /*!< SPI frequency = frequency(CPU)/128 */ + SPI_BAUDRATEPRESCALER_256 = (uint8_t)0x38 /*!< SPI frequency = frequency(CPU)/256 */ +} SPI_BaudRatePrescaler_TypeDef; + +/** + * @brief SPI Clock Polarity + * Warning: element values correspond to CPOL bit position + */ +typedef enum { + SPI_CLOCKPOLARITY_LOW = (uint8_t)0x00, /*!< Clock to 0 when idle */ + SPI_CLOCKPOLARITY_HIGH = (uint8_t)0x02 /*!< Clock to 1 when idle */ +} SPI_ClockPolarity_TypeDef; + +/** + * @brief SPI Clock Phase + * Warning: element values correspond to CPHA bit position + */ +typedef enum { + SPI_CLOCKPHASE_1EDGE = (uint8_t)0x00, /*!< The first clock transition is the first data capture edge */ + SPI_CLOCKPHASE_2EDGE = (uint8_t)0x01 /*!< The second clock transition is the first data capture edge */ +} SPI_ClockPhase_TypeDef; + +/** + * @brief SPI Frame Format: MSB or LSB transmitted first + * Warning: element values correspond to LSBFIRST bit position + */ +typedef enum { + SPI_FIRSTBIT_MSB = (uint8_t)0x00, /*!< MSB bit will be transmitted first */ + SPI_FIRSTBIT_LSB = (uint8_t)0x80 /*!< LSB bit will be transmitted first */ +} SPI_FirstBit_TypeDef; + +/** + * @brief SPI CRC Transmit/Receive + */ +typedef enum { + SPI_CRC_RX = (uint8_t)0x00, /*!< Select Tx CRC register */ + SPI_CRC_TX = (uint8_t)0x01 /*!< Select Rx CRC register */ +} SPI_CRC_TypeDef; + +/** + * @brief SPI flags definition - Warning : FLAG value = mapping position register + */ +typedef enum { + SPI_FLAG_BSY = (uint8_t)0x80, /*!< Busy flag */ + SPI_FLAG_OVR = (uint8_t)0x40, /*!< Overrun flag */ + SPI_FLAG_MODF = (uint8_t)0x20, /*!< Mode fault */ + SPI_FLAG_CRCERR = (uint8_t)0x10, /*!< CRC error flag */ + SPI_FLAG_WKUP = (uint8_t)0x08, /*!< Wake-up flag */ + SPI_FLAG_TXE = (uint8_t)0x02, /*!< Transmit buffer empty */ + SPI_FLAG_RXNE = (uint8_t)0x01 /*!< Receive buffer empty */ +} SPI_Flag_TypeDef; + +/** + * @brief SPI_IT possible values + * Elements values convention: 0xYX + * X: Position of the corresponding Interrupt + * Y: ITPENDINGBIT position + */ +typedef enum +{ + SPI_IT_WKUP = (uint8_t)0x34, /*!< Wake-up interrupt*/ + SPI_IT_OVR = (uint8_t)0x65, /*!< Overrun interrupt*/ + SPI_IT_MODF = (uint8_t)0x55, /*!< Mode fault interrupt*/ + SPI_IT_CRCERR = (uint8_t)0x45, /*!< CRC error interrupt*/ + SPI_IT_TXE = (uint8_t)0x17, /*!< Transmit buffer empty interrupt*/ + SPI_IT_RXNE = (uint8_t)0x06, /*!< Receive buffer not empty interrupt*/ + SPI_IT_ERR = (uint8_t)0x05 /*!< Error interrupt*/ +} SPI_IT_TypeDef; + +/** + * @} + */ + +/* Private define ------------------------------------------------------------*/ + +/** @addtogroup SPI_Private_Macros + * @brief Macros used by the assert_param function to check the different functions parameters. + * @{ + */ + +/** + * @brief Macro used by the assert_param function in order to check the data direction mode values + */ +#define IS_SPI_DATA_DIRECTION_OK(MODE) (((MODE) == SPI_DATADIRECTION_2LINES_FULLDUPLEX) || \ + ((MODE) == SPI_DATADIRECTION_2LINES_RXONLY) || \ + ((MODE) == SPI_DATADIRECTION_1LINE_RX) || \ + ((MODE) == SPI_DATADIRECTION_1LINE_TX)) + +/** + * @brief Macro used by the assert_param function in order to check the mode + * half duplex data direction values + */ +#define IS_SPI_DIRECTION_OK(DIRECTION) (((DIRECTION) == SPI_DIRECTION_RX) || \ + ((DIRECTION) == SPI_DIRECTION_TX)) + +/** + * @brief Macro used by the assert_param function in order to check the NSS + * management values + */ +#define IS_SPI_SLAVEMANAGEMENT_OK(NSS) (((NSS) == SPI_NSS_SOFT) || \ + ((NSS) == SPI_NSS_HARD)) + + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the CRC polynomial + */ +#define IS_SPI_CRC_POLYNOMIAL_OK(POLYNOMIAL) ((POLYNOMIAL) > (uint8_t)0x00) + +/** + * @brief Macro used by the assert_param function in order to check the SPI Mode values + */ +#define IS_SPI_MODE_OK(MODE) (((MODE) == SPI_MODE_MASTER) || \ + ((MODE) == SPI_MODE_SLAVE)) + +/** + * @brief Macro used by the assert_param function in order to check the baudrate values + */ +#define IS_SPI_BAUDRATE_PRESCALER_OK(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)) + +/** + * @brief Macro used by the assert_param function in order to check the polarity values + */ +#define IS_SPI_POLARITY_OK(CLKPOL) (((CLKPOL) == SPI_CLOCKPOLARITY_LOW) || \ + ((CLKPOL) == SPI_CLOCKPOLARITY_HIGH)) + +/** + * @brief Macro used by the assert_param function in order to check the phase values + */ +#define IS_SPI_PHASE_OK(CLKPHA) (((CLKPHA) == SPI_CLOCKPHASE_1EDGE) || \ + ((CLKPHA) == SPI_CLOCKPHASE_2EDGE)) + +/** + * @brief Macro used by the assert_param function in order to check the first + * bit to be transmited values + */ +#define IS_SPI_FIRSTBIT_OK(BIT) (((BIT) == SPI_FIRSTBIT_MSB) || \ + ((BIT) == SPI_FIRSTBIT_LSB)) + +/** + * @brief Macro used by the assert_param function in order to check the CRC + * Transmit/Receive + */ +#define IS_SPI_CRC_OK(CRC) (((CRC) == SPI_CRC_TX) || \ + ((CRC) == SPI_CRC_RX)) + +/** + * @brief Macro used by the assert_param function in order to check the + * different flags values + */ +#define IS_SPI_FLAGS_OK(FLAG) (((FLAG) == SPI_FLAG_OVR) || \ + ((FLAG) == SPI_FLAG_MODF) || \ + ((FLAG) == SPI_FLAG_CRCERR) || \ + ((FLAG) == SPI_FLAG_WKUP) || \ + ((FLAG) == SPI_FLAG_TXE) || \ + ((FLAG) == SPI_FLAG_RXNE) || \ + ((FLAG) == SPI_FLAG_BSY)) + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the flag that can be cleared + * by writing 0 + */ +#define IS_SPI_CLEAR_FLAGS_OK(FLAG) (((FLAG) == SPI_FLAG_CRCERR) || \ + ((FLAG) == SPI_FLAG_WKUP)) + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the Interrupts + */ +#define IS_SPI_CONFIG_IT_OK(Interrupt) (((Interrupt) == SPI_IT_TXE) || \ + ((Interrupt) == SPI_IT_RXNE) || \ + ((Interrupt) == SPI_IT_ERR) || \ + ((Interrupt) == SPI_IT_WKUP)) + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the pending bit + */ +#define IS_SPI_GET_IT_OK(ITPendingBit) (((ITPendingBit) == SPI_IT_OVR) || \ + ((ITPendingBit) == SPI_IT_MODF) || \ + ((ITPendingBit) == SPI_IT_CRCERR) || \ + ((ITPendingBit) == SPI_IT_WKUP) || \ + ((ITPendingBit) == SPI_IT_TXE) || \ + ((ITPendingBit) == SPI_IT_RXNE)) + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the pending bit that can be cleared + * by writing 0 + */ +#define IS_SPI_CLEAR_IT_OK(ITPendingBit) (((ITPendingBit) == SPI_IT_CRCERR) || \ + ((ITPendingBit) == SPI_IT_WKUP)) + +/** + * @} + */ + +/** @addtogroup SPI_Exported_Functions + * @{ + */ +void SPI_DeInit(void); +void SPI_Init(SPI_FirstBit_TypeDef FirstBit, + SPI_BaudRatePrescaler_TypeDef BaudRatePrescaler, + SPI_Mode_TypeDef Mode, SPI_ClockPolarity_TypeDef ClockPolarity, + SPI_ClockPhase_TypeDef ClockPhase, + SPI_DataDirection_TypeDef Data_Direction, + SPI_NSS_TypeDef Slave_Management, uint8_t CRCPolynomial); +void SPI_Cmd(FunctionalState NewState); +void SPI_ITConfig(SPI_IT_TypeDef SPI_IT, FunctionalState NewState); +void SPI_SendData(uint8_t Data); +uint8_t SPI_ReceiveData(void); +void SPI_NSSInternalSoftwareCmd(FunctionalState NewState); +void SPI_TransmitCRC(void); +void SPI_CalculateCRCCmd(FunctionalState NewState); +uint8_t SPI_GetCRC(SPI_CRC_TypeDef SPI_CRC); +void SPI_ResetCRC(void); +uint8_t SPI_GetCRCPolynomial(void); +void SPI_BiDirectionalLineConfig(SPI_Direction_TypeDef SPI_Direction); +FlagStatus SPI_GetFlagStatus(SPI_Flag_TypeDef SPI_FLAG); +void SPI_ClearFlag(SPI_Flag_TypeDef SPI_FLAG); +ITStatus SPI_GetITStatus(SPI_IT_TypeDef SPI_IT); +void SPI_ClearITPendingBit(SPI_IT_TypeDef SPI_IT); + +/** + * @} + */ + +#endif /* __STM8S_SPI_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_tim1.h b/4_EXT_INT_1PORT/lib/inc/stm8s_tim1.h new file mode 100644 index 0000000..0863192 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_tim1.h @@ -0,0 +1,623 @@ +/** + ****************************************************************************** + * @file stm8s_tim1.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the TIM1 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_TIM1_H +#define __STM8S_TIM1_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/** @addtogroup TIM1_Exported_Types + * @{ + */ + +/** TIM1 Output Compare and PWM modes */ + +typedef enum +{ + TIM1_OCMODE_TIMING = ((uint8_t)0x00), + TIM1_OCMODE_ACTIVE = ((uint8_t)0x10), + TIM1_OCMODE_INACTIVE = ((uint8_t)0x20), + TIM1_OCMODE_TOGGLE = ((uint8_t)0x30), + TIM1_OCMODE_PWM1 = ((uint8_t)0x60), + TIM1_OCMODE_PWM2 = ((uint8_t)0x70) +}TIM1_OCMode_TypeDef; + +#define IS_TIM1_OC_MODE_OK(MODE) (((MODE) == TIM1_OCMODE_TIMING) || \ + ((MODE) == TIM1_OCMODE_ACTIVE) || \ + ((MODE) == TIM1_OCMODE_INACTIVE) || \ + ((MODE) == TIM1_OCMODE_TOGGLE)|| \ + ((MODE) == TIM1_OCMODE_PWM1) || \ + ((MODE) == TIM1_OCMODE_PWM2)) + +#define IS_TIM1_OCM_OK(MODE)(((MODE) == TIM1_OCMODE_TIMING) || \ + ((MODE) == TIM1_OCMODE_ACTIVE) || \ + ((MODE) == TIM1_OCMODE_INACTIVE) || \ + ((MODE) == TIM1_OCMODE_TOGGLE)|| \ + ((MODE) == TIM1_OCMODE_PWM1) || \ + ((MODE) == TIM1_OCMODE_PWM2) || \ + ((MODE) == (uint8_t)TIM1_FORCEDACTION_ACTIVE) || \ + ((MODE) == (uint8_t)TIM1_FORCEDACTION_INACTIVE)) + +/** TIM1 One Pulse Mode */ +typedef enum +{ + TIM1_OPMODE_SINGLE = ((uint8_t)0x01), + TIM1_OPMODE_REPETITIVE = ((uint8_t)0x00) +}TIM1_OPMode_TypeDef; + +#define IS_TIM1_OPM_MODE_OK(MODE) (((MODE) == TIM1_OPMODE_SINGLE) || \ + ((MODE) == TIM1_OPMODE_REPETITIVE)) + +/** TIM1 Channel */ + +typedef enum +{ + TIM1_CHANNEL_1 = ((uint8_t)0x00), + TIM1_CHANNEL_2 = ((uint8_t)0x01), + TIM1_CHANNEL_3 = ((uint8_t)0x02), + TIM1_CHANNEL_4 = ((uint8_t)0x03) +}TIM1_Channel_TypeDef; + + +#define IS_TIM1_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM1_CHANNEL_1) || \ + ((CHANNEL) == TIM1_CHANNEL_2) || \ + ((CHANNEL) == TIM1_CHANNEL_3) || \ + ((CHANNEL) == TIM1_CHANNEL_4)) + +#define IS_TIM1_PWMI_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM1_CHANNEL_1) || \ + ((CHANNEL) == TIM1_CHANNEL_2)) + +#define IS_TIM1_COMPLEMENTARY_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM1_CHANNEL_1) || \ + ((CHANNEL) == TIM1_CHANNEL_2) || \ + ((CHANNEL) == TIM1_CHANNEL_3)) + + +/** TIM1 Counter Mode */ +typedef enum +{ + TIM1_COUNTERMODE_UP = ((uint8_t)0x00), + TIM1_COUNTERMODE_DOWN = ((uint8_t)0x10), + TIM1_COUNTERMODE_CENTERALIGNED1 = ((uint8_t)0x20), + TIM1_COUNTERMODE_CENTERALIGNED2 = ((uint8_t)0x40), + TIM1_COUNTERMODE_CENTERALIGNED3 = ((uint8_t)0x60) +}TIM1_CounterMode_TypeDef; + +#define IS_TIM1_COUNTER_MODE_OK(MODE) (((MODE) == TIM1_COUNTERMODE_UP) || \ + ((MODE) == TIM1_COUNTERMODE_DOWN) || \ + ((MODE) == TIM1_COUNTERMODE_CENTERALIGNED1) || \ + ((MODE) == TIM1_COUNTERMODE_CENTERALIGNED2) || \ + ((MODE) == TIM1_COUNTERMODE_CENTERALIGNED3)) + +/** TIM1 Output Compare Polarity */ +typedef enum +{ + TIM1_OCPOLARITY_HIGH = ((uint8_t)0x00), + TIM1_OCPOLARITY_LOW = ((uint8_t)0x22) +}TIM1_OCPolarity_TypeDef; + +#define IS_TIM1_OC_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_OCPOLARITY_HIGH) || \ + ((POLARITY) == TIM1_OCPOLARITY_LOW)) + +/** TIM1 Output Compare N Polarity */ +typedef enum +{ + TIM1_OCNPOLARITY_HIGH = ((uint8_t)0x00), + TIM1_OCNPOLARITY_LOW = ((uint8_t)0x88) +}TIM1_OCNPolarity_TypeDef; + +#define IS_TIM1_OCN_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_OCNPOLARITY_HIGH) || \ + ((POLARITY) == TIM1_OCNPOLARITY_LOW)) + +/** TIM1 Output Compare states */ +typedef enum +{ + TIM1_OUTPUTSTATE_DISABLE = ((uint8_t)0x00), + TIM1_OUTPUTSTATE_ENABLE = ((uint8_t)0x11) +}TIM1_OutputState_TypeDef; + +#define IS_TIM1_OUTPUT_STATE_OK(STATE) (((STATE) == TIM1_OUTPUTSTATE_DISABLE) || \ + ((STATE) == TIM1_OUTPUTSTATE_ENABLE)) + +/** TIM1 Output Compare N States */ +typedef enum +{ + TIM1_OUTPUTNSTATE_DISABLE = ((uint8_t)0x00), + TIM1_OUTPUTNSTATE_ENABLE = ((uint8_t)0x44) +} TIM1_OutputNState_TypeDef; + +#define IS_TIM1_OUTPUTN_STATE_OK(STATE) (((STATE) == TIM1_OUTPUTNSTATE_DISABLE) ||\ + ((STATE) == TIM1_OUTPUTNSTATE_ENABLE)) + +/** TIM1 Break Input enable/disable */ +typedef enum +{ + TIM1_BREAK_ENABLE = ((uint8_t)0x10), + TIM1_BREAK_DISABLE = ((uint8_t)0x00) +}TIM1_BreakState_TypeDef; +#define IS_TIM1_BREAK_STATE_OK(STATE) (((STATE) == TIM1_BREAK_ENABLE) || \ + ((STATE) == TIM1_BREAK_DISABLE)) + +/** TIM1 Break Polarity */ +typedef enum +{ + TIM1_BREAKPOLARITY_LOW = ((uint8_t)0x00), + TIM1_BREAKPOLARITY_HIGH = ((uint8_t)0x20) +}TIM1_BreakPolarity_TypeDef; +#define IS_TIM1_BREAK_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_BREAKPOLARITY_LOW) || \ + ((POLARITY) == TIM1_BREAKPOLARITY_HIGH)) + +/** TIM1 AOE Bit Set/Reset */ +typedef enum +{ + TIM1_AUTOMATICOUTPUT_ENABLE = ((uint8_t)0x40), + TIM1_AUTOMATICOUTPUT_DISABLE = ((uint8_t)0x00) +}TIM1_AutomaticOutput_TypeDef; + +#define IS_TIM1_AUTOMATIC_OUTPUT_STATE_OK(STATE) (((STATE) == TIM1_AUTOMATICOUTPUT_ENABLE) || \ + ((STATE) == TIM1_AUTOMATICOUTPUT_DISABLE)) + +/** TIM1 Lock levels */ +typedef enum +{ + TIM1_LOCKLEVEL_OFF = ((uint8_t)0x00), + TIM1_LOCKLEVEL_1 = ((uint8_t)0x01), + TIM1_LOCKLEVEL_2 = ((uint8_t)0x02), + TIM1_LOCKLEVEL_3 = ((uint8_t)0x03) +}TIM1_LockLevel_TypeDef; + +#define IS_TIM1_LOCK_LEVEL_OK(LEVEL) (((LEVEL) == TIM1_LOCKLEVEL_OFF) || \ + ((LEVEL) == TIM1_LOCKLEVEL_1) || \ + ((LEVEL) == TIM1_LOCKLEVEL_2) || \ + ((LEVEL) == TIM1_LOCKLEVEL_3)) + +/** TIM1 OSSI: Off-State Selection for Idle mode states */ +typedef enum +{ + TIM1_OSSISTATE_ENABLE = ((uint8_t)0x04), + TIM1_OSSISTATE_DISABLE = ((uint8_t)0x00) +}TIM1_OSSIState_TypeDef; + +#define IS_TIM1_OSSI_STATE_OK(STATE) (((STATE) == TIM1_OSSISTATE_ENABLE) || \ + ((STATE) == TIM1_OSSISTATE_DISABLE)) + +/** TIM1 Output Compare Idle State */ +typedef enum +{ + TIM1_OCIDLESTATE_SET = ((uint8_t)0x55), + TIM1_OCIDLESTATE_RESET = ((uint8_t)0x00) +}TIM1_OCIdleState_TypeDef; + +#define IS_TIM1_OCIDLE_STATE_OK(STATE) (((STATE) == TIM1_OCIDLESTATE_SET) || \ + ((STATE) == TIM1_OCIDLESTATE_RESET)) + +/** TIM1 Output Compare N Idle State */ +typedef enum +{ + TIM1_OCNIDLESTATE_SET = ((uint8_t)0x2A), + TIM1_OCNIDLESTATE_RESET = ((uint8_t)0x00) +}TIM1_OCNIdleState_TypeDef; + +#define IS_TIM1_OCNIDLE_STATE_OK(STATE) (((STATE) == TIM1_OCNIDLESTATE_SET) || \ + ((STATE) == TIM1_OCNIDLESTATE_RESET)) + +/** TIM1 Input Capture Polarity */ +typedef enum +{ + TIM1_ICPOLARITY_RISING = ((uint8_t)0x00), + TIM1_ICPOLARITY_FALLING = ((uint8_t)0x01) +}TIM1_ICPolarity_TypeDef; + +#define IS_TIM1_IC_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_ICPOLARITY_RISING) || \ + ((POLARITY) == TIM1_ICPOLARITY_FALLING)) + +/** TIM1 Input Capture Selection */ +typedef enum +{ + TIM1_ICSELECTION_DIRECTTI = ((uint8_t)0x01), + TIM1_ICSELECTION_INDIRECTTI = ((uint8_t)0x02), + TIM1_ICSELECTION_TRGI = ((uint8_t)0x03) +}TIM1_ICSelection_TypeDef; + +#define IS_TIM1_IC_SELECTION_OK(SELECTION) (((SELECTION) == TIM1_ICSELECTION_DIRECTTI) || \ + ((SELECTION) == TIM1_ICSELECTION_INDIRECTTI) || \ + ((SELECTION) == TIM1_ICSELECTION_TRGI)) + +/** TIM1 Input Capture Prescaler */ +typedef enum +{ + TIM1_ICPSC_DIV1 = ((uint8_t)0x00), + TIM1_ICPSC_DIV2 = ((uint8_t)0x04), + TIM1_ICPSC_DIV4 = ((uint8_t)0x08), + TIM1_ICPSC_DIV8 = ((uint8_t)0x0C) +}TIM1_ICPSC_TypeDef; + +#define IS_TIM1_IC_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM1_ICPSC_DIV1) || \ + ((PRESCALER) == TIM1_ICPSC_DIV2) || \ + ((PRESCALER) == TIM1_ICPSC_DIV4) || \ + ((PRESCALER) == TIM1_ICPSC_DIV8)) + +/** TIM1 Input Capture Filer Value */ + +#define IS_TIM1_IC_FILTER_OK(ICFILTER) ((ICFILTER) <= 0x0F) + +/** TIM1 External Trigger Filer Value */ +#define IS_TIM1_EXT_TRG_FILTER_OK(FILTER) ((FILTER) <= 0x0F) + +/** TIM1 interrupt sources */ +typedef enum +{ + TIM1_IT_UPDATE = ((uint8_t)0x01), + TIM1_IT_CC1 = ((uint8_t)0x02), + TIM1_IT_CC2 = ((uint8_t)0x04), + TIM1_IT_CC3 = ((uint8_t)0x08), + TIM1_IT_CC4 = ((uint8_t)0x10), + TIM1_IT_COM = ((uint8_t)0x20), + TIM1_IT_TRIGGER = ((uint8_t)0x40), + TIM1_IT_BREAK = ((uint8_t)0x80) +}TIM1_IT_TypeDef; + +#define IS_TIM1_IT_OK(IT) ((IT) != 0x00) + +#define IS_TIM1_GET_IT_OK(IT) (((IT) == TIM1_IT_UPDATE) || \ + ((IT) == TIM1_IT_CC1) || \ + ((IT) == TIM1_IT_CC2) || \ + ((IT) == TIM1_IT_CC3) || \ + ((IT) == TIM1_IT_CC4) || \ + ((IT) == TIM1_IT_COM) || \ + ((IT) == TIM1_IT_TRIGGER) || \ + ((IT) == TIM1_IT_BREAK)) + + +/** TIM1 External Trigger Prescaler */ +typedef enum +{ + TIM1_EXTTRGPSC_OFF = ((uint8_t)0x00), + TIM1_EXTTRGPSC_DIV2 = ((uint8_t)0x10), + TIM1_EXTTRGPSC_DIV4 = ((uint8_t)0x20), + TIM1_EXTTRGPSC_DIV8 = ((uint8_t)0x30) +}TIM1_ExtTRGPSC_TypeDef; + +#define IS_TIM1_EXT_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM1_EXTTRGPSC_OFF) || \ + ((PRESCALER) == TIM1_EXTTRGPSC_DIV2) || \ + ((PRESCALER) == TIM1_EXTTRGPSC_DIV4) || \ + ((PRESCALER) == TIM1_EXTTRGPSC_DIV8)) + +/** TIM1 Internal Trigger Selection */ +typedef enum +{ + TIM1_TS_TIM6 = ((uint8_t)0x00), /*!< TRIG Input source = TIM6 TRIG Output */ + TIM1_TS_TIM5 = ((uint8_t)0x30), /*!< TRIG Input source = TIM5 TRIG Output */ + TIM1_TS_TI1F_ED = ((uint8_t)0x40), + TIM1_TS_TI1FP1 = ((uint8_t)0x50), + TIM1_TS_TI2FP2 = ((uint8_t)0x60), + TIM1_TS_ETRF = ((uint8_t)0x70) +}TIM1_TS_TypeDef; + +#define IS_TIM1_TRIGGER_SELECTION_OK(SELECTION) (((SELECTION) == TIM1_TS_TI1F_ED) || \ + ((SELECTION) == TIM1_TS_TI1FP1) || \ + ((SELECTION) == TIM1_TS_TI2FP2) || \ + ((SELECTION) == TIM1_TS_ETRF) || \ + ((SELECTION) == TIM1_TS_TIM5) || \ + ((SELECTION) == TIM1_TS_TIM6)) + + +#define IS_TIM1_TIX_TRIGGER_SELECTION_OK(SELECTION) (((SELECTION) == TIM1_TS_TI1F_ED) || \ + ((SELECTION) == TIM1_TS_TI1FP1) || \ + ((SELECTION) == TIM1_TS_TI2FP2)) + +/** TIM1 TIx External Clock Source */ +typedef enum +{ + TIM1_TIXEXTERNALCLK1SOURCE_TI1ED = ((uint8_t)0x40), + TIM1_TIXEXTERNALCLK1SOURCE_TI1 = ((uint8_t)0x50), + TIM1_TIXEXTERNALCLK1SOURCE_TI2 = ((uint8_t)0x60) +}TIM1_TIxExternalCLK1Source_TypeDef; + +#define IS_TIM1_TIXCLK_SOURCE_OK(SOURCE) (((SOURCE) == TIM1_TIXEXTERNALCLK1SOURCE_TI1ED) || \ + ((SOURCE) == TIM1_TIXEXTERNALCLK1SOURCE_TI2) || \ + ((SOURCE) == TIM1_TIXEXTERNALCLK1SOURCE_TI1)) + +/** TIM1 External Trigger Polarity */ +typedef enum +{ + TIM1_EXTTRGPOLARITY_INVERTED = ((uint8_t)0x80), + TIM1_EXTTRGPOLARITY_NONINVERTED = ((uint8_t)0x00) +}TIM1_ExtTRGPolarity_TypeDef; + +#define IS_TIM1_EXT_POLARITY_OK(POLARITY) (((POLARITY) == TIM1_EXTTRGPOLARITY_INVERTED) || \ + ((POLARITY) == TIM1_EXTTRGPOLARITY_NONINVERTED)) + +/** TIM1 Prescaler Reload Mode */ +typedef enum +{ + TIM1_PSCRELOADMODE_UPDATE = ((uint8_t)0x00), + TIM1_PSCRELOADMODE_IMMEDIATE = ((uint8_t)0x01) +}TIM1_PSCReloadMode_TypeDef; + +#define IS_TIM1_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM1_PSCRELOADMODE_UPDATE) || \ + ((RELOAD) == TIM1_PSCRELOADMODE_IMMEDIATE)) + +/** TIM1 Encoder Mode */ +typedef enum +{ + TIM1_ENCODERMODE_TI1 = ((uint8_t)0x01), + TIM1_ENCODERMODE_TI2 = ((uint8_t)0x02), + TIM1_ENCODERMODE_TI12 = ((uint8_t)0x03) +}TIM1_EncoderMode_TypeDef; + +#define IS_TIM1_ENCODER_MODE_OK(MODE) (((MODE) == TIM1_ENCODERMODE_TI1) || \ + ((MODE) == TIM1_ENCODERMODE_TI2) || \ + ((MODE) == TIM1_ENCODERMODE_TI12)) + +/** TIM1 Event Source */ +typedef enum +{ + TIM1_EVENTSOURCE_UPDATE = ((uint8_t)0x01), + TIM1_EVENTSOURCE_CC1 = ((uint8_t)0x02), + TIM1_EVENTSOURCE_CC2 = ((uint8_t)0x04), + TIM1_EVENTSOURCE_CC3 = ((uint8_t)0x08), + TIM1_EVENTSOURCE_CC4 = ((uint8_t)0x10), + TIM1_EVENTSOURCE_COM = ((uint8_t)0x20), + TIM1_EVENTSOURCE_TRIGGER = ((uint8_t)0x40), + TIM1_EVENTSOURCE_BREAK = ((uint8_t)0x80) +}TIM1_EventSource_TypeDef; + +#define IS_TIM1_EVENT_SOURCE_OK(SOURCE) ((SOURCE) != 0x00) + +/** TIM1 Update Source */ +typedef enum +{ + TIM1_UPDATESOURCE_GLOBAL = ((uint8_t)0x00), + TIM1_UPDATESOURCE_REGULAR = ((uint8_t)0x01) +}TIM1_UpdateSource_TypeDef; + +#define IS_TIM1_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM1_UPDATESOURCE_GLOBAL) || \ + ((SOURCE) == TIM1_UPDATESOURCE_REGULAR)) + +/** TIM1 Trigger Output Source */ +typedef enum +{ + TIM1_TRGOSOURCE_RESET = ((uint8_t)0x00), + TIM1_TRGOSOURCE_ENABLE = ((uint8_t)0x10), + TIM1_TRGOSOURCE_UPDATE = ((uint8_t)0x20), + TIM1_TRGOSource_OC1 = ((uint8_t)0x30), + TIM1_TRGOSOURCE_OC1REF = ((uint8_t)0x40), + TIM1_TRGOSOURCE_OC2REF = ((uint8_t)0x50), + TIM1_TRGOSOURCE_OC3REF = ((uint8_t)0x60) +}TIM1_TRGOSource_TypeDef; + +#define IS_TIM1_TRGO_SOURCE_OK(SOURCE) (((SOURCE) == TIM1_TRGOSOURCE_RESET) || \ + ((SOURCE) == TIM1_TRGOSOURCE_ENABLE) || \ + ((SOURCE) == TIM1_TRGOSOURCE_UPDATE) || \ + ((SOURCE) == TIM1_TRGOSource_OC1) || \ + ((SOURCE) == TIM1_TRGOSOURCE_OC1REF) || \ + ((SOURCE) == TIM1_TRGOSOURCE_OC2REF) || \ + ((SOURCE) == TIM1_TRGOSOURCE_OC3REF)) + +/** TIM1 Slave Mode */ +typedef enum +{ + TIM1_SLAVEMODE_RESET = ((uint8_t)0x04), + TIM1_SLAVEMODE_GATED = ((uint8_t)0x05), + TIM1_SLAVEMODE_TRIGGER = ((uint8_t)0x06), + TIM1_SLAVEMODE_EXTERNAL1 = ((uint8_t)0x07) +}TIM1_SlaveMode_TypeDef; + +#define IS_TIM1_SLAVE_MODE_OK(MODE) (((MODE) == TIM1_SLAVEMODE_RESET) || \ + ((MODE) == TIM1_SLAVEMODE_GATED) || \ + ((MODE) == TIM1_SLAVEMODE_TRIGGER) || \ + ((MODE) == TIM1_SLAVEMODE_EXTERNAL1)) + +/** TIM1 Flags */ +typedef enum +{ + TIM1_FLAG_UPDATE = ((uint16_t)0x0001), + TIM1_FLAG_CC1 = ((uint16_t)0x0002), + TIM1_FLAG_CC2 = ((uint16_t)0x0004), + TIM1_FLAG_CC3 = ((uint16_t)0x0008), + TIM1_FLAG_CC4 = ((uint16_t)0x0010), + TIM1_FLAG_COM = ((uint16_t)0x0020), + TIM1_FLAG_TRIGGER = ((uint16_t)0x0040), + TIM1_FLAG_BREAK = ((uint16_t)0x0080), + TIM1_FLAG_CC1OF = ((uint16_t)0x0200), + TIM1_FLAG_CC2OF = ((uint16_t)0x0400), + TIM1_FLAG_CC3OF = ((uint16_t)0x0800), + TIM1_FLAG_CC4OF = ((uint16_t)0x1000) +}TIM1_FLAG_TypeDef; + +#define IS_TIM1_GET_FLAG_OK(FLAG) (((FLAG) == TIM1_FLAG_UPDATE) || \ + ((FLAG) == TIM1_FLAG_CC1) || \ + ((FLAG) == TIM1_FLAG_CC2) || \ + ((FLAG) == TIM1_FLAG_CC3) || \ + ((FLAG) == TIM1_FLAG_CC4) || \ + ((FLAG) == TIM1_FLAG_COM) || \ + ((FLAG) == TIM1_FLAG_TRIGGER) || \ + ((FLAG) == TIM1_FLAG_BREAK) || \ + ((FLAG) == TIM1_FLAG_CC1OF) || \ + ((FLAG) == TIM1_FLAG_CC2OF) || \ + ((FLAG) == TIM1_FLAG_CC3OF) || \ + ((FLAG) == TIM1_FLAG_CC4OF)) + +#define IS_TIM1_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & (uint16_t)0xE100) == 0x0000) && ((FLAG) != 0x0000)) + +/** TIM1 Forced Action */ +typedef enum +{ + TIM1_FORCEDACTION_ACTIVE = ((uint8_t)0x50), + TIM1_FORCEDACTION_INACTIVE = ((uint8_t)0x40) +}TIM1_ForcedAction_TypeDef; + +#define IS_TIM1_FORCED_ACTION_OK(ACTION) (((ACTION) == TIM1_FORCEDACTION_ACTIVE) || \ + ((ACTION) == TIM1_FORCEDACTION_INACTIVE)) +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup TIM1_Exported_Functions + * @{ + */ + +void TIM1_DeInit(void); +void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler, + TIM1_CounterMode_TypeDef TIM1_CounterMode, + uint16_t TIM1_Period, uint8_t TIM1_RepetitionCounter); +void TIM1_OC1Init(TIM1_OCMode_TypeDef TIM1_OCMode, + TIM1_OutputState_TypeDef TIM1_OutputState, + TIM1_OutputNState_TypeDef TIM1_OutputNState, + uint16_t TIM1_Pulse, TIM1_OCPolarity_TypeDef TIM1_OCPolarity, + TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity, + TIM1_OCIdleState_TypeDef TIM1_OCIdleState, + TIM1_OCNIdleState_TypeDef TIM1_OCNIdleState); +void TIM1_OC2Init(TIM1_OCMode_TypeDef TIM1_OCMode, + TIM1_OutputState_TypeDef TIM1_OutputState, + TIM1_OutputNState_TypeDef TIM1_OutputNState, + uint16_t TIM1_Pulse, TIM1_OCPolarity_TypeDef TIM1_OCPolarity, + TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity, + TIM1_OCIdleState_TypeDef TIM1_OCIdleState, + TIM1_OCNIdleState_TypeDef TIM1_OCNIdleState); +void TIM1_OC3Init(TIM1_OCMode_TypeDef TIM1_OCMode, + TIM1_OutputState_TypeDef TIM1_OutputState, + TIM1_OutputNState_TypeDef TIM1_OutputNState, + uint16_t TIM1_Pulse, TIM1_OCPolarity_TypeDef TIM1_OCPolarity, + TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity, + TIM1_OCIdleState_TypeDef TIM1_OCIdleState, + TIM1_OCNIdleState_TypeDef TIM1_OCNIdleState); +void TIM1_OC4Init(TIM1_OCMode_TypeDef TIM1_OCMode, + TIM1_OutputState_TypeDef TIM1_OutputState, uint16_t TIM1_Pulse, + TIM1_OCPolarity_TypeDef TIM1_OCPolarity, + TIM1_OCIdleState_TypeDef TIM1_OCIdleState); +void TIM1_BDTRConfig(TIM1_OSSIState_TypeDef TIM1_OSSIState, + TIM1_LockLevel_TypeDef TIM1_LockLevel, uint8_t TIM1_DeadTime, + TIM1_BreakState_TypeDef TIM1_Break, + TIM1_BreakPolarity_TypeDef TIM1_BreakPolarity, + TIM1_AutomaticOutput_TypeDef TIM1_AutomaticOutput); +void TIM1_ICInit(TIM1_Channel_TypeDef TIM1_Channel, + TIM1_ICPolarity_TypeDef TIM1_ICPolarity, + TIM1_ICSelection_TypeDef TIM1_ICSelection, + TIM1_ICPSC_TypeDef TIM1_ICPrescaler, uint8_t TIM1_ICFilter); +void TIM1_PWMIConfig(TIM1_Channel_TypeDef TIM1_Channel, + TIM1_ICPolarity_TypeDef TIM1_ICPolarity, + TIM1_ICSelection_TypeDef TIM1_ICSelection, + TIM1_ICPSC_TypeDef TIM1_ICPrescaler, uint8_t TIM1_ICFilter); +void TIM1_Cmd(FunctionalState NewState); +void TIM1_CtrlPWMOutputs(FunctionalState NewState); +void TIM1_ITConfig(TIM1_IT_TypeDef TIM1_IT, FunctionalState NewState); +void TIM1_InternalClockConfig(void); +void TIM1_ETRClockMode1Config(TIM1_ExtTRGPSC_TypeDef TIM1_ExtTRGPrescaler, + TIM1_ExtTRGPolarity_TypeDef TIM1_ExtTRGPolarity, + uint8_t ExtTRGFilter); +void TIM1_ETRClockMode2Config(TIM1_ExtTRGPSC_TypeDef TIM1_ExtTRGPrescaler, + TIM1_ExtTRGPolarity_TypeDef TIM1_ExtTRGPolarity, + uint8_t ExtTRGFilter); +void TIM1_ETRConfig(TIM1_ExtTRGPSC_TypeDef TIM1_ExtTRGPrescaler, + TIM1_ExtTRGPolarity_TypeDef TIM1_ExtTRGPolarity, + uint8_t ExtTRGFilter); +void TIM1_TIxExternalClockConfig(TIM1_TIxExternalCLK1Source_TypeDef TIM1_TIxExternalCLKSource, + TIM1_ICPolarity_TypeDef TIM1_ICPolarity, + uint8_t ICFilter); +void TIM1_SelectInputTrigger(TIM1_TS_TypeDef TIM1_InputTriggerSource); +void TIM1_UpdateDisableConfig(FunctionalState NewState); +void TIM1_UpdateRequestConfig(TIM1_UpdateSource_TypeDef TIM1_UpdateSource); +void TIM1_SelectHallSensor(FunctionalState NewState); +void TIM1_SelectOnePulseMode(TIM1_OPMode_TypeDef TIM1_OPMode); +void TIM1_SelectOutputTrigger(TIM1_TRGOSource_TypeDef TIM1_TRGOSource); +void TIM1_SelectSlaveMode(TIM1_SlaveMode_TypeDef TIM1_SlaveMode); +void TIM1_SelectMasterSlaveMode(FunctionalState NewState); +void TIM1_EncoderInterfaceConfig(TIM1_EncoderMode_TypeDef TIM1_EncoderMode, + TIM1_ICPolarity_TypeDef TIM1_IC1Polarity, + TIM1_ICPolarity_TypeDef TIM1_IC2Polarity); +void TIM1_PrescalerConfig(uint16_t Prescaler, TIM1_PSCReloadMode_TypeDef TIM1_PSCReloadMode); +void TIM1_CounterModeConfig(TIM1_CounterMode_TypeDef TIM1_CounterMode); +void TIM1_ForcedOC1Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction); +void TIM1_ForcedOC2Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction); +void TIM1_ForcedOC3Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction); +void TIM1_ForcedOC4Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction); +void TIM1_ARRPreloadConfig(FunctionalState NewState); +void TIM1_SelectCOM(FunctionalState NewState); +void TIM1_CCPreloadControl(FunctionalState NewState); +void TIM1_OC1PreloadConfig(FunctionalState NewState); +void TIM1_OC2PreloadConfig(FunctionalState NewState); +void TIM1_OC3PreloadConfig(FunctionalState NewState); +void TIM1_OC4PreloadConfig(FunctionalState NewState); +void TIM1_OC1FastConfig(FunctionalState NewState); +void TIM1_OC2FastConfig(FunctionalState NewState); +void TIM1_OC3FastConfig(FunctionalState NewState); +void TIM1_OC4FastConfig(FunctionalState NewState); +void TIM1_GenerateEvent(TIM1_EventSource_TypeDef TIM1_EventSource); +void TIM1_OC1PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity); +void TIM1_OC1NPolarityConfig(TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity); +void TIM1_OC2PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity); +void TIM1_OC2NPolarityConfig(TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity); +void TIM1_OC3PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity); +void TIM1_OC3NPolarityConfig(TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity); +void TIM1_OC4PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity); +void TIM1_CCxCmd(TIM1_Channel_TypeDef TIM1_Channel, FunctionalState NewState); +void TIM1_CCxNCmd(TIM1_Channel_TypeDef TIM1_Channel, FunctionalState NewState); +void TIM1_SelectOCxM(TIM1_Channel_TypeDef TIM1_Channel, TIM1_OCMode_TypeDef TIM1_OCMode); +void TIM1_SetCounter(uint16_t Counter); +void TIM1_SetAutoreload(uint16_t Autoreload); +void TIM1_SetCompare1(uint16_t Compare1); +void TIM1_SetCompare2(uint16_t Compare2); +void TIM1_SetCompare3(uint16_t Compare3); +void TIM1_SetCompare4(uint16_t Compare4); +void TIM1_SetIC1Prescaler(TIM1_ICPSC_TypeDef TIM1_IC1Prescaler); +void TIM1_SetIC2Prescaler(TIM1_ICPSC_TypeDef TIM1_IC2Prescaler); +void TIM1_SetIC3Prescaler(TIM1_ICPSC_TypeDef TIM1_IC3Prescaler); +void TIM1_SetIC4Prescaler(TIM1_ICPSC_TypeDef TIM1_IC4Prescaler); +uint16_t TIM1_GetCapture1(void); +uint16_t TIM1_GetCapture2(void); +uint16_t TIM1_GetCapture3(void); +uint16_t TIM1_GetCapture4(void); +uint16_t TIM1_GetCounter(void); +uint16_t TIM1_GetPrescaler(void); +FlagStatus TIM1_GetFlagStatus(TIM1_FLAG_TypeDef TIM1_FLAG); +void TIM1_ClearFlag(TIM1_FLAG_TypeDef TIM1_FLAG); +ITStatus TIM1_GetITStatus(TIM1_IT_TypeDef TIM1_IT); +void TIM1_ClearITPendingBit(TIM1_IT_TypeDef TIM1_IT); + +/** + * @} + */ + +#endif /* __STM8S_TIM1_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_tim2.h b/4_EXT_INT_1PORT/lib/inc/stm8s_tim2.h new file mode 100644 index 0000000..3f44a9b --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_tim2.h @@ -0,0 +1,342 @@ +/** + ****************************************************************************** + * @file stm8s_tim2.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the TIM2 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_TIM2_H +#define __STM8S_TIM2_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + + +/** TIM2 Forced Action */ +typedef enum +{ + TIM2_FORCEDACTION_ACTIVE = ((uint8_t)0x50), + TIM2_FORCEDACTION_INACTIVE = ((uint8_t)0x40) +}TIM2_ForcedAction_TypeDef; + +#define IS_TIM2_FORCED_ACTION_OK(ACTION) (((ACTION) == TIM2_FORCEDACTION_ACTIVE) || \ + ((ACTION) == TIM2_FORCEDACTION_INACTIVE)) + +/** TIM2 Prescaler */ +typedef enum +{ + TIM2_PRESCALER_1 = ((uint8_t)0x00), + TIM2_PRESCALER_2 = ((uint8_t)0x01), + TIM2_PRESCALER_4 = ((uint8_t)0x02), + TIM2_PRESCALER_8 = ((uint8_t)0x03), + TIM2_PRESCALER_16 = ((uint8_t)0x04), + TIM2_PRESCALER_32 = ((uint8_t)0x05), + TIM2_PRESCALER_64 = ((uint8_t)0x06), + TIM2_PRESCALER_128 = ((uint8_t)0x07), + TIM2_PRESCALER_256 = ((uint8_t)0x08), + TIM2_PRESCALER_512 = ((uint8_t)0x09), + TIM2_PRESCALER_1024 = ((uint8_t)0x0A), + TIM2_PRESCALER_2048 = ((uint8_t)0x0B), + TIM2_PRESCALER_4096 = ((uint8_t)0x0C), + TIM2_PRESCALER_8192 = ((uint8_t)0x0D), + TIM2_PRESCALER_16384 = ((uint8_t)0x0E), + TIM2_PRESCALER_32768 = ((uint8_t)0x0F) +}TIM2_Prescaler_TypeDef; + +#define IS_TIM2_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM2_PRESCALER_1 ) || \ + ((PRESCALER) == TIM2_PRESCALER_2 ) || \ + ((PRESCALER) == TIM2_PRESCALER_4 ) || \ + ((PRESCALER) == TIM2_PRESCALER_8 ) || \ + ((PRESCALER) == TIM2_PRESCALER_16 ) || \ + ((PRESCALER) == TIM2_PRESCALER_32 ) || \ + ((PRESCALER) == TIM2_PRESCALER_64 ) || \ + ((PRESCALER) == TIM2_PRESCALER_128 ) || \ + ((PRESCALER) == TIM2_PRESCALER_256 ) || \ + ((PRESCALER) == TIM2_PRESCALER_512 ) || \ + ((PRESCALER) == TIM2_PRESCALER_1024 ) || \ + ((PRESCALER) == TIM2_PRESCALER_2048 ) || \ + ((PRESCALER) == TIM2_PRESCALER_4096 ) || \ + ((PRESCALER) == TIM2_PRESCALER_8192 ) || \ + ((PRESCALER) == TIM2_PRESCALER_16384 ) || \ + ((PRESCALER) == TIM2_PRESCALER_32768 )) + +/** TIM2 Output Compare and PWM modes */ +typedef enum +{ + TIM2_OCMODE_TIMING = ((uint8_t)0x00), + TIM2_OCMODE_ACTIVE = ((uint8_t)0x10), + TIM2_OCMODE_INACTIVE = ((uint8_t)0x20), + TIM2_OCMODE_TOGGLE = ((uint8_t)0x30), + TIM2_OCMODE_PWM1 = ((uint8_t)0x60), + TIM2_OCMODE_PWM2 = ((uint8_t)0x70) +}TIM2_OCMode_TypeDef; + +#define IS_TIM2_OC_MODE_OK(MODE) (((MODE) == TIM2_OCMODE_TIMING) || \ + ((MODE) == TIM2_OCMODE_ACTIVE) || \ + ((MODE) == TIM2_OCMODE_INACTIVE) || \ + ((MODE) == TIM2_OCMODE_TOGGLE)|| \ + ((MODE) == TIM2_OCMODE_PWM1) || \ + ((MODE) == TIM2_OCMODE_PWM2)) + +#define IS_TIM2_OCM_OK(MODE)(((MODE) == TIM2_OCMODE_TIMING) || \ + ((MODE) == TIM2_OCMODE_ACTIVE) || \ + ((MODE) == TIM2_OCMODE_INACTIVE) || \ + ((MODE) == TIM2_OCMODE_TOGGLE)|| \ + ((MODE) == TIM2_OCMODE_PWM1) || \ + ((MODE) == TIM2_OCMODE_PWM2) || \ + ((MODE) == (uint8_t)TIM2_FORCEDACTION_ACTIVE) || \ + ((MODE) == (uint8_t)TIM2_FORCEDACTION_INACTIVE)) + +/** TIM2 One Pulse Mode */ +typedef enum +{ + TIM2_OPMODE_SINGLE = ((uint8_t)0x01), + TIM2_OPMODE_REPETITIVE = ((uint8_t)0x00) +}TIM2_OPMode_TypeDef; + +#define IS_TIM2_OPM_MODE_OK(MODE) (((MODE) == TIM2_OPMODE_SINGLE) || \ + ((MODE) == TIM2_OPMODE_REPETITIVE)) + +/** TIM2 Channel */ +typedef enum +{ + TIM2_CHANNEL_1 = ((uint8_t)0x00), + TIM2_CHANNEL_2 = ((uint8_t)0x01), + TIM2_CHANNEL_3 = ((uint8_t)0x02) +}TIM2_Channel_TypeDef; + +#define IS_TIM2_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM2_CHANNEL_1) || \ + ((CHANNEL) == TIM2_CHANNEL_2) || \ + ((CHANNEL) == TIM2_CHANNEL_3)) + +#define IS_TIM2_PWMI_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM2_CHANNEL_1) || \ + ((CHANNEL) == TIM2_CHANNEL_2)) + +/** TIM2 Output Compare Polarity */ +typedef enum +{ + TIM2_OCPOLARITY_HIGH = ((uint8_t)0x00), + TIM2_OCPOLARITY_LOW = ((uint8_t)0x22) +}TIM2_OCPolarity_TypeDef; + +#define IS_TIM2_OC_POLARITY_OK(POLARITY) (((POLARITY) == TIM2_OCPOLARITY_HIGH) || \ + ((POLARITY) == TIM2_OCPOLARITY_LOW)) + +/** TIM2 Output Compare states */ +typedef enum +{ + TIM2_OUTPUTSTATE_DISABLE = ((uint8_t)0x00), + TIM2_OUTPUTSTATE_ENABLE = ((uint8_t)0x11) +}TIM2_OutputState_TypeDef; + +#define IS_TIM2_OUTPUT_STATE_OK(STATE) (((STATE) == TIM2_OUTPUTSTATE_DISABLE) || \ + ((STATE) == TIM2_OUTPUTSTATE_ENABLE)) + +/** TIM2 Input Capture Polarity */ +typedef enum +{ + TIM2_ICPOLARITY_RISING = ((uint8_t)0x00), + TIM2_ICPOLARITY_FALLING = ((uint8_t)0x44) +}TIM2_ICPolarity_TypeDef; + +#define IS_TIM2_IC_POLARITY_OK(POLARITY) (((POLARITY) == TIM2_ICPOLARITY_RISING) || \ + ((POLARITY) == TIM2_ICPOLARITY_FALLING)) + +/** TIM2 Input Capture Selection */ +typedef enum +{ + TIM2_ICSELECTION_DIRECTTI = ((uint8_t)0x01), + TIM2_ICSELECTION_INDIRECTTI = ((uint8_t)0x02), + TIM2_ICSELECTION_TRGI = ((uint8_t)0x03) +}TIM2_ICSelection_TypeDef; + +#define IS_TIM2_IC_SELECTION_OK(SELECTION) (((SELECTION) == TIM2_ICSELECTION_DIRECTTI) || \ + ((SELECTION) == TIM2_ICSELECTION_INDIRECTTI) || \ + ((SELECTION) == TIM2_ICSELECTION_TRGI)) + +#define IS_TIM2_IC_SELECTION1_OK(SELECTION) (((SELECTION) == TIM2_ICSELECTION_DIRECTTI) || \ + ((SELECTION) == TIM2_ICSELECTION_TRGI)) + +/** TIM2 Input Capture Prescaler */ +typedef enum +{ + TIM2_ICPSC_DIV1 = ((uint8_t)0x00), + TIM2_ICPSC_DIV2 = ((uint8_t)0x04), + TIM2_ICPSC_DIV4 = ((uint8_t)0x08), + TIM2_ICPSC_DIV8 = ((uint8_t)0x0C) +}TIM2_ICPSC_TypeDef; + +#define IS_TIM2_IC_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM2_ICPSC_DIV1) || \ + ((PRESCALER) == TIM2_ICPSC_DIV2) || \ + ((PRESCALER) == TIM2_ICPSC_DIV4) || \ + ((PRESCALER) == TIM2_ICPSC_DIV8)) + +/** TIM2 Input Capture Filer Value */ +#define IS_TIM2_IC_FILTER_OK(ICFILTER) ((ICFILTER) <= 0x0F) + +/** TIM2 interrupt sources */ +typedef enum +{ + TIM2_IT_UPDATE = ((uint8_t)0x01), + TIM2_IT_CC1 = ((uint8_t)0x02), + TIM2_IT_CC2 = ((uint8_t)0x04), + TIM2_IT_CC3 = ((uint8_t)0x08) +}TIM2_IT_TypeDef; + +#define IS_TIM2_IT_OK(IT) (((IT) != 0x00) && ((IT) <= 0x0F)) + +#define IS_TIM2_GET_IT_OK(IT) (((IT) == TIM2_IT_UPDATE) || \ + ((IT) == TIM2_IT_CC1) || \ + ((IT) == TIM2_IT_CC2) || \ + ((IT) == TIM2_IT_CC3)) + +/** TIM2 Prescaler Reload Mode */ +typedef enum +{ + TIM2_PSCRELOADMODE_UPDATE = ((uint8_t)0x00), + TIM2_PSCRELOADMODE_IMMEDIATE = ((uint8_t)0x01) +}TIM2_PSCReloadMode_TypeDef; + +#define IS_TIM2_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM2_PSCRELOADMODE_UPDATE) || \ + ((RELOAD) == TIM2_PSCRELOADMODE_IMMEDIATE)) + +/** TIM2 Event Source */ +typedef enum +{ + TIM2_EVENTSOURCE_UPDATE = ((uint8_t)0x01), + TIM2_EVENTSOURCE_CC1 = ((uint8_t)0x02), + TIM2_EVENTSOURCE_CC2 = ((uint8_t)0x04), + TIM2_EVENTSOURCE_CC3 = ((uint8_t)0x08) +}TIM2_EventSource_TypeDef; + +#define IS_TIM2_EVENT_SOURCE_OK(SOURCE) (((SOURCE) != 0x00)) + +/** TIM2 Update Source */ +typedef enum +{ + TIM2_UPDATESOURCE_GLOBAL = ((uint8_t)0x00), + TIM2_UPDATESOURCE_REGULAR = ((uint8_t)0x01) +}TIM2_UpdateSource_TypeDef; + +#define IS_TIM2_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM2_UPDATESOURCE_GLOBAL) || \ + ((SOURCE) == TIM2_UPDATESOURCE_REGULAR)) + +/** TIM2 Flags */ +typedef enum +{ + TIM2_FLAG_UPDATE = ((uint16_t)0x0001), + TIM2_FLAG_CC1 = ((uint16_t)0x0002), + TIM2_FLAG_CC2 = ((uint16_t)0x0004), + TIM2_FLAG_CC3 = ((uint16_t)0x0008), + TIM2_FLAG_CC1OF = ((uint16_t)0x0200), + TIM2_FLAG_CC2OF = ((uint16_t)0x0400), + TIM2_FLAG_CC3OF = ((uint16_t)0x0800) +}TIM2_FLAG_TypeDef; + +#define IS_TIM2_GET_FLAG_OK(FLAG) (((FLAG) == TIM2_FLAG_UPDATE) || \ + ((FLAG) == TIM2_FLAG_CC1) || \ + ((FLAG) == TIM2_FLAG_CC2) || \ + ((FLAG) == TIM2_FLAG_CC3) || \ + ((FLAG) == TIM2_FLAG_CC1OF) || \ + ((FLAG) == TIM2_FLAG_CC2OF) || \ + ((FLAG) == TIM2_FLAG_CC3OF)) + +#define IS_TIM2_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & 0xF1F0) == 0x0000) && ((uint16_t)(FLAG) != 0x0000)) + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup TIM2_Exported_Functions + * @{ + */ + +void TIM2_DeInit(void); +void TIM2_TimeBaseInit(TIM2_Prescaler_TypeDef TIM2_Prescaler, uint16_t TIM2_Period); +void TIM2_OC1Init(TIM2_OCMode_TypeDef TIM2_OCMode, TIM2_OutputState_TypeDef TIM2_OutputState, uint16_t TIM2_Pulse, TIM2_OCPolarity_TypeDef TIM2_OCPolarity); +void TIM2_OC2Init(TIM2_OCMode_TypeDef TIM2_OCMode, TIM2_OutputState_TypeDef TIM2_OutputState, uint16_t TIM2_Pulse, TIM2_OCPolarity_TypeDef TIM2_OCPolarity); +void TIM2_OC3Init(TIM2_OCMode_TypeDef TIM2_OCMode, TIM2_OutputState_TypeDef TIM2_OutputState, uint16_t TIM2_Pulse, TIM2_OCPolarity_TypeDef TIM2_OCPolarity); +void TIM2_ICInit(TIM2_Channel_TypeDef TIM2_Channel, TIM2_ICPolarity_TypeDef TIM2_ICPolarity, TIM2_ICSelection_TypeDef TIM2_ICSelection, TIM2_ICPSC_TypeDef TIM2_ICPrescaler, uint8_t TIM2_ICFilter); +void TIM2_PWMIConfig(TIM2_Channel_TypeDef TIM2_Channel, TIM2_ICPolarity_TypeDef TIM2_ICPolarity, TIM2_ICSelection_TypeDef TIM2_ICSelection, TIM2_ICPSC_TypeDef TIM2_ICPrescaler, uint8_t TIM2_ICFilter); +void TIM2_Cmd(FunctionalState NewState); +void TIM2_ITConfig(TIM2_IT_TypeDef TIM2_IT, FunctionalState NewState); +void TIM2_InternalClockConfig(void); +void TIM2_UpdateDisableConfig(FunctionalState NewState); +void TIM2_UpdateRequestConfig(TIM2_UpdateSource_TypeDef TIM2_UpdateSource); +void TIM2_SelectOnePulseMode(TIM2_OPMode_TypeDef TIM2_OPMode); +void TIM2_PrescalerConfig(TIM2_Prescaler_TypeDef Prescaler, TIM2_PSCReloadMode_TypeDef TIM2_PSCReloadMode); +void TIM2_ForcedOC1Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction); +void TIM2_ForcedOC2Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction); +void TIM2_ForcedOC3Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction); +void TIM2_ARRPreloadConfig(FunctionalState NewState); +void TIM2_CCPreloadControl(FunctionalState NewState); +void TIM2_OC1PreloadConfig(FunctionalState NewState); +void TIM2_OC2PreloadConfig(FunctionalState NewState); +void TIM2_OC3PreloadConfig(FunctionalState NewState); +void TIM2_GenerateEvent(TIM2_EventSource_TypeDef TIM2_EventSource); +void TIM2_OC1PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity); +void TIM2_OC2PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity); +void TIM2_OC3PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity); +void TIM2_CCxCmd(TIM2_Channel_TypeDef TIM2_Channel, FunctionalState NewState); +void TIM2_SelectOCxM(TIM2_Channel_TypeDef TIM2_Channel, TIM2_OCMode_TypeDef TIM2_OCMode); +void TIM2_SetCounter(uint16_t Counter); +void TIM2_SetAutoreload(uint16_t Autoreload); +void TIM2_SetCompare1(uint16_t Compare1); +void TIM2_SetCompare2(uint16_t Compare2); +void TIM2_SetCompare3(uint16_t Compare3); +void TIM2_SetIC1Prescaler(TIM2_ICPSC_TypeDef TIM2_IC1Prescaler); +void TIM2_SetIC2Prescaler(TIM2_ICPSC_TypeDef TIM2_IC2Prescaler); +void TIM2_SetIC3Prescaler(TIM2_ICPSC_TypeDef TIM2_IC3Prescaler); +uint16_t TIM2_GetCapture1(void); +uint16_t TIM2_GetCapture2(void); +uint16_t TIM2_GetCapture3(void); +uint16_t TIM2_GetCounter(void); +TIM2_Prescaler_TypeDef TIM2_GetPrescaler(void); +FlagStatus TIM2_GetFlagStatus(TIM2_FLAG_TypeDef TIM2_FLAG); +void TIM2_ClearFlag(TIM2_FLAG_TypeDef TIM2_FLAG); +ITStatus TIM2_GetITStatus(TIM2_IT_TypeDef TIM2_IT); +void TIM2_ClearITPendingBit(TIM2_IT_TypeDef TIM2_IT); + +/** + * @} + */ + +#endif /* __STM8S_TIM2_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_tim3.h b/4_EXT_INT_1PORT/lib/inc/stm8s_tim3.h new file mode 100644 index 0000000..9472766 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_tim3.h @@ -0,0 +1,327 @@ +/** + ****************************************************************************** + * @file stm8s_tim3.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the TIM3 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_TIM3_H +#define __STM8S_TIM3_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup TIM3_Exported_Types + * @{ + */ + +/** TIM3 Forced Action */ +typedef enum +{ + TIM3_FORCEDACTION_ACTIVE = ((uint8_t)0x50), + TIM3_FORCEDACTION_INACTIVE = ((uint8_t)0x40) +} TIM3_ForcedAction_TypeDef; + +#define IS_TIM3_FORCED_ACTION_OK(ACTION) (((ACTION) == TIM3_FORCEDACTION_ACTIVE) || \ + ((ACTION) == TIM3_FORCEDACTION_INACTIVE)) + +/** TIM3 Prescaler */ +typedef enum +{ + TIM3_PRESCALER_1 = ((uint8_t)0x00), + TIM3_PRESCALER_2 = ((uint8_t)0x01), + TIM3_PRESCALER_4 = ((uint8_t)0x02), + TIM3_PRESCALER_8 = ((uint8_t)0x03), + TIM3_PRESCALER_16 = ((uint8_t)0x04), + TIM3_PRESCALER_32 = ((uint8_t)0x05), + TIM3_PRESCALER_64 = ((uint8_t)0x06), + TIM3_PRESCALER_128 = ((uint8_t)0x07), + TIM3_PRESCALER_256 = ((uint8_t)0x08), + TIM3_PRESCALER_512 = ((uint8_t)0x09), + TIM3_PRESCALER_1024 = ((uint8_t)0x0A), + TIM3_PRESCALER_2048 = ((uint8_t)0x0B), + TIM3_PRESCALER_4096 = ((uint8_t)0x0C), + TIM3_PRESCALER_8192 = ((uint8_t)0x0D), + TIM3_PRESCALER_16384 = ((uint8_t)0x0E), + TIM3_PRESCALER_32768 = ((uint8_t)0x0F) +} TIM3_Prescaler_TypeDef; + +#define IS_TIM3_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM3_PRESCALER_1 ) || \ + ((PRESCALER) == TIM3_PRESCALER_2 ) || \ + ((PRESCALER) == TIM3_PRESCALER_4 ) || \ + ((PRESCALER) == TIM3_PRESCALER_8 ) || \ + ((PRESCALER) == TIM3_PRESCALER_16 ) || \ + ((PRESCALER) == TIM3_PRESCALER_32 ) || \ + ((PRESCALER) == TIM3_PRESCALER_64 ) || \ + ((PRESCALER) == TIM3_PRESCALER_128 ) || \ + ((PRESCALER) == TIM3_PRESCALER_256 ) || \ + ((PRESCALER) == TIM3_PRESCALER_512 ) || \ + ((PRESCALER) == TIM3_PRESCALER_1024 ) || \ + ((PRESCALER) == TIM3_PRESCALER_2048 ) || \ + ((PRESCALER) == TIM3_PRESCALER_4096 ) || \ + ((PRESCALER) == TIM3_PRESCALER_8192 ) || \ + ((PRESCALER) == TIM3_PRESCALER_16384 ) || \ + ((PRESCALER) == TIM3_PRESCALER_32768 )) + +/** TIM3 Output Compare and PWM modes */ +typedef enum +{ + TIM3_OCMODE_TIMING = ((uint8_t)0x00), + TIM3_OCMODE_ACTIVE = ((uint8_t)0x10), + TIM3_OCMODE_INACTIVE = ((uint8_t)0x20), + TIM3_OCMODE_TOGGLE = ((uint8_t)0x30), + TIM3_OCMODE_PWM1 = ((uint8_t)0x60), + TIM3_OCMODE_PWM2 = ((uint8_t)0x70) +} TIM3_OCMode_TypeDef; + +#define IS_TIM3_OC_MODE_OK(MODE) (((MODE) == TIM3_OCMODE_TIMING) || \ + ((MODE) == TIM3_OCMODE_ACTIVE) || \ + ((MODE) == TIM3_OCMODE_INACTIVE) || \ + ((MODE) == TIM3_OCMODE_TOGGLE)|| \ + ((MODE) == TIM3_OCMODE_PWM1) || \ + ((MODE) == TIM3_OCMODE_PWM2)) + +#define IS_TIM3_OCM_OK(MODE)(((MODE) == TIM3_OCMODE_TIMING) || \ + ((MODE) == TIM3_OCMODE_ACTIVE) || \ + ((MODE) == TIM3_OCMODE_INACTIVE) || \ + ((MODE) == TIM3_OCMODE_TOGGLE)|| \ + ((MODE) == TIM3_OCMODE_PWM1) || \ + ((MODE) == TIM3_OCMODE_PWM2) || \ + ((MODE) == (uint8_t)TIM3_FORCEDACTION_ACTIVE) || \ + ((MODE) == (uint8_t)TIM3_FORCEDACTION_INACTIVE)) + +/** TIM3 One Pulse Mode */ +typedef enum +{ + TIM3_OPMODE_SINGLE = ((uint8_t)0x01), + TIM3_OPMODE_REPETITIVE = ((uint8_t)0x00) +} TIM3_OPMode_TypeDef; + +#define IS_TIM3_OPM_MODE_OK(MODE) (((MODE) == TIM3_OPMODE_SINGLE) || \ + ((MODE) == TIM3_OPMODE_REPETITIVE)) + +/** TIM3 Channel */ + +typedef enum +{ + TIM3_CHANNEL_1 = ((uint8_t)0x00), + TIM3_CHANNEL_2 = ((uint8_t)0x01) +} TIM3_Channel_TypeDef; + +#define IS_TIM3_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM3_CHANNEL_1) || \ + ((CHANNEL) == TIM3_CHANNEL_2)) + +#define IS_TIM3_PWMI_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM3_CHANNEL_1) || \ + ((CHANNEL) == TIM3_CHANNEL_2)) + +/** TIM3 Output Compare Polarity */ +typedef enum +{ + TIM3_OCPOLARITY_HIGH = ((uint8_t)0x00), + TIM3_OCPOLARITY_LOW = ((uint8_t)0x22) +} TIM3_OCPolarity_TypeDef; + +#define IS_TIM3_OC_POLARITY_OK(POLARITY) (((POLARITY) == TIM3_OCPOLARITY_HIGH) || \ + ((POLARITY) == TIM3_OCPOLARITY_LOW)) + +/** TIM3 Output Compare states */ +typedef enum +{ + TIM3_OUTPUTSTATE_DISABLE = ((uint8_t)0x00), + TIM3_OUTPUTSTATE_ENABLE = ((uint8_t)0x11) +} TIM3_OutputState_TypeDef; + +#define IS_TIM3_OUTPUT_STATE_OK(STATE) (((STATE) == TIM3_OUTPUTSTATE_DISABLE) || \ + ((STATE) == TIM3_OUTPUTSTATE_ENABLE)) + +/** TIM3 Input Capture Polarity */ +typedef enum +{ + TIM3_ICPOLARITY_RISING = ((uint8_t)0x00), + TIM3_ICPOLARITY_FALLING = ((uint8_t)0x44) +} TIM3_ICPolarity_TypeDef; + +#define IS_TIM3_IC_POLARITY_OK(POLARITY) (((POLARITY) == TIM3_ICPOLARITY_RISING) || \ + ((POLARITY) == TIM3_ICPOLARITY_FALLING)) + +/** TIM3 Input Capture Selection */ +typedef enum +{ + TIM3_ICSELECTION_DIRECTTI = ((uint8_t)0x01), + TIM3_ICSELECTION_INDIRECTTI = ((uint8_t)0x02), + TIM3_ICSELECTION_TRGI = ((uint8_t)0x03) +} TIM3_ICSelection_TypeDef; + +#define IS_TIM3_IC_SELECTION_OK(SELECTION) (((SELECTION) == TIM3_ICSELECTION_DIRECTTI) || \ + ((SELECTION) == TIM3_ICSELECTION_INDIRECTTI) || \ + ((SELECTION) == TIM3_ICSELECTION_TRGI)) + +/** TIM3 Input Capture Prescaler */ +typedef enum +{ + TIM3_ICPSC_DIV1 = ((uint8_t)0x00), + TIM3_ICPSC_DIV2 = ((uint8_t)0x04), + TIM3_ICPSC_DIV4 = ((uint8_t)0x08), + TIM3_ICPSC_DIV8 = ((uint8_t)0x0C) +} TIM3_ICPSC_TypeDef; + +#define IS_TIM3_IC_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM3_ICPSC_DIV1) || \ + ((PRESCALER) == TIM3_ICPSC_DIV2) || \ + ((PRESCALER) == TIM3_ICPSC_DIV4) || \ + ((PRESCALER) == TIM3_ICPSC_DIV8)) + +/** TIM3 Input Capture Filer Value */ +#define IS_TIM3_IC_FILTER_OK(ICFILTER) ((ICFILTER) <= 0x0F) + +/** TIM3 interrupt sources */ +typedef enum +{ + TIM3_IT_UPDATE = ((uint8_t)0x01), + TIM3_IT_CC1 = ((uint8_t)0x02), + TIM3_IT_CC2 = ((uint8_t)0x04) +} TIM3_IT_TypeDef; + +#define IS_TIM3_IT_OK(IT) (((IT) != 0x00) && ((IT) <= 0x07)) + +#define IS_TIM3_GET_IT_OK(IT) (((IT) == TIM3_IT_UPDATE) || \ + ((IT) == TIM3_IT_CC1) || \ + ((IT) == TIM3_IT_CC2)) + +/** TIM3 Prescaler Reload Mode */ +typedef enum +{ + TIM3_PSCRELOADMODE_UPDATE = ((uint8_t)0x00), + TIM3_PSCRELOADMODE_IMMEDIATE = ((uint8_t)0x01) +} TIM3_PSCReloadMode_TypeDef; + +#define IS_TIM3_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM3_PSCRELOADMODE_UPDATE) || \ + ((RELOAD) == TIM3_PSCRELOADMODE_IMMEDIATE)) + +/** TIM3 Event Source */ +typedef enum +{ + TIM3_EVENTSOURCE_UPDATE = ((uint8_t)0x01), + TIM3_EVENTSOURCE_CC1 = ((uint8_t)0x02), + TIM3_EVENTSOURCE_CC2 = ((uint8_t)0x04) +} TIM3_EventSource_TypeDef; + +#define IS_TIM3_EVENT_SOURCE_OK(SOURCE) (((SOURCE) != 0x00)) + +/** TIM3 Update Source */ +typedef enum +{ + TIM3_UPDATESOURCE_GLOBAL = ((uint8_t)0x00), + TIM3_UPDATESOURCE_REGULAR = ((uint8_t)0x01) +} TIM3_UpdateSource_TypeDef; + +#define IS_TIM3_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM3_UPDATESOURCE_GLOBAL) || \ + ((SOURCE) == TIM3_UPDATESOURCE_REGULAR)) + +/** TIM3 Flags */ +typedef enum +{ + TIM3_FLAG_UPDATE = ((uint16_t)0x0001), + TIM3_FLAG_CC1 = ((uint16_t)0x0002), + TIM3_FLAG_CC2 = ((uint16_t)0x0004), + TIM3_FLAG_CC1OF = ((uint16_t)0x0200), + TIM3_FLAG_CC2OF = ((uint16_t)0x0400) +} TIM3_FLAG_TypeDef; + +#define IS_TIM3_GET_FLAG_OK(FLAG) (((FLAG) == TIM3_FLAG_UPDATE) || \ + ((FLAG) == TIM3_FLAG_CC1) || \ + ((FLAG) == TIM3_FLAG_CC2) || \ + ((FLAG) == TIM3_FLAG_CC1OF) || \ + ((FLAG) == TIM3_FLAG_CC2OF) ) + +#define IS_TIM3_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & 0xF9F8) == 0x0000) && ((uint16_t)(FLAG)!= 0x0000)) + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup TIM3_Exported_Functions + * @{ + */ + +void TIM3_DeInit(void); +void TIM3_TimeBaseInit(TIM3_Prescaler_TypeDef TIM3_Prescaler, uint16_t TIM3_Period); +void TIM3_OC1Init(TIM3_OCMode_TypeDef TIM3_OCMode, TIM3_OutputState_TypeDef TIM3_OutputState, uint16_t TIM3_Pulse, TIM3_OCPolarity_TypeDef TIM3_OCPolarity); +void TIM3_OC2Init(TIM3_OCMode_TypeDef TIM3_OCMode, TIM3_OutputState_TypeDef TIM3_OutputState, uint16_t TIM3_Pulse, TIM3_OCPolarity_TypeDef TIM3_OCPolarity); +void TIM3_ICInit(TIM3_Channel_TypeDef TIM3_Channel, TIM3_ICPolarity_TypeDef TIM3_ICPolarity, TIM3_ICSelection_TypeDef TIM3_ICSelection, TIM3_ICPSC_TypeDef TIM3_ICPrescaler, uint8_t TIM3_ICFilter); +void TIM3_PWMIConfig(TIM3_Channel_TypeDef TIM3_Channel, TIM3_ICPolarity_TypeDef TIM3_ICPolarity, TIM3_ICSelection_TypeDef TIM3_ICSelection, TIM3_ICPSC_TypeDef TIM3_ICPrescaler, uint8_t TIM3_ICFilter); +void TIM3_Cmd(FunctionalState NewState); +void TIM3_ITConfig(TIM3_IT_TypeDef TIM3_IT, FunctionalState NewState); +void TIM3_InternalClockConfig(void); +void TIM3_UpdateDisableConfig(FunctionalState NewState); +void TIM3_UpdateRequestConfig(TIM3_UpdateSource_TypeDef TIM3_UpdateSource); +void TIM3_SelectOnePulseMode(TIM3_OPMode_TypeDef TIM3_OPMode); +void TIM3_PrescalerConfig(TIM3_Prescaler_TypeDef Prescaler, TIM3_PSCReloadMode_TypeDef TIM3_PSCReloadMode); +void TIM3_ForcedOC1Config(TIM3_ForcedAction_TypeDef TIM3_ForcedAction); +void TIM3_ForcedOC2Config(TIM3_ForcedAction_TypeDef TIM3_ForcedAction); +void TIM3_ARRPreloadConfig(FunctionalState NewState); +void TIM3_CCPreloadControl(FunctionalState NewState); +void TIM3_OC1PreloadConfig(FunctionalState NewState); +void TIM3_OC2PreloadConfig(FunctionalState NewState); +void TIM3_GenerateEvent(TIM3_EventSource_TypeDef TIM3_EventSource); +void TIM3_OC1PolarityConfig(TIM3_OCPolarity_TypeDef TIM3_OCPolarity); +void TIM3_OC2PolarityConfig(TIM3_OCPolarity_TypeDef TIM3_OCPolarity); +void TIM3_CCxCmd(TIM3_Channel_TypeDef TIM3_Channel, FunctionalState NewState); +void TIM3_SelectOCxM(TIM3_Channel_TypeDef TIM3_Channel, TIM3_OCMode_TypeDef TIM3_OCMode); +void TIM3_SetCounter(uint16_t Counter); +void TIM3_SetAutoreload(uint16_t Autoreload); +void TIM3_SetCompare1(uint16_t Compare1); +void TIM3_SetCompare2(uint16_t Compare2); +void TIM3_SetIC1Prescaler(TIM3_ICPSC_TypeDef TIM3_IC1Prescaler); +void TIM3_SetIC2Prescaler(TIM3_ICPSC_TypeDef TIM3_IC2Prescaler); +uint16_t TIM3_GetCapture1(void); +uint16_t TIM3_GetCapture2(void); +uint16_t TIM3_GetCounter(void); +TIM3_Prescaler_TypeDef TIM3_GetPrescaler(void); +FlagStatus TIM3_GetFlagStatus(TIM3_FLAG_TypeDef TIM3_FLAG); +void TIM3_ClearFlag(TIM3_FLAG_TypeDef TIM3_FLAG); +ITStatus TIM3_GetITStatus(TIM3_IT_TypeDef TIM3_IT); +void TIM3_ClearITPendingBit(TIM3_IT_TypeDef TIM3_IT); + +/** + * @} + */ + +#endif /* __STM8S_TIM3_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_tim4.h b/4_EXT_INT_1PORT/lib/inc/stm8s_tim4.h new file mode 100644 index 0000000..ee12eb2 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_tim4.h @@ -0,0 +1,169 @@ +/** + ****************************************************************************** + * @file stm8s_tim4.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the TIM4 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_TIM4_H +#define __STM8S_TIM4_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup TIM4_Exported_Types + * @{ + */ + + + +/** TIM4 Prescaler */ +typedef enum +{ + TIM4_PRESCALER_1 = ((uint8_t)0x00), + TIM4_PRESCALER_2 = ((uint8_t)0x01), + TIM4_PRESCALER_4 = ((uint8_t)0x02), + TIM4_PRESCALER_8 = ((uint8_t)0x03), + TIM4_PRESCALER_16 = ((uint8_t)0x04), + TIM4_PRESCALER_32 = ((uint8_t)0x05), + TIM4_PRESCALER_64 = ((uint8_t)0x06), + TIM4_PRESCALER_128 = ((uint8_t)0x07) +} TIM4_Prescaler_TypeDef; + +#define IS_TIM4_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM4_PRESCALER_1 ) || \ + ((PRESCALER) == TIM4_PRESCALER_2 ) || \ + ((PRESCALER) == TIM4_PRESCALER_4 ) || \ + ((PRESCALER) == TIM4_PRESCALER_8 ) || \ + ((PRESCALER) == TIM4_PRESCALER_16 ) || \ + ((PRESCALER) == TIM4_PRESCALER_32 ) || \ + ((PRESCALER) == TIM4_PRESCALER_64 ) || \ + ((PRESCALER) == TIM4_PRESCALER_128 ) ) + +/** TIM4 One Pulse Mode */ +typedef enum +{ + TIM4_OPMODE_SINGLE = ((uint8_t)0x01), + TIM4_OPMODE_REPETITIVE = ((uint8_t)0x00) +} TIM4_OPMode_TypeDef; + +#define IS_TIM4_OPM_MODE_OK(MODE) (((MODE) == TIM4_OPMODE_SINGLE) || \ + ((MODE) == TIM4_OPMODE_REPETITIVE)) + +/** TIM4 Prescaler Reload Mode */ +typedef enum +{ + TIM4_PSCRELOADMODE_UPDATE = ((uint8_t)0x00), + TIM4_PSCRELOADMODE_IMMEDIATE = ((uint8_t)0x01) +} TIM4_PSCReloadMode_TypeDef; + +#define IS_TIM4_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM4_PSCRELOADMODE_UPDATE) || \ + ((RELOAD) == TIM4_PSCRELOADMODE_IMMEDIATE)) + +/** TIM4 Update Source */ +typedef enum +{ + TIM4_UPDATESOURCE_GLOBAL = ((uint8_t)0x00), + TIM4_UPDATESOURCE_REGULAR = ((uint8_t)0x01) +} TIM4_UpdateSource_TypeDef; + +#define IS_TIM4_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM4_UPDATESOURCE_GLOBAL) || \ + ((SOURCE) == TIM4_UPDATESOURCE_REGULAR)) + +/** TIM4 Event Source */ +typedef enum +{ + TIM4_EVENTSOURCE_UPDATE = ((uint8_t)0x01) +}TIM4_EventSource_TypeDef; + +#define IS_TIM4_EVENT_SOURCE_OK(SOURCE) (((SOURCE) == 0x01)) + +/** TIM4 Flags */ +typedef enum +{ + TIM4_FLAG_UPDATE = ((uint8_t)0x01) +}TIM4_FLAG_TypeDef; + +#define IS_TIM4_GET_FLAG_OK(FLAG) ((FLAG) == TIM4_FLAG_UPDATE) + + + +/** TIM4 interrupt sources */ +typedef enum +{ + TIM4_IT_UPDATE = ((uint8_t)0x01) +}TIM4_IT_TypeDef; + +#define IS_TIM4_IT_OK(IT) ((IT) == TIM4_IT_UPDATE) + + + +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup TIM4_Exported_Functions + * @{ + */ +void TIM4_DeInit(void); +void TIM4_TimeBaseInit(TIM4_Prescaler_TypeDef TIM4_Prescaler, uint8_t TIM4_Period); +void TIM4_Cmd(FunctionalState NewState); +void TIM4_ITConfig(TIM4_IT_TypeDef TIM4_IT, FunctionalState NewState); +void TIM4_UpdateDisableConfig(FunctionalState NewState); +void TIM4_UpdateRequestConfig(TIM4_UpdateSource_TypeDef TIM4_UpdateSource); +void TIM4_SelectOnePulseMode(TIM4_OPMode_TypeDef TIM4_OPMode); +void TIM4_PrescalerConfig(TIM4_Prescaler_TypeDef Prescaler, TIM4_PSCReloadMode_TypeDef TIM4_PSCReloadMode); +void TIM4_ARRPreloadConfig(FunctionalState NewState); +void TIM4_GenerateEvent(TIM4_EventSource_TypeDef TIM4_EventSource); +void TIM4_SetCounter(uint8_t Counter); +void TIM4_SetAutoreload(uint8_t Autoreload); +uint8_t TIM4_GetCounter(void); +TIM4_Prescaler_TypeDef TIM4_GetPrescaler(void); +FlagStatus TIM4_GetFlagStatus(TIM4_FLAG_TypeDef TIM4_FLAG); +void TIM4_ClearFlag(TIM4_FLAG_TypeDef TIM4_FLAG); +ITStatus TIM4_GetITStatus(TIM4_IT_TypeDef TIM4_IT); +void TIM4_ClearITPendingBit(TIM4_IT_TypeDef TIM4_IT); + + +/** + * @} + */ + +#endif /* __STM8S_TIM4_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_tim5.h b/4_EXT_INT_1PORT/lib/inc/stm8s_tim5.h new file mode 100644 index 0000000..9a4afdb --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_tim5.h @@ -0,0 +1,478 @@ +/** + ****************************************************************************** + * @file stm8s_tim5.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the TIM5 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_TIM5_H +#define __STM8S_TIM5_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + + +/** TIM5 Forced Action */ +typedef enum +{ + TIM5_FORCEDACTION_ACTIVE =((uint8_t)0x50), + TIM5_FORCEDACTION_INACTIVE =((uint8_t)0x40) +}TIM5_ForcedAction_TypeDef; + +#define IS_TIM5_FORCED_ACTION_OK(ACTION) (((ACTION) == TIM5_FORCEDACTION_ACTIVE) || \ + ((ACTION) == TIM5_FORCEDACTION_INACTIVE)) + +/** TIM5 Prescaler */ +typedef enum +{ + TIM5_PRESCALER_1 =((uint8_t)0x00), + TIM5_PRESCALER_2 =((uint8_t)0x01), + TIM5_PRESCALER_4 =((uint8_t)0x02), + TIM5_PRESCALER_8 =((uint8_t)0x03), + TIM5_PRESCALER_16 =((uint8_t)0x04), + TIM5_PRESCALER_32 =((uint8_t)0x05), + TIM5_PRESCALER_64 =((uint8_t)0x06), + TIM5_PRESCALER_128 =((uint8_t)0x07), + TIM5_PRESCALER_256 =((uint8_t)0x08), + TIM5_PRESCALER_512 =((uint8_t)0x09), + TIM5_PRESCALER_1024 =((uint8_t)0x0A), + TIM5_PRESCALER_2048 =((uint8_t)0x0B), + TIM5_PRESCALER_4096 =((uint8_t)0x0C), + TIM5_PRESCALER_8192 =((uint8_t)0x0D), + TIM5_PRESCALER_16384 =((uint8_t)0x0E), + TIM5_PRESCALER_32768 =((uint8_t)0x0F) +}TIM5_Prescaler_TypeDef; + +#define IS_TIM5_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM5_PRESCALER_1) || \ + ((PRESCALER) == TIM5_PRESCALER_2 ) || \ + ((PRESCALER) == TIM5_PRESCALER_4 ) || \ + ((PRESCALER) == TIM5_PRESCALER_8 ) || \ + ((PRESCALER) == TIM5_PRESCALER_16 ) || \ + ((PRESCALER) == TIM5_PRESCALER_32 ) || \ + ((PRESCALER) == TIM5_PRESCALER_64 ) || \ + ((PRESCALER) == TIM5_PRESCALER_128 ) || \ + ((PRESCALER) == TIM5_PRESCALER_256 ) || \ + ((PRESCALER) == TIM5_PRESCALER_512 ) || \ + ((PRESCALER) == TIM5_PRESCALER_1024 ) || \ + ((PRESCALER) == TIM5_PRESCALER_2048 ) || \ + ((PRESCALER) == TIM5_PRESCALER_4096 ) || \ + ((PRESCALER) == TIM5_PRESCALER_8192 ) || \ + ((PRESCALER) == TIM5_PRESCALER_16384 ) || \ + ((PRESCALER) == TIM5_PRESCALER_32768 )) + +/** TIM5 Output Compare and PWM modes */ +typedef enum +{ + TIM5_OCMODE_TIMING =((uint8_t)0x00), + TIM5_OCMODE_ACTIVE =((uint8_t)0x10), + TIM5_OCMODE_INACTIVE =((uint8_t)0x20), + TIM5_OCMODE_TOGGLE =((uint8_t)0x30), + TIM5_OCMODE_PWM1 =((uint8_t)0x60), + TIM5_OCMODE_PWM2 =((uint8_t)0x70) +}TIM5_OCMode_TypeDef; + +#define IS_TIM5_OC_MODE_OK(MODE) (((MODE) == TIM5_OCMODE_TIMING) || \ + ((MODE) == TIM5_OCMODE_ACTIVE) || \ + ((MODE) == TIM5_OCMODE_INACTIVE) || \ + ((MODE) == TIM5_OCMODE_TOGGLE)|| \ + ((MODE) == TIM5_OCMODE_PWM1) || \ + ((MODE) == TIM5_OCMODE_PWM2)) + +#define IS_TIM5_OCM_OK(MODE)(((MODE) == TIM5_OCMODE_TIMING) || \ + ((MODE) == TIM5_OCMODE_ACTIVE) || \ + ((MODE) == TIM5_OCMODE_INACTIVE) || \ + ((MODE) == TIM5_OCMODE_TOGGLE)|| \ + ((MODE) == TIM5_OCMODE_PWM1) || \ + ((MODE) == TIM5_OCMODE_PWM2) || \ + ((MODE) == (uint8_t)TIM5_FORCEDACTION_ACTIVE) || \ + ((MODE) == (uint8_t)TIM5_FORCEDACTION_INACTIVE)) + +/** TIM5 One Pulse Mode */ +typedef enum +{ + TIM5_OPMODE_SINGLE =((uint8_t)0x01), + TIM5_OPMODE_REPETITIVE =((uint8_t)0x00) +}TIM5_OPMode_TypeDef; + +#define IS_TIM5_OPM_MODE_OK(MODE) (((MODE) == TIM5_OPMODE_SINGLE) || \ + ((MODE) == TIM5_OPMODE_REPETITIVE)) + +/** TIM5 Channel */ +typedef enum +{ + TIM5_CHANNEL_1 =((uint8_t)0x00), + TIM5_CHANNEL_2 =((uint8_t)0x01), + TIM5_CHANNEL_3 =((uint8_t)0x02) +}TIM5_Channel_TypeDef; + +#define IS_TIM5_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM5_CHANNEL_1) || \ + ((CHANNEL) == TIM5_CHANNEL_2) || \ + ((CHANNEL) == TIM5_CHANNEL_3)) + +#define IS_TIM5_PWMI_CHANNEL_OK(CHANNEL) (((CHANNEL) == TIM5_CHANNEL_1) || \ + ((CHANNEL) == TIM5_CHANNEL_2)) + +/** TIM5 Output Compare Polarity */ +typedef enum +{ + TIM5_OCPOLARITY_HIGH =((uint8_t)0x00), + TIM5_OCPOLARITY_LOW =((uint8_t)0x22) +}TIM5_OCPolarity_TypeDef; + +#define IS_TIM5_OC_POLARITY_OK(POLARITY) (((POLARITY) == TIM5_OCPOLARITY_HIGH) || \ + ((POLARITY) == TIM5_OCPOLARITY_LOW)) + +/** TIM5 Output Compare states */ +typedef enum +{ + TIM5_OUTPUTSTATE_DISABLE =((uint8_t)0x00), + TIM5_OUTPUTSTATE_ENABLE =((uint8_t)0x11) +}TIM5_OutputState_TypeDef; + +#define IS_TIM5_OUTPUT_STATE_OK(STATE) (((STATE) == TIM5_OUTPUTSTATE_DISABLE) || \ + ((STATE) == TIM5_OUTPUTSTATE_ENABLE)) + +/** TIM5 Input Capture Polarity */ +typedef enum +{ + TIM5_ICPOLARITY_RISING =((uint8_t)0x00), + TIM5_ICPOLARITY_FALLING =((uint8_t)0x44) +}TIM5_ICPolarity_TypeDef; + +#define IS_TIM5_IC_POLARITY_OK(POLARITY) (((POLARITY) == TIM5_ICPOLARITY_RISING) || \ + ((POLARITY) == TIM5_ICPOLARITY_FALLING)) + +/** TIM5 Input Capture Selection */ +typedef enum +{ + TIM5_ICSELECTION_DIRECTTI =((uint8_t)0x01), + TIM5_ICSELECTION_INDIRECTTI =((uint8_t)0x02), + TIM5_ICSELECTION_TRGI =((uint8_t)0x03) +}TIM5_ICSelection_TypeDef; + +#define IS_TIM5_IC_SELECTION_OK(SELECTION) (((SELECTION) == TIM5_ICSELECTION_DIRECTTI) || \ + ((SELECTION) == TIM5_ICSELECTION_INDIRECTTI) || \ + ((SELECTION) == TIM5_ICSELECTION_TRGI)) + +#define IS_TIM5_IC_SELECTION1_OK(SELECTION) (((SELECTION) == TIM5_ICSELECTION_DIRECTTI) || \ + ((SELECTION) == TIM5_ICSELECTION_TRGI)) + +/** TIM5 Input Capture Prescaler */ +typedef enum +{ + TIM5_ICPSC_DIV1 =((uint8_t)0x00), + TIM5_ICPSC_DIV2 =((uint8_t)0x04), + TIM5_ICPSC_DIV4 =((uint8_t)0x08), + TIM5_ICPSC_DIV8 =((uint8_t)0x0C) +}TIM5_ICPSC_TypeDef; + +#define IS_TIM5_IC_PRESCALER_OK(PRESCALER) (((PRESCALER) == TIM5_ICPSC_DIV1) || \ + ((PRESCALER) == TIM5_ICPSC_DIV2) || \ + ((PRESCALER) == TIM5_ICPSC_DIV4) || \ + ((PRESCALER) == TIM5_ICPSC_DIV8)) + +/** TIM5 Input Capture Filer Value */ +#define IS_TIM5_IC_FILTER_OK(ICFILTER) ((ICFILTER) <= 0x0F) + +/** TIM5 interrupt sources */ +typedef enum +{ + TIM5_IT_UPDATE =((uint8_t)0x01), + TIM5_IT_CC1 =((uint8_t)0x02), + TIM5_IT_CC2 =((uint8_t)0x04), + TIM5_IT_CC3 =((uint8_t)0x08), + TIM5_IT_TRIGGER = ((uint8_t)0x40) +}TIM5_IT_TypeDef; + +#define IS_TIM5_IT_OK(IT) (((IT) != 0x00) && ((IT) <= 0x4F)) + +#define IS_TIM5_GET_IT_OK(IT) (((IT) == TIM5_IT_UPDATE) || \ + ((IT) == TIM5_IT_CC1) || \ + ((IT) == TIM5_IT_CC2) || \ + ((IT) == TIM5_IT_CC3) || \ + ((IT) == TIM5_IT_TRIGGER)) + +/** TIM5 Prescaler Reload Mode */ +typedef enum +{ + TIM5_PSCRELOADMODE_UPDATE =((uint8_t)0x00), + TIM5_PSCRELOADMODE_IMMEDIATE =((uint8_t)0x01) +}TIM5_PSCReloadMode_TypeDef; + +#define IS_TIM5_PRESCALER_RELOAD_OK(RELOAD) (((RELOAD) == TIM5_PSCRELOADMODE_UPDATE) || \ + ((RELOAD) == TIM5_PSCRELOADMODE_IMMEDIATE)) + +/** TIM5 Event Source */ +typedef enum +{ + TIM5_EVENTSOURCE_UPDATE =((uint8_t)0x01), + TIM5_EVENTSOURCE_CC1 =((uint8_t)0x02), + TIM5_EVENTSOURCE_CC2 =((uint8_t)0x04), + TIM5_EVENTSOURCE_CC3 =((uint8_t)0x08), + TIM5_EVENTSOURCE_TRIGGER = ((uint8_t)0x40) +}TIM5_EventSource_TypeDef; + +#define IS_TIM5_EVENT_SOURCE_OK(SOURCE) (((SOURCE) != 0x00)) + +/** TIM5 Update Source */ +typedef enum +{ + TIM5_UPDATESOURCE_GLOBAL =((uint8_t)0x00), + TIM5_UPDATESOURCE_REGULAR =((uint8_t)0x01) +}TIM5_UpdateSource_TypeDef; + + +#define IS_TIM5_UPDATE_SOURCE_OK(SOURCE) (((SOURCE) == TIM5_UPDATESOURCE_GLOBAL) || \ + ((SOURCE) == TIM5_UPDATESOURCE_REGULAR)) + +/** + * @brief TIM5 Trigger Output Source + */ +typedef enum +{ + TIM5_TRGOSOURCE_RESET = ((uint8_t)0x00), /*!< Trigger Output source = Reset*/ + TIM5_TRGOSOURCE_ENABLE = ((uint8_t)0x10), /*!< Trigger Output source = TIM5 is enabled*/ + TIM5_TRGOSOURCE_UPDATE = ((uint8_t)0x20), /*!< Trigger Output source = Update event*/ + TIM5_TRGOSOURCE_OC1 = ((uint8_t)0x30), /*!< Trigger Output source = output compare channel1 */ + TIM5_TRGOSOURCE_OC1REF = ((uint8_t)0x40), /*!< Trigger Output source = output compare channel 1 reference */ + TIM5_TRGOSOURCE_OC2REF = ((uint8_t)0x50) /*!< Trigger Output source = output compare channel 2 reference */ +}TIM5_TRGOSource_TypeDef; + +/** + * @brief Macro TIM5 TRGO source + */ +#define IS_TIM5_TRGO_SOURCE_OK(SOURCE) \ + (((SOURCE) == TIM5_TRGOSOURCE_RESET) || \ + ((SOURCE) == TIM5_TRGOSOURCE_ENABLE) || \ + ((SOURCE) == TIM5_TRGOSOURCE_UPDATE) || \ + ((SOURCE) == TIM5_TRGOSOURCE_OC1) || \ + ((SOURCE) == TIM5_TRGOSOURCE_OC1REF) || \ + ((SOURCE) == TIM5_TRGOSOURCE_OC2REF)) + +/** TIM5 Flags */ +typedef enum +{ + TIM5_FLAG_UPDATE =((uint16_t)0x0001), + TIM5_FLAG_CC1 =((uint16_t)0x0002), + TIM5_FLAG_CC2 =((uint16_t)0x0004), + TIM5_FLAG_CC3 =((uint16_t)0x0008), + TIM5_FLAG_TRIGGER = ((uint16_t)0x0040), + TIM5_FLAG_CC1OF =((uint16_t)0x0200), + TIM5_FLAG_CC2OF =((uint16_t)0x0400), + TIM5_FLAG_CC3OF =((uint16_t)0x0800) +}TIM5_FLAG_TypeDef; + +#define IS_TIM5_GET_FLAG_OK(FLAG) (((FLAG) == TIM5_FLAG_UPDATE) || \ + ((FLAG) == TIM5_FLAG_CC1) || \ + ((FLAG) == TIM5_FLAG_CC2) || \ + ((FLAG) == TIM5_FLAG_CC3) || \ + ((FLAG) == TIM5_FLAG_TRIGGER) || \ + ((FLAG) == TIM5_FLAG_CC1OF) || \ + ((FLAG) == TIM5_FLAG_CC2OF) || \ + ((FLAG) == TIM5_FLAG_CC3OF)) + +#define IS_TIM5_CLEAR_FLAG_OK(FLAG) ((((uint16_t)(FLAG) & 0xF1F0) == 0x0000) && ((uint16_t)(FLAG) != 0x0000)) + + +/** + * @brief TIM5 Slave Mode + */ +typedef enum +{ + TIM5_SLAVEMODE_RESET = ((uint8_t)0x04), /*!< Slave Mode Selection = Reset*/ + TIM5_SLAVEMODE_GATED = ((uint8_t)0x05), /*!< Slave Mode Selection = Gated*/ + TIM5_SLAVEMODE_TRIGGER = ((uint8_t)0x06), /*!< Slave Mode Selection = Trigger*/ + TIM5_SLAVEMODE_EXTERNAL1 = ((uint8_t)0x07) /*!< Slave Mode Selection = External 1*/ +}TIM5_SlaveMode_TypeDef; + +/** + * @brief Macro TIM5 Slave mode + */ +#define IS_TIM5_SLAVE_MODE_OK(MODE) \ + (((MODE) == TIM5_SLAVEMODE_RESET) || \ + ((MODE) == TIM5_SLAVEMODE_GATED) || \ + ((MODE) == TIM5_SLAVEMODE_TRIGGER) || \ + ((MODE) == TIM5_SLAVEMODE_EXTERNAL1)) + +/** + * @brief TIM5 Internal Trigger Selection + */ +typedef enum +{ + TIM5_TS_TIM6 = ((uint8_t)0x00), /*!< TRIG Input source = TIM6 TRIG Output */ + TIM5_TS_TIM1 = ((uint8_t)0x03) /*!< TRIG Input source = TIM1 TRIG Output */ +}TIM5_TS_TypeDef; + +/** + * @brief Macro TIM5 Trigger Selection + */ +#define IS_TIM5_TRIGGER_SELECTION_OK(SELECTION) \ + (((SELECTION) == TIM5_TS_TIM6) || \ + ((SELECTION) == TIM5_TS_TIM1) ) + + +#define IS_TIM5_TIX_TRIGGER_SELECTION_OK(SELECTION) \ + (((SELECTION) == TIM5_TS_TI1F_ED) || \ + ((SELECTION) == TIM5_TS_TI1FP1) || \ + ((SELECTION) == TIM5_TS_TI2FP2)) + + +/** + * @brief TIM5 Encoder Mode + */ +typedef enum +{ + TIM5_ENCODERMODE_TI1 = ((uint8_t)0x01), /*!< Encoder mode 1*/ + TIM5_ENCODERMODE_TI2 = ((uint8_t)0x02), /*!< Encoder mode 2*/ + TIM5_ENCODERMODE_TI12 = ((uint8_t)0x03) /*!< Encoder mode 3*/ +}TIM5_EncoderMode_TypeDef; +/** + * @brief Macro TIM5 encoder mode + */ +#define IS_TIM5_ENCODER_MODE_OK(MODE) \ + (((MODE) == TIM5_ENCODERMODE_TI1) || \ + ((MODE) == TIM5_ENCODERMODE_TI2) || \ + ((MODE) == TIM5_ENCODERMODE_TI12)) + +/** + * @brief TIM5 External Trigger Prescaler + */ +typedef enum +{ + TIM5_EXTTRGPSC_OFF = ((uint8_t)0x00), /*!< No External Trigger prescaler */ + TIM5_EXTTRGPSC_DIV2 = ((uint8_t)0x10), /*!< External Trigger prescaler = 2 (ETRP frequency divided by 2) */ + TIM5_EXTTRGPSC_DIV4 = ((uint8_t)0x20), /*!< External Trigger prescaler = 4 (ETRP frequency divided by 4) */ + TIM5_EXTTRGPSC_DIV8 = ((uint8_t)0x30) /*!< External Trigger prescaler = 8 (ETRP frequency divided by 8) */ +}TIM5_ExtTRGPSC_TypeDef; + +/** + * @brief Macro TIM5 external trigger prescaler + */ +#define IS_TIM5_EXT_PRESCALER_OK(PRESCALER) \ + (((PRESCALER) == TIM5_EXTTRGPSC_OFF) || \ + ((PRESCALER) == TIM5_EXTTRGPSC_DIV2) || \ + ((PRESCALER) == TIM5_EXTTRGPSC_DIV4) || \ + ((PRESCALER) == TIM5_EXTTRGPSC_DIV8)) + +/** + * @brief TIM5 External Trigger Polarity + */ +typedef enum +{ + TIM5_EXTTRGPOLARITY_INVERTED = ((uint8_t)0x80), /*!< External Trigger Polarity = inverted */ + TIM5_EXTTRGPOLARITY_NONINVERTED = ((uint8_t)0x00) /*!< External Trigger Polarity = non inverted */ +}TIM5_ExtTRGPolarity_TypeDef; + +/** + * @brief Macro TIM5 Trigger Polarity + */ +#define IS_TIM5_EXT_POLARITY_OK(POLARITY) \ + (((POLARITY) == TIM5_EXTTRGPOLARITY_INVERTED) || \ + ((POLARITY) == TIM5_EXTTRGPOLARITY_NONINVERTED)) + +/** + * @brief Macro TIM5 External Trigger Filter + */ +#define IS_TIM5_EXT_FILTER_OK(EXTFILTER) ((EXTFILTER) <= 0x0F) +/** + * @} + */ + +/* Exported macro ------------------------------------------------------------*/ + +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup TIM5_Exported_Functions + * @{ + */ + +void TIM5_DeInit(void); +void TIM5_TimeBaseInit(TIM5_Prescaler_TypeDef TIM5_Prescaler, uint16_t TIM5_Period); +void TIM5_OC1Init(TIM5_OCMode_TypeDef TIM5_OCMode, TIM5_OutputState_TypeDef TIM5_OutputState,uint16_t TIM5_Pulse, TIM5_OCPolarity_TypeDef TIM5_OCPolarity); +void TIM5_OC2Init(TIM5_OCMode_TypeDef TIM5_OCMode, TIM5_OutputState_TypeDef TIM5_OutputState,uint16_t TIM5_Pulse, TIM5_OCPolarity_TypeDef TIM5_OCPolarity); +void TIM5_OC3Init(TIM5_OCMode_TypeDef TIM5_OCMode, TIM5_OutputState_TypeDef TIM5_OutputState,uint16_t TIM5_Pulse, TIM5_OCPolarity_TypeDef TIM5_OCPolarity); +void TIM5_ICInit(TIM5_Channel_TypeDef TIM5_Channel, TIM5_ICPolarity_TypeDef TIM5_ICPolarity, TIM5_ICSelection_TypeDef TIM5_ICSelection, TIM5_ICPSC_TypeDef TIM5_ICPrescaler, uint8_t TIM5_ICFilter); +void TIM5_PWMIConfig(TIM5_Channel_TypeDef TIM5_Channel, TIM5_ICPolarity_TypeDef TIM5_ICPolarity, TIM5_ICSelection_TypeDef TIM5_ICSelection, TIM5_ICPSC_TypeDef TIM5_ICPrescaler, uint8_t TIM5_ICFilter); +void TIM5_Cmd(FunctionalState NewState); +void TIM5_ITConfig(TIM5_IT_TypeDef TIM5_IT, FunctionalState NewState); +void TIM5_InternalClockConfig(void); +void TIM5_UpdateDisableConfig(FunctionalState NewState); +void TIM5_UpdateRequestConfig(TIM5_UpdateSource_TypeDef TIM5_UpdateSource); +void TIM5_SelectOnePulseMode(TIM5_OPMode_TypeDef TIM5_OPMode); +void TIM5_PrescalerConfig(TIM5_Prescaler_TypeDef Prescaler, TIM5_PSCReloadMode_TypeDef TIM5_PSCReloadMode); +void TIM5_SelectOutputTrigger(TIM5_TRGOSource_TypeDef TIM5_TRGOSource); +void TIM5_ForcedOC1Config(TIM5_ForcedAction_TypeDef TIM5_ForcedAction); +void TIM5_ForcedOC2Config(TIM5_ForcedAction_TypeDef TIM5_ForcedAction); +void TIM5_ForcedOC3Config(TIM5_ForcedAction_TypeDef TIM5_ForcedAction); +void TIM5_ARRPreloadConfig(FunctionalState NewState); +void TIM5_CCPreloadControl(FunctionalState NewState); +void TIM5_OC1PreloadConfig(FunctionalState NewState); +void TIM5_OC2PreloadConfig(FunctionalState NewState); +void TIM5_OC3PreloadConfig(FunctionalState NewState); +void TIM5_GenerateEvent(TIM5_EventSource_TypeDef TIM5_EventSource); +void TIM5_OC1PolarityConfig(TIM5_OCPolarity_TypeDef TIM5_OCPolarity); +void TIM5_OC2PolarityConfig(TIM5_OCPolarity_TypeDef TIM5_OCPolarity); +void TIM5_OC3PolarityConfig(TIM5_OCPolarity_TypeDef TIM5_OCPolarity); +void TIM5_CCxCmd(TIM5_Channel_TypeDef TIM5_Channel, FunctionalState NewState); +void TIM5_SelectOCxM(TIM5_Channel_TypeDef TIM5_Channel, TIM5_OCMode_TypeDef TIM5_OCMode); +void TIM5_SetCounter(uint16_t Counter); +void TIM5_SetAutoreload(uint16_t Autoreload); +void TIM5_SetCompare1(uint16_t Compare1); +void TIM5_SetCompare2(uint16_t Compare2); +void TIM5_SetCompare3(uint16_t Compare3); +void TIM5_SetIC1Prescaler(TIM5_ICPSC_TypeDef TIM5_IC1Prescaler); +void TIM5_SetIC2Prescaler(TIM5_ICPSC_TypeDef TIM5_IC2Prescaler); +void TIM5_SetIC3Prescaler(TIM5_ICPSC_TypeDef TIM5_IC3Prescaler); +uint16_t TIM5_GetCapture1(void); +uint16_t TIM5_GetCapture2(void); +uint16_t TIM5_GetCapture3(void); +uint16_t TIM5_GetCounter(void); +TIM5_Prescaler_TypeDef TIM5_GetPrescaler(void); +FlagStatus TIM5_GetFlagStatus(TIM5_FLAG_TypeDef TIM5_FLAG); +void TIM5_ClearFlag(TIM5_FLAG_TypeDef TIM5_FLAG); +ITStatus TIM5_GetITStatus(TIM5_IT_TypeDef TIM5_IT); +void TIM5_ClearITPendingBit(TIM5_IT_TypeDef TIM5_IT); +void TIM5_SelectInputTrigger(TIM5_TS_TypeDef TIM5_InputTriggerSource); +void TIM5_SelectSlaveMode(TIM5_SlaveMode_TypeDef TIM5_SlaveMode); +void TIM5_EncoderInterfaceConfig(TIM5_EncoderMode_TypeDef TIM5_EncoderMode, TIM5_ICPolarity_TypeDef TIM5_IC1Polarity,TIM5_ICPolarity_TypeDef TIM5_IC2Polarity); + + +/** + * @} + */ + +#endif /* __STM8S_TIM5_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_tim6.h b/4_EXT_INT_1PORT/lib/inc/stm8s_tim6.h new file mode 100644 index 0000000..5f26c8b --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_tim6.h @@ -0,0 +1,287 @@ +/** + ****************************************************************************** + * @file stm8s_tim6.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the TIM6 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_TIM6_H +#define __STM8S_TIM6_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Exported variables ------------------------------------------------------- */ +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup TIM6_Exported_Types + * @{ + */ + + +/** + * @brief TIM6 Prescaler + */ +typedef enum +{ + TIM6_PRESCALER_1 = ((uint8_t)0x00), /*!< Time base Prescaler = 1 (No effect)*/ + TIM6_PRESCALER_2 = ((uint8_t)0x01), /*!< Time base Prescaler = 2 */ + TIM6_PRESCALER_4 = ((uint8_t)0x02), /*!< Time base Prescaler = 4 */ + TIM6_PRESCALER_8 = ((uint8_t)0x03), /*!< Time base Prescaler = 8 */ + TIM6_PRESCALER_16 = ((uint8_t)0x04), /*!< Time base Prescaler = 16 */ + TIM6_PRESCALER_32 = ((uint8_t)0x05), /*!< Time base Prescaler = 32 */ + TIM6_PRESCALER_64 = ((uint8_t)0x06), /*!< Time base Prescaler = 64 */ + TIM6_PRESCALER_128 = ((uint8_t)0x07) /*!< Time base Prescaler = 128 */ +}TIM6_Prescaler_TypeDef; + +/** + * @brief TIM6 One Pulse Mode + */ +typedef enum +{ + TIM6_OPMODE_SINGLE = ((uint8_t)0x01), /*!< Single one Pulse mode (OPM Active) */ + TIM6_OPMODE_REPETITIVE = ((uint8_t)0x00) /*!< Repetitive Pulse mode (OPM inactive) */ +}TIM6_OPMode_TypeDef; + +/** + * @brief TIM6 Prescaler Reload Mode + */ +typedef enum +{ + TIM6_PSCRELOADMODE_UPDATE =((uint8_t)0x00), /*!< Prescaler value is reloaded at every update*/ + TIM6_PSCRELOADMODE_IMMEDIATE =((uint8_t)0x01) /*!< Prescaler value is reloaded immediately*/ +}TIM6_PSCReloadMode_TypeDef; + +/** + * @brief TIM6 Update Source + */ +typedef enum +{ + TIM6_UPDATESOURCE_GLOBAL =((uint8_t)0x00), /*!< Global Update request source */ + TIM6_UPDATESOURCE_REGULAR =((uint8_t)0x01) /*!< Regular Update request source */ +}TIM6_UpdateSource_TypeDef; + +/** + * @brief TIM6 Event Source + */ +typedef enum +{ + TIM6_EVENTSOURCE_UPDATE = ((uint8_t)0x01), /*!< Update Event*/ + TIM6_EVENTSOURCE_TRIGGER = ((uint8_t)0x40) /*!< Trigger Event*/ +}TIM6_EventSource_TypeDef; + +/** + * @brief TIM6 Trigger Output Source + */ +typedef enum +{ + TIM6_TRGOSOURCE_RESET = ((uint8_t)0x00), /*!< Trigger Output source = Reset*/ + TIM6_TRGOSOURCE_ENABLE = ((uint8_t)0x10), /*!< Trigger Output source = TIM5 is enabled*/ + TIM6_TRGOSOURCE_UPDATE = ((uint8_t)0x20) /*!< Trigger Output source = Update event*/ +}TIM6_TRGOSource_TypeDef; + +/** + * @brief TIM6 Slave Mode + */ +typedef enum +{ + TIM6_SLAVEMODE_DISABLE = ((uint8_t)0x00), /*!< Disable slave mode to clock the prescaler directly with the internal clock */ + TIM6_SLAVEMODE_RESET = ((uint8_t)0x04), /*!< Slave Mode Selection = Reset*/ + TIM6_SLAVEMODE_GATED = ((uint8_t)0x05), /*!< Slave Mode Selection = Gated*/ + TIM6_SLAVEMODE_TRIGGER = ((uint8_t)0x06), /*!< Slave Mode Selection = Trigger*/ + TIM6_SLAVEMODE_EXTERNAL1 = ((uint8_t)0x07) /*!< Slave Mode Selection = External 1*/ +}TIM6_SlaveMode_TypeDef; + +/** + * @brief TIM6 Flags + */ +typedef enum +{ + TIM6_FLAG_UPDATE = ((uint8_t)0x01), /*!< Update Flag */ + TIM6_FLAG_TRIGGER = ((uint8_t)0x40) /*!< Trigger Flag */ +}TIM6_FLAG_TypeDef; + +/** + * @brief TIM6 interrupt sources + */ +typedef enum +{ + TIM6_IT_UPDATE = ((uint8_t)0x01), /*!< Update Interrupt*/ + TIM6_IT_TRIGGER = ((uint8_t)0x40) /*!< Trigger Interrupt*/ +}TIM6_IT_TypeDef; + +/** + * @brief TIM6 Internal Trigger Selection + */ +typedef enum +{ + TIM6_TS_TIM1 = ((uint8_t)0x20),/*!< TRIG Input source = TIM1 TRIG Output */ + TIM6_TS_TIM5 = ((uint8_t)0x30) /*!< TRIG Input source = TIM5 TRIG Output */ +}TIM6_TS_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/* Exported macros -----------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup TIM6_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different functions parameters. + */ + +/** + * @brief Macro TIM6 Prescaler + */ +#define IS_TIM6_PRESCALER_OK(PRESCALER) \ + (((PRESCALER) == TIM6_PRESCALER_1) || \ + ((PRESCALER) == TIM6_PRESCALER_2) || \ + ((PRESCALER) == TIM6_PRESCALER_4) || \ + ((PRESCALER) == TIM6_PRESCALER_8) || \ + ((PRESCALER) == TIM6_PRESCALER_16) || \ + ((PRESCALER) == TIM6_PRESCALER_32) || \ + ((PRESCALER) == TIM6_PRESCALER_64) || \ + ((PRESCALER) == TIM6_PRESCALER_128)) +/** + * @brief Macro TIM6 One Pulse Mode + */ +#define IS_TIM6_OPM_MODE_OK(MODE) \ + (((MODE) == TIM6_OPMODE_SINGLE) || \ + ((MODE) == TIM6_OPMODE_REPETITIVE)) + +/** + * @brief Macro TIM6 Prescaler reload + */ +#define IS_TIM6_PRESCALER_RELOAD_OK(RELOAD) \ + (((RELOAD) == TIM6_PSCRELOADMODE_UPDATE) || \ + ((RELOAD) == TIM6_PSCRELOADMODE_IMMEDIATE)) +/** + * @brief Macro TIM6 Update source + */ +#define IS_TIM6_UPDATE_SOURCE_OK(SOURCE) \ + (((SOURCE) == TIM6_UPDATESOURCE_GLOBAL) || \ + ((SOURCE) == TIM6_UPDATESOURCE_REGULAR)) +/** + * @brief Macro TIM6 Event source + */ +#define IS_TIM6_EVENT_SOURCE_OK(SOURCE) \ + ((((SOURCE) & (uint8_t)0xBE) == 0x00) && \ + ((SOURCE) != 0x00)) + +/** + * @brief Macro TIM6 TRGO source + */ +#define IS_TIM6_TRGO_SOURCE_OK(SOURCE) \ + (((SOURCE) == TIM6_TRGOSOURCE_RESET) || \ + ((SOURCE) == TIM6_TRGOSOURCE_ENABLE)|| \ + ((SOURCE) == TIM6_TRGOSOURCE_UPDATE)) +/** + * @brief Macro TIM6 Slave mode + */ +#define IS_TIM6_SLAVE_MODE_OK(MODE) \ + (((MODE) == TIM6_SLAVEMODE_DISABLE) || \ + ((MODE) == TIM6_SLAVEMODE_RESET) || \ + ((MODE) == TIM6_SLAVEMODE_GATED) || \ + ((MODE) == TIM6_SLAVEMODE_TRIGGER) || \ + ((MODE) == TIM6_SLAVEMODE_EXTERNAL1)) +/** + * @brief Macro TIM6 Flags + */ +#define IS_TIM6_GET_FLAG_OK(FLAG) \ + (((FLAG) == TIM6_FLAG_UPDATE) || \ + ((FLAG) == TIM6_FLAG_TRIGGER)) + +#define IS_TIM6_CLEAR_FLAG_OK(FLAG) \ + ((((FLAG) & (uint8_t)0xBE) == 0x00) && ((FLAG) != 0x00)) +/** + * @brief Macro TIM6 interrupts + */ +#define IS_TIM6_IT_OK(IT) \ + (((IT) != 0x00) && \ + (((IT) & (uint8_t)(~(uint8_t)(0x41)))== 0x00)) + +#define IS_TIM6_GET_IT_OK(IT) \ + (((IT) == TIM6_IT_UPDATE) || \ + ((IT) == TIM6_IT_TRIGGER)) +/** + * @brief Macro TIM6 Trigger selection + */ +#define IS_TIM6_TRIGGER_SELECTION_OK(SELECTION) \ + (((SELECTION) == TIM6_TS_TIM5) || \ + ((SELECTION) == TIM6_TS_TIM1)) +/** + * @} + */ + +/* Exported functions --------------------------------------------------------*/ + +/** @addtogroup TIM6_Exported_Functions + * @{ + */ + +void TIM6_DeInit(void); +void TIM6_TimeBaseInit(TIM6_Prescaler_TypeDef TIM6_Prescaler, uint8_t TIM6_Period); +void TIM6_Cmd(FunctionalState NewState); +void TIM6_UpdateDisableConfig(FunctionalState NewState); +void TIM6_UpdateRequestConfig(TIM6_UpdateSource_TypeDef TIM6_UpdateSource); +void TIM6_SelectOnePulseMode(TIM6_OPMode_TypeDef TIM6_OPMode); +void TIM6_PrescalerConfig(TIM6_Prescaler_TypeDef Prescaler, TIM6_PSCReloadMode_TypeDef TIM6_PSCReloadMode); +void TIM6_ARRPreloadConfig(FunctionalState NewState); +void TIM6_SetCounter(uint8_t Counter); +void TIM6_SetAutoreload(uint8_t Autoreload); +uint8_t TIM6_GetCounter(void); +TIM6_Prescaler_TypeDef TIM6_GetPrescaler(void); +void TIM6_ITConfig(TIM6_IT_TypeDef TIM6_IT, FunctionalState NewState); +void TIM6_ClearFlag(TIM6_FLAG_TypeDef TIM6_FLAG); +ITStatus TIM6_GetITStatus(TIM6_IT_TypeDef TIM6_IT); +void TIM6_GenerateEvent(TIM6_EventSource_TypeDef TIM6_EventSource); +FlagStatus TIM6_GetFlagStatus(TIM6_FLAG_TypeDef TIM6_FLAG); +void TIM6_ClearITPendingBit(TIM6_IT_TypeDef TIM6_IT); +void TIM6_SelectOutputTrigger(TIM6_TRGOSource_TypeDef TIM6_TRGOSource); +void TIM6_SelectMasterSlaveMode(FunctionalState NewState); +void TIM6_SelectInputTrigger(TIM6_TS_TypeDef TIM6_InputTriggerSource); +void TIM6_InternalClockConfig(void); +void TIM6_SelectSlaveMode(TIM6_SlaveMode_TypeDef TIM6_SlaveMode); + +/** + * @} + */ + +#endif /* __STM8S_TIM6_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_uart1.h b/4_EXT_INT_1PORT/lib/inc/stm8s_uart1.h new file mode 100644 index 0000000..6740a39 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_uart1.h @@ -0,0 +1,383 @@ +/** + ******************************************************************************** + * @file stm8s_uart1.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototypes and macros for the UART1 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_UART1_H +#define __STM8S_UART1_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup UART1_Exported_Types + * @{ + */ + + +/** + * @brief UART1 Irda Modes + */ + +typedef enum { UART1_IRDAMODE_NORMAL = (uint8_t)0x00, /**< 0x00 Irda Normal Mode */ + UART1_IRDAMODE_LOWPOWER = (uint8_t)0x01 /**< 0x01 Irda Low Power Mode */ + } UART1_IrDAMode_TypeDef; + +/** + * @brief UART1 WakeUP Modes + */ +typedef enum { UART1_WAKEUP_IDLELINE = (uint8_t)0x00, /**< 0x01 Idle Line wake up */ + UART1_WAKEUP_ADDRESSMARK = (uint8_t)0x08 /**< 0x02 Address Mark wake up */ + } UART1_WakeUp_TypeDef; + +/** + * @brief UART1 LIN Break detection length possible values + */ +typedef enum { UART1_LINBREAKDETECTIONLENGTH_10BITS = (uint8_t)0x00, /**< 0x01 10 bits Lin Break detection */ + UART1_LINBREAKDETECTIONLENGTH_11BITS = (uint8_t)0x01 /**< 0x02 11 bits Lin Break detection */ + } UART1_LINBreakDetectionLength_TypeDef; + +/** + * @brief UART1 stop bits possible values + */ + +typedef enum { UART1_STOPBITS_1 = (uint8_t)0x00, /**< One stop bit is transmitted at the end of frame*/ + UART1_STOPBITS_0_5 = (uint8_t)0x10, /**< Half stop bits is transmitted at the end of frame*/ + UART1_STOPBITS_2 = (uint8_t)0x20, /**< Two stop bits are transmitted at the end of frame*/ + UART1_STOPBITS_1_5 = (uint8_t)0x30 /**< One and half stop bits*/ + } UART1_StopBits_TypeDef; + +/** + * @brief UART1 parity possible values + */ +typedef enum { UART1_PARITY_NO = (uint8_t)0x00, /**< No Parity*/ + UART1_PARITY_EVEN = (uint8_t)0x04, /**< Even Parity*/ + UART1_PARITY_ODD = (uint8_t)0x06 /**< Odd Parity*/ + } UART1_Parity_TypeDef; + +/** + * @brief UART1 Synchrone modes + */ +typedef enum { UART1_SYNCMODE_CLOCK_DISABLE = (uint8_t)0x80, /**< 0x80 Sync mode Disable, SLK pin Disable */ + UART1_SYNCMODE_CLOCK_ENABLE = (uint8_t)0x08, /**< 0x08 Sync mode Enable, SLK pin Enable */ + UART1_SYNCMODE_CPOL_LOW = (uint8_t)0x40, /**< 0x40 Steady low value on SCLK pin outside transmission window */ + UART1_SYNCMODE_CPOL_HIGH = (uint8_t)0x04, /**< 0x04 Steady high value on SCLK pin outside transmission window */ + UART1_SYNCMODE_CPHA_MIDDLE = (uint8_t)0x20, /**< 0x20 SCLK clock line activated in middle of data bit */ + UART1_SYNCMODE_CPHA_BEGINING = (uint8_t)0x02, /**< 0x02 SCLK clock line activated at beginning of data bit */ + UART1_SYNCMODE_LASTBIT_DISABLE = (uint8_t)0x10, /**< 0x10 The clock pulse of the last data bit is not output to the SCLK pin */ + UART1_SYNCMODE_LASTBIT_ENABLE = (uint8_t)0x01 /**< 0x01 The clock pulse of the last data bit is output to the SCLK pin */ + } UART1_SyncMode_TypeDef; + +/** + * @brief UART1 Word length possible values + */ +typedef enum { UART1_WORDLENGTH_8D = (uint8_t)0x00,/**< 0x00 8 bits Data */ + UART1_WORDLENGTH_9D = (uint8_t)0x10 /**< 0x10 9 bits Data */ + } UART1_WordLength_TypeDef; + +/** + * @brief UART1 Mode possible values + */ +typedef enum { UART1_MODE_RX_ENABLE = (uint8_t)0x08, /**< 0x08 Receive Enable */ + UART1_MODE_TX_ENABLE = (uint8_t)0x04, /**< 0x04 Transmit Enable */ + UART1_MODE_TX_DISABLE = (uint8_t)0x80, /**< 0x80 Transmit Disable */ + UART1_MODE_RX_DISABLE = (uint8_t)0x40, /**< 0x40 Single-wire Half-duplex mode */ + UART1_MODE_TXRX_ENABLE = (uint8_t)0x0C /**< 0x0C Transmit Enable and Receive Enable */ + } UART1_Mode_TypeDef; + +/** + * @brief UART1 Flag possible values + */ +typedef enum { UART1_FLAG_TXE = (uint16_t)0x0080, /*!< Transmit Data Register Empty flag */ + UART1_FLAG_TC = (uint16_t)0x0040, /*!< Transmission Complete flag */ + UART1_FLAG_RXNE = (uint16_t)0x0020, /*!< Read Data Register Not Empty flag */ + UART1_FLAG_IDLE = (uint16_t)0x0010, /*!< Idle line detected flag */ + UART1_FLAG_OR = (uint16_t)0x0008, /*!< OverRun error flag */ + UART1_FLAG_NF = (uint16_t)0x0004, /*!< Noise error flag */ + UART1_FLAG_FE = (uint16_t)0x0002, /*!< Framing Error flag */ + UART1_FLAG_PE = (uint16_t)0x0001, /*!< Parity Error flag */ + UART1_FLAG_LBDF = (uint16_t)0x0210, /*!< Line Break Detection Flag */ + UART1_FLAG_SBK = (uint16_t)0x0101 /*!< Send Break characters Flag */ + } UART1_Flag_TypeDef; + +/** + * @brief UART1 Interrupt definition + * UART1_IT possible values + * Elements values convention: 0xZYX + * X: Position of the corresponding Interrupt + * - For the following values, X means the interrupt position in the CR2 register. + * UART1_IT_TXE + * UART1_IT_TC + * UART1_IT_RXNE + * UART1_IT_IDLE + * UART1_IT_OR + * - For the UART1_IT_PE value, X means the flag position in the CR1 register. + * - For the UART1_IT_LBDF value, X means the flag position in the CR4 register. + * Y: Flag position + * - For the following values, Y means the flag (pending bit) position in the SR register. + * UART1_IT_TXE + * UART1_IT_TC + * UART1_IT_RXNE + * UART1_IT_IDLE + * UART1_IT_OR + * UART1_IT_PE + * - For the UART1_IT_LBDF value, Y means the flag position in the CR4 register. + * Z: Register index: indicate in which register the dedicated interrupt source is: + * - 1==> CR1 register + * - 2==> CR2 register + * - 3==> CR4 register + */ +typedef enum { UART1_IT_TXE = (uint16_t)0x0277, /*!< Transmit interrupt */ + UART1_IT_TC = (uint16_t)0x0266, /*!< Transmission Complete interrupt */ + UART1_IT_RXNE = (uint16_t)0x0255, /*!< Receive interrupt */ + UART1_IT_IDLE = (uint16_t)0x0244, /*!< IDLE line interrupt */ + UART1_IT_OR = (uint16_t)0x0235, /*!< Overrun Error interrupt */ + UART1_IT_PE = (uint16_t)0x0100, /*!< Parity Error interrupt */ + UART1_IT_LBDF = (uint16_t)0x0346, /**< LIN break detection interrupt */ + UART1_IT_RXNE_OR = (uint16_t)0x0205 /*!< Receive/Overrun interrupt */ + } UART1_IT_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/* Exported macros ------------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup UART1_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different functions parameters. + */ + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the MODEs possible combination should be one of + * the following + */ +#define IS_UART1_MODE_OK(Mode) \ + (((Mode) == (uint8_t)UART1_MODE_RX_ENABLE) || \ + ((Mode) == (uint8_t)UART1_MODE_RX_DISABLE) || \ + ((Mode) == (uint8_t)UART1_MODE_TX_ENABLE) || \ + ((Mode) == (uint8_t)UART1_MODE_TX_DISABLE) || \ + ((Mode) == (uint8_t)UART1_MODE_TXRX_ENABLE) || \ + ((Mode) == (uint8_t)((uint8_t)UART1_MODE_TX_ENABLE|(uint8_t)UART1_MODE_RX_ENABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART1_MODE_TX_ENABLE|(uint8_t)UART1_MODE_RX_DISABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART1_MODE_TX_DISABLE|(uint8_t)UART1_MODE_RX_DISABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART1_MODE_TX_DISABLE|(uint8_t)UART1_MODE_RX_ENABLE))) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the WordLengths + */ +#define IS_UART1_WORDLENGTH_OK(WordLength) \ + (((WordLength) == UART1_WORDLENGTH_8D) || \ + ((WordLength) == UART1_WORDLENGTH_9D)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the SyncModes; it should exclude values such + * as UART1_CLOCK_ENABLE|UART1_CLOCK_DISABLE + */ +#define IS_UART1_SYNCMODE_OK(SyncMode) \ + (!((((SyncMode)&(((uint8_t)UART1_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART1_SYNCMODE_CLOCK_DISABLE))) == (((uint8_t)UART1_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART1_SYNCMODE_CLOCK_DISABLE))) \ + || (((SyncMode)&(((uint8_t)UART1_SYNCMODE_CPOL_LOW )|((uint8_t)UART1_SYNCMODE_CPOL_HIGH))) == (((uint8_t)UART1_SYNCMODE_CPOL_LOW )|((uint8_t)UART1_SYNCMODE_CPOL_HIGH))) \ + ||(((SyncMode)&(((uint8_t)UART1_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART1_SYNCMODE_CPHA_BEGINING))) == (((uint8_t)UART1_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART1_SYNCMODE_CPHA_BEGINING))) \ + || (((SyncMode)&(((uint8_t)UART1_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART1_SYNCMODE_LASTBIT_ENABLE))) == (((uint8_t)UART1_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART1_SYNCMODE_LASTBIT_ENABLE))))) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the FLAGs + */ +#define IS_UART1_FLAG_OK(Flag) \ + (((Flag) == UART1_FLAG_TXE) || \ + ((Flag) == UART1_FLAG_TC) || \ + ((Flag) == UART1_FLAG_RXNE) || \ + ((Flag) == UART1_FLAG_IDLE) || \ + ((Flag) == UART1_FLAG_OR) || \ + ((Flag) == UART1_FLAG_NF) || \ + ((Flag) == UART1_FLAG_FE) || \ + ((Flag) == UART1_FLAG_PE) || \ + ((Flag) == UART1_FLAG_SBK) || \ + ((Flag) == UART1_FLAG_LBDF)) +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the FLAGs that can be cleared by writing 0 + */ +#define IS_UART1_CLEAR_FLAG_OK(Flag) \ + (((Flag) == UART1_FLAG_RXNE) || \ + ((Flag) == UART1_FLAG_LBDF)) + + + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the Interrupts + */ + +#define IS_UART1_CONFIG_IT_OK(Interrupt) \ + (((Interrupt) == UART1_IT_PE) || \ + ((Interrupt) == UART1_IT_TXE) || \ + ((Interrupt) == UART1_IT_TC) || \ + ((Interrupt) == UART1_IT_RXNE_OR ) || \ + ((Interrupt) == UART1_IT_IDLE) || \ + ((Interrupt) == UART1_IT_LBDF)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the pending bit + */ +#define IS_UART1_GET_IT_OK(ITPendingBit) \ + (((ITPendingBit) == UART1_IT_TXE) || \ + ((ITPendingBit) == UART1_IT_TC) || \ + ((ITPendingBit) == UART1_IT_RXNE) || \ + ((ITPendingBit) == UART1_IT_IDLE) || \ + ((ITPendingBit) == UART1_IT_OR) || \ + ((ITPendingBit) == UART1_IT_LBDF) || \ + ((ITPendingBit) == UART1_IT_PE)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the pending bit that can be cleared by writing 0 + */ +#define IS_UART1_CLEAR_IT_OK(ITPendingBit) \ + (((ITPendingBit) == UART1_IT_RXNE) || \ + ((ITPendingBit) == UART1_IT_LBDF)) + + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the IrDAModes + */ +#define IS_UART1_IRDAMODE_OK(IrDAMode) \ + (((IrDAMode) == UART1_IRDAMODE_LOWPOWER) || \ + ((IrDAMode) == UART1_IRDAMODE_NORMAL)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the WakeUps + */ +#define IS_UART1_WAKEUP_OK(WakeUp) \ + (((WakeUp) == UART1_WAKEUP_IDLELINE) || \ + ((WakeUp) == UART1_WAKEUP_ADDRESSMARK)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the LINBreakDetectionLengths + */ +#define IS_UART1_LINBREAKDETECTIONLENGTH_OK(LINBreakDetectionLength) \ + (((LINBreakDetectionLength) == UART1_LINBREAKDETECTIONLENGTH_10BITS) || \ + ((LINBreakDetectionLength) == UART1_LINBREAKDETECTIONLENGTH_11BITS)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the UART1_StopBits + */ +#define IS_UART1_STOPBITS_OK(StopBit) (((StopBit) == UART1_STOPBITS_1) || \ + ((StopBit) == UART1_STOPBITS_0_5) || \ + ((StopBit) == UART1_STOPBITS_2) || \ + ((StopBit) == UART1_STOPBITS_1_5 )) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the Parity + */ +#define IS_UART1_PARITY_OK(Parity) (((Parity) == UART1_PARITY_NO) || \ + ((Parity) == UART1_PARITY_EVEN) || \ + ((Parity) == UART1_PARITY_ODD )) + +/** + * @brief Macro used by the assert_param function in order to check the maximum + * baudrate value + */ +#define IS_UART1_BAUDRATE_OK(NUM) ((NUM) <= (uint32_t)625000) + + +/** + * @brief Macro used by the assert_param function in order to check the address + * of the UART1 or UART node + */ +#define UART1_ADDRESS_MAX ((uint8_t)16) +#define IS_UART1_ADDRESS_OK(node) ((node) < UART1_ADDRESS_MAX ) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup UART1_Exported_Functions + * @{ + */ + +void UART1_DeInit(void); +void UART1_Init(uint32_t BaudRate, UART1_WordLength_TypeDef WordLength, + UART1_StopBits_TypeDef StopBits, UART1_Parity_TypeDef Parity, + UART1_SyncMode_TypeDef SyncMode, UART1_Mode_TypeDef Mode); +void UART1_Cmd(FunctionalState NewState); +void UART1_ITConfig(UART1_IT_TypeDef UART1_IT, FunctionalState NewState); +void UART1_HalfDuplexCmd(FunctionalState NewState); +void UART1_IrDAConfig(UART1_IrDAMode_TypeDef UART1_IrDAMode); +void UART1_IrDACmd(FunctionalState NewState); +void UART1_LINBreakDetectionConfig(UART1_LINBreakDetectionLength_TypeDef UART1_LINBreakDetectionLength); +void UART1_LINCmd(FunctionalState NewState); +void UART1_SmartCardCmd(FunctionalState NewState); +void UART1_SmartCardNACKCmd(FunctionalState NewState); +void UART1_WakeUpConfig(UART1_WakeUp_TypeDef UART1_WakeUp); +void UART1_ReceiverWakeUpCmd(FunctionalState NewState); +uint8_t UART1_ReceiveData8(void); +uint16_t UART1_ReceiveData9(void); +void UART1_SendData8(uint8_t Data); +void UART1_SendData9(uint16_t Data); +void UART1_SendBreak(void); +void UART1_SetAddress(uint8_t UART1_Address); +void UART1_SetGuardTime(uint8_t UART1_GuardTime); +void UART1_SetPrescaler(uint8_t UART1_Prescaler); +FlagStatus UART1_GetFlagStatus(UART1_Flag_TypeDef UART1_FLAG); +void UART1_ClearFlag(UART1_Flag_TypeDef UART1_FLAG); +ITStatus UART1_GetITStatus(UART1_IT_TypeDef UART1_IT); +void UART1_ClearITPendingBit(UART1_IT_TypeDef UART1_IT); + +/** + * @} + */ + +#endif /* __STM8S_UART1_H */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_uart2.h b/4_EXT_INT_1PORT/lib/inc/stm8s_uart2.h new file mode 100644 index 0000000..224171f --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_uart2.h @@ -0,0 +1,447 @@ +/** + ******************************************************************************** + * @file stm8s_uart2.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototypes and macros for the UART2 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_UART2_H +#define __STM8S_UART2_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup UART2_Exported_Types + * @{ + */ + +/** + * @brief UART2 Irda Modes + */ + +typedef enum { UART2_IRDAMODE_NORMAL = (uint8_t)0x00, /**< 0x00 Irda Normal Mode */ + UART2_IRDAMODE_LOWPOWER = (uint8_t)0x01 /**< 0x01 Irda Low Power Mode */ + + } UART2_IrDAMode_TypeDef; + +/** + * @brief UART2 WakeUP Modes + */ + +typedef enum { UART2_WAKEUP_IDLELINE = (uint8_t)0x00, /**< 0x01 Idle Line wake up */ + UART2_WAKEUP_ADDRESSMARK = (uint8_t)0x08 /**< 0x02 Address Mark wake up */ + } UART2_WakeUp_TypeDef; + + +/** + * @brief UART2 LIN Break detection length possible values + */ +typedef enum { UART2_LINBREAKDETECTIONLENGTH_10BITS = (uint8_t)0x00, /**< 0x01 10 bits Lin Break detection */ + UART2_LINBREAKDETECTIONLENGTH_11BITS = (uint8_t)0x01 /**< 0x02 11 bits Lin Break detection */ + } UART2_LINBreakDetectionLength_TypeDef; + +/** + * @brief UART2 stop bits possible values + */ + +typedef enum { UART2_STOPBITS_1 = (uint8_t)0x00, /**< One stop bit is transmitted at the end of frame*/ + UART2_STOPBITS_0_5 = (uint8_t)0x10, /**< Half stop bits is transmitted at the end of frame*/ + UART2_STOPBITS_2 = (uint8_t)0x20, /**< Two stop bits are transmitted at the end of frame*/ + UART2_STOPBITS_1_5 = (uint8_t)0x30 /**< One and half stop bits*/ + } UART2_StopBits_TypeDef; + + +/** + * @brief UART2 parity possible values + */ +typedef enum { UART2_PARITY_NO = (uint8_t)0x00, /**< No Parity*/ + UART2_PARITY_EVEN = (uint8_t)0x04, /**< Even Parity*/ + UART2_PARITY_ODD = (uint8_t)0x06 /**< Odd Parity*/ + } UART2_Parity_TypeDef; +/** + * @brief UART2 Mode possible values + */ +typedef enum { UART2_LIN_MODE_MASTER = (uint8_t)0x00, /**< LIN Master Mode*/ + UART2_LIN_MODE_SLAVE = (uint8_t)0x01 /**< LIN Slave Mode*/ + } UART2_LinMode_TypeDef; +/** + * @brief UART2 automatic resynchronisation possible values + */ +typedef enum { UART2_LIN_AUTOSYNC_DISABLE = (uint8_t)0x00, /**< LIN Autosynchronization Disable*/ + UART2_LIN_AUTOSYNC_ENABLE = (uint8_t)0x01 /**< LIN Autosynchronization Enable*/ + } UART2_LinAutosync_TypeDef; +/** + * @brief UART2 Divider Update Method possible values + */ +typedef enum { UART2_LIN_DIVUP_LBRR1 = (uint8_t)0x00, /**< LIN LDIV is updated as soon as LBRR1 is written*/ + UART2_LIN_DIVUP_NEXTRXNE = (uint8_t)0x01 /**< LIN LDIV is updated at the next received character*/ + } UART2_LinDivUp_TypeDef; + +/** + * @brief UART2 Synchrone modes + */ +typedef enum { UART2_SYNCMODE_CLOCK_DISABLE = (uint8_t)0x80, /**< 0x80 Sync mode Disable, SLK pin Disable */ + UART2_SYNCMODE_CLOCK_ENABLE = (uint8_t)0x08, /**< 0x08 Sync mode Enable, SLK pin Enable */ + UART2_SYNCMODE_CPOL_LOW = (uint8_t)0x40, /**< 0x40 Steady low value on SCLK pin outside transmission window */ + UART2_SYNCMODE_CPOL_HIGH = (uint8_t)0x04, /**< 0x04 Steady high value on SCLK pin outside transmission window */ + UART2_SYNCMODE_CPHA_MIDDLE = (uint8_t)0x20, /**< 0x20 SCLK clock line activated in middle of data bit */ + UART2_SYNCMODE_CPHA_BEGINING = (uint8_t)0x02, /**< 0x02 SCLK clock line activated at beginning of data bit */ + UART2_SYNCMODE_LASTBIT_DISABLE = (uint8_t)0x10, /**< 0x10 The clock pulse of the last data bit is not output to the SCLK pin */ + UART2_SYNCMODE_LASTBIT_ENABLE = (uint8_t)0x01 /**< 0x01 The clock pulse of the last data bit is output to the SCLK pin */ + } UART2_SyncMode_TypeDef; + +/** + * @brief UART2 Word length possible values + */ +typedef enum { UART2_WORDLENGTH_8D = (uint8_t)0x00,/**< 0x00 8 bits Data */ + UART2_WORDLENGTH_9D = (uint8_t)0x10 /**< 0x10 9 bits Data */ + } UART2_WordLength_TypeDef; + +/** + * @brief UART2 Mode possible values + */ +typedef enum { UART2_MODE_RX_ENABLE = (uint8_t)0x08, /**< 0x08 Receive Enable */ + UART2_MODE_TX_ENABLE = (uint8_t)0x04, /**< 0x04 Transmit Enable */ + UART2_MODE_TX_DISABLE = (uint8_t)0x80, /**< 0x80 Transmit Disable */ + UART2_MODE_RX_DISABLE = (uint8_t)0x40, /**< 0x40 Single-wire Half-duplex mode */ + UART2_MODE_TXRX_ENABLE = (uint8_t)0x0C /**< 0x0C Transmit Enable and Receive Enable */ + } UART2_Mode_TypeDef; +/** + * @brief UART2 Flag possible values + */ +typedef enum +{ + UART2_FLAG_TXE = (uint16_t)0x0080, /*!< Transmit Data Register Empty flag */ + UART2_FLAG_TC = (uint16_t)0x0040, /*!< Transmission Complete flag */ + UART2_FLAG_RXNE = (uint16_t)0x0020, /*!< Read Data Register Not Empty flag */ + UART2_FLAG_IDLE = (uint16_t)0x0010, /*!< Idle line detected flag */ + UART2_FLAG_OR_LHE = (uint16_t)0x0008, /*!< OverRun error flag */ + UART2_FLAG_NF = (uint16_t)0x0004, /*!< Noise error flag */ + UART2_FLAG_FE = (uint16_t)0x0002, /*!< Framing Error flag */ + UART2_FLAG_PE = (uint16_t)0x0001, /*!< Parity Error flag */ + UART2_FLAG_SBK = (uint16_t)0x0101, /**< Send Break Complete interrupt flag */ + UART2_FLAG_LBDF = (uint16_t)0x0210, /**< LIN Break Detection Flag */ + UART2_FLAG_LHDF = (uint16_t)0x0302, /**< LIN Header Detection Flag*/ + UART2_FLAG_LSF = (uint16_t)0x0301 /**< LIN Sync Field Flag*/ +} UART2_Flag_TypeDef; + +/** + * @brief UART2 Interrupt definition + * UART2_IT possible values + * Elements values convention: 0xZYX + * X: Position of the corresponding Interrupt + * - For the following values, X means the interrupt position in the CR2 register. + * UART2_IT_TXE + * UART2_IT_TC + * UART2_IT_RXNE + * UART2_IT_IDLE + * UART2_IT_OR + * - For the UART2_IT_PE value, X means the flag position in the CR1 register. + * - For the UART2_IT_LBDF value, X means the flag position in the CR4 register. + * - For the UART2_IT_LHDF value, X means the flag position in the CR6 register. + * Y: Flag position + * - For the following values, Y means the flag (pending bit) position in the SR register. + * UART2_IT_TXE + * UART2_IT_TC + * UART2_IT_RXNE + * UART2_IT_IDLE + * UART2_IT_OR + * UART2_IT_PE + * - For the UART2_IT_LBDF value, Y means the flag position in the CR4 register. + * - For the UART2_IT_LHDF value, Y means the flag position in the CR6 register. + * Z: Register index: indicate in which register the dedicated interrupt source is: + * - 1==> CR1 register + * - 2==> CR2 register + * - 3==> CR4 register + * - 4==> CR6 register + */ +typedef enum { UART2_IT_TXE = (uint16_t)0x0277, /**< Transmit interrupt */ + UART2_IT_TC = (uint16_t)0x0266, /**< Transmission Complete interrupt */ + UART2_IT_RXNE = (uint16_t)0x0255, /**< Data Register Not Empty interrupt */ + UART2_IT_IDLE = (uint16_t)0x0244, /**< Idle line detected interrupt */ + UART2_IT_OR = (uint16_t)0x0235, /**< OverRun error interrupt */ + UART2_IT_PE = (uint16_t)0x0100, /**< Parity Error interrupt */ + UART2_IT_LBDF = (uint16_t)0x0346, /**< LIN Break Detection interrupt */ + UART2_IT_LHDF = (uint16_t)0x0412, /**< LIN Header Detection interrupt*/ + UART2_IT_RXNE_OR = (uint16_t)0x0205 /*!< Receive/Overrun interrupt */ + } UART2_IT_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/* Exported macros ------------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup UART2_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different functions parameters. + */ + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the MODEs possible combination should be one of + * the following. + */ + +#define IS_UART2_MODE_OK(Mode) \ + (((Mode) == (uint8_t)UART2_MODE_RX_ENABLE) || \ + ((Mode) == (uint8_t)UART2_MODE_RX_DISABLE) || \ + ((Mode) == (uint8_t)UART2_MODE_TX_ENABLE) || \ + ((Mode) == (uint8_t)UART2_MODE_TX_DISABLE) || \ + ((Mode) == (uint8_t)UART2_MODE_TXRX_ENABLE) || \ + ((Mode) == (uint8_t)((uint8_t)UART2_MODE_TX_ENABLE|(uint8_t)UART2_MODE_RX_ENABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART2_MODE_TX_ENABLE|(uint8_t)UART2_MODE_RX_DISABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART2_MODE_TX_DISABLE|(uint8_t)UART2_MODE_RX_DISABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART2_MODE_TX_DISABLE|(uint8_t)UART2_MODE_RX_ENABLE))) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the WordLengths + */ +#define IS_UART2_WORDLENGTH_OK(WordLength) \ + (((WordLength) == UART2_WORDLENGTH_8D) || \ + ((WordLength) == UART2_WORDLENGTH_9D)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the SyncModes; it should exclude values such + * as UART2_CLOCK_ENABLE|UART2_CLOCK_DISABLE + */ +#define IS_UART2_SYNCMODE_OK(SyncMode) \ + (!((((SyncMode)&(((uint8_t)UART2_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART2_SYNCMODE_CLOCK_DISABLE))) == (((uint8_t)UART2_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART2_SYNCMODE_CLOCK_DISABLE))) || \ + (((SyncMode)&(((uint8_t)UART2_SYNCMODE_CPOL_LOW )|((uint8_t)UART2_SYNCMODE_CPOL_HIGH))) == (((uint8_t)UART2_SYNCMODE_CPOL_LOW )|((uint8_t)UART2_SYNCMODE_CPOL_HIGH))) || \ + (((SyncMode)&(((uint8_t)UART2_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART2_SYNCMODE_CPHA_BEGINING))) == (((uint8_t)UART2_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART2_SYNCMODE_CPHA_BEGINING))) || \ + (((SyncMode)&(((uint8_t)UART2_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART2_SYNCMODE_LASTBIT_ENABLE))) == (((uint8_t)UART2_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART2_SYNCMODE_LASTBIT_ENABLE))))) + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the FLAGs + */ +#define IS_UART2_FLAG_OK(Flag) \ + (((Flag) == UART2_FLAG_TXE) || \ + ((Flag) == UART2_FLAG_TC) || \ + ((Flag) == UART2_FLAG_RXNE) || \ + ((Flag) == UART2_FLAG_IDLE) || \ + ((Flag) == UART2_FLAG_OR_LHE) || \ + ((Flag) == UART2_FLAG_NF) || \ + ((Flag) == UART2_FLAG_FE) || \ + ((Flag) == UART2_FLAG_PE) || \ + ((Flag) == UART2_FLAG_SBK) || \ + ((Flag) == UART2_FLAG_LSF) || \ + ((Flag) == UART2_FLAG_LHDF) || \ + ((Flag) == UART2_FLAG_LBDF)) + + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the FLAGs that can be cleared by writing 0 + */ +#define IS_UART2_CLEAR_FLAG_OK(Flag) \ + (((Flag) == UART2_FLAG_RXNE) || \ + ((Flag) == UART2_FLAG_LHDF) || \ + ((Flag) == UART2_FLAG_LSF) || \ + ((Flag) == UART2_FLAG_LBDF)) + +/** + * @brief Macro used by the assert_param function in order to check + * the different sensitivity values for the Interrupts + */ + +#define IS_UART2_CONFIG_IT_OK(Interrupt) \ + (((Interrupt) == UART2_IT_PE) || \ + ((Interrupt) == UART2_IT_TXE) || \ + ((Interrupt) == UART2_IT_TC) || \ + ((Interrupt) == UART2_IT_RXNE_OR ) || \ + ((Interrupt) == UART2_IT_IDLE) || \ + ((Interrupt) == UART2_IT_LHDF) || \ + ((Interrupt) == UART2_IT_LBDF)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the pending bit + */ +#define IS_UART2_GET_IT_OK(ITPendingBit) \ + (((ITPendingBit) == UART2_IT_TXE) || \ + ((ITPendingBit) == UART2_IT_TC) || \ + ((ITPendingBit) == UART2_IT_RXNE) || \ + ((ITPendingBit) == UART2_IT_IDLE) || \ + ((ITPendingBit) == UART2_IT_OR) || \ + ((ITPendingBit) == UART2_IT_LBDF) || \ + ((ITPendingBit) == UART2_IT_LHDF) || \ + ((ITPendingBit) == UART2_IT_PE)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the pending bit that can be cleared by writing 0 + */ +#define IS_UART2_CLEAR_IT_OK(ITPendingBit) \ + (((ITPendingBit) == UART2_IT_RXNE) || \ + ((ITPendingBit) == UART2_IT_LHDF) || \ + ((ITPendingBit) == UART2_IT_LBDF)) + + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the IrDAModes + */ +#define IS_UART2_IRDAMODE_OK(IrDAMode) \ + (((IrDAMode) == UART2_IRDAMODE_LOWPOWER) || \ + ((IrDAMode) == UART2_IRDAMODE_NORMAL)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the WakeUps + */ +#define IS_UART2_WAKEUP_OK(WakeUp) \ + (((WakeUp) == UART2_WAKEUP_IDLELINE) || \ + ((WakeUp) == UART2_WAKEUP_ADDRESSMARK)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the LINBreakDetectionLengths + */ +#define IS_UART2_LINBREAKDETECTIONLENGTH_OK(LINBreakDetectionLength) \ + (((LINBreakDetectionLength) == UART2_LINBREAKDETECTIONLENGTH_10BITS) || \ + ((LINBreakDetectionLength) == UART2_LINBREAKDETECTIONLENGTH_11BITS)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the UART2_StopBits + */ +#define IS_UART2_STOPBITS_OK(StopBit) (((StopBit) == UART2_STOPBITS_1) || \ + ((StopBit) == UART2_STOPBITS_0_5) || \ + ((StopBit) == UART2_STOPBITS_2) || \ + ((StopBit) == UART2_STOPBITS_1_5 )) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the Paritys + */ +#define IS_UART2_PARITY_OK(Parity) (((Parity) == UART2_PARITY_NO) || \ + ((Parity) == UART2_PARITY_EVEN) || \ + ((Parity) == UART2_PARITY_ODD )) + +/** + * @brief Macro used by the assert_param function in order to check the maximum + * baudrate value + */ +#define IS_UART2_BAUDRATE_OK(NUM) ((NUM) <= (uint32_t)625000) + + +/** + * @brief Macro used by the assert_param function in order to check the address + * of the UART2 or UART node + */ +#define UART2_ADDRESS_MAX ((uint8_t)16) +#define IS_UART2_ADDRESS_OK(node) ((node) < UART2_ADDRESS_MAX ) + +/** + * @brief Macro used by the assert_param function in order to check the LIN mode + */ +#define IS_UART2_SLAVE_OK(Mode) \ + (((Mode) == UART2_LIN_MODE_MASTER) || \ + ((Mode) == UART2_LIN_MODE_SLAVE)) + +/** + * @brief Macro used by the assert_param function in order to check the LIN + * automatic resynchronization mode + */ +#define IS_UART2_AUTOSYNC_OK(AutosyncMode) \ + (((AutosyncMode) == UART2_LIN_AUTOSYNC_ENABLE) || \ + ((AutosyncMode) == UART2_LIN_AUTOSYNC_DISABLE)) + +/** + * @brief Macro used by the assert_param function in order to check the LIN divider update method + */ +#define IS_UART2_DIVUP_OK(DivupMethod) \ + (((DivupMethod) == UART2_LIN_DIVUP_LBRR1) || \ + ((DivupMethod) == UART2_LIN_DIVUP_NEXTRXNE)) + + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup UART2_Exported_Functions + * @{ + */ + +void UART2_DeInit(void); +void UART2_Init(uint32_t BaudRate, UART2_WordLength_TypeDef WordLength, + UART2_StopBits_TypeDef StopBits, UART2_Parity_TypeDef Parity, + UART2_SyncMode_TypeDef SyncMode, UART2_Mode_TypeDef Mode); +void UART2_Cmd(FunctionalState NewState); +void UART2_ITConfig(UART2_IT_TypeDef UART2_IT, FunctionalState NewState); +void UART2_HalfDuplexCmd(FunctionalState NewState); +void UART2_IrDAConfig(UART2_IrDAMode_TypeDef UART2_IrDAMode); +void UART2_IrDACmd(FunctionalState NewState); +void UART2_LINBreakDetectionConfig(UART2_LINBreakDetectionLength_TypeDef UART2_LINBreakDetectionLength); +void UART2_LINConfig(UART2_LinMode_TypeDef UART2_Mode, + UART2_LinAutosync_TypeDef UART2_Autosync, + UART2_LinDivUp_TypeDef UART2_DivUp); +void UART2_LINCmd(FunctionalState NewState); +void UART2_SmartCardCmd(FunctionalState NewState); +void UART2_SmartCardNACKCmd(FunctionalState NewState); +void UART2_WakeUpConfig(UART2_WakeUp_TypeDef UART2_WakeUp); +void UART2_ReceiverWakeUpCmd(FunctionalState NewState); +uint8_t UART2_ReceiveData8(void); +uint16_t UART2_ReceiveData9(void); +void UART2_SendData8(uint8_t Data); +void UART2_SendData9(uint16_t Data); +void UART2_SendBreak(void); +void UART2_SetAddress(uint8_t UART2_Address); +void UART2_SetGuardTime(uint8_t UART2_GuardTime); +void UART2_SetPrescaler(uint8_t UART2_Prescaler); +FlagStatus UART2_GetFlagStatus(UART2_Flag_TypeDef UART2_FLAG); +void UART2_ClearFlag(UART2_Flag_TypeDef UART2_FLAG); +ITStatus UART2_GetITStatus(UART2_IT_TypeDef UART2_IT); +void UART2_ClearITPendingBit(UART2_IT_TypeDef UART2_IT); + + +/** + * @} + */ + +#endif /* __STM8S_UART2_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_uart3.h b/4_EXT_INT_1PORT/lib/inc/stm8s_uart3.h new file mode 100644 index 0000000..15185e2 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_uart3.h @@ -0,0 +1,389 @@ +/** + ******************************************************************************** + * @file stm8s_uart3.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototypes and macros for the UART3 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_UART3_H +#define __STM8S_UART3_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup UART3_Exported_Types + * @{ + */ + +/** + * @brief UART3 WakeUP Modes + */ +typedef enum { UART3_WAKEUP_IDLELINE = (uint8_t)0x00, /**< 0x01 Idle Line wake up*/ + UART3_WAKEUP_ADDRESSMARK = (uint8_t)0x08 /**< 0x02 Address Mark wake up*/ + } UART3_WakeUp_TypeDef; + +/** + * @brief UART3 LIN Break detection length possible values + */ +typedef enum { UART3_LINBREAKDETECTIONLENGTH_10BITS = (uint8_t)0x00, /**< 10 bits Lin Break detection */ + UART3_LINBREAKDETECTIONLENGTH_11BITS = (uint8_t)0x01 /**< 11 bits Lin Break detection */ + } UART3_LINBreakDetectionLength_TypeDef; + + +/** + * @brief UART3 stop bits possible values + */ +typedef enum { UART3_STOPBITS_1 = (uint8_t)0x00, /**< One stop bit is transmitted at the end of frame*/ + UART3_STOPBITS_2 = (uint8_t)0x20 /**< Two stop bits are transmitted at the end of frame*/ + } UART3_StopBits_TypeDef; + +/** + * @brief UART3 parity possible values + */ +typedef enum { UART3_PARITY_NO = (uint8_t)0x00, /**< No Parity*/ + UART3_PARITY_EVEN = (uint8_t)0x04, /**< Even Parity*/ + UART3_PARITY_ODD = (uint8_t)0x06 /**< Odd Parity*/ + } UART3_Parity_TypeDef; + +/** + * @brief UART3 Word length possible values + */ +typedef enum { UART3_WORDLENGTH_8D = (uint8_t)0x00, /**< 0x00 8 bits Data*/ + UART3_WORDLENGTH_9D = (uint8_t)0x10 /**< 0x10 9 bits Data*/ + } UART3_WordLength_TypeDef; + +/** + * @brief UART3 Mode Transmit/Receive possible values + */ +typedef enum { UART3_MODE_RX_ENABLE = (uint8_t)0x08, /**< 0x08 Receive Enable*/ + UART3_MODE_TX_ENABLE = (uint8_t)0x04, /**< 0x04 Transmit Enable*/ + UART3_MODE_TX_DISABLE = (uint8_t)0x80, /**< 0x80 Receive Enable*/ + UART3_MODE_RX_DISABLE = (uint8_t)0x40, /**< 0x40 Single-wire Half-duplex mode*/ + UART3_MODE_TXRX_ENABLE = (uint8_t)0x0C /**< 0x0C Receive Enable and Transmit enable*/ + } UART3_Mode_TypeDef; + +/** + * @brief UART3 Mode possible values + */ +typedef enum { UART3_LIN_MODE_MASTER = (uint8_t)0x00, /**< LIN Master Mode*/ + UART3_LIN_MODE_SLAVE = (uint8_t)0x01 /**< LIN Slave Mode*/ + } UART3_LinMode_TypeDef; +/** + * @brief UART3 automatic resynchronisation possible values + */ +typedef enum { UART3_LIN_AUTOSYNC_DISABLE = (uint8_t)0x00, /**< LIN Autosynchronization Disable*/ + UART3_LIN_AUTOSYNC_ENABLE = (uint8_t)0x01 /**< LIN Autosynchronization Enable*/ + } UART3_LinAutosync_TypeDef; +/** + * @brief UART3 Divider Update Method possible values + */ +typedef enum { UART3_LIN_DIVUP_LBRR1 = (uint8_t)0x00, /**< LIN LDIV is updated as soon as LBRR1 is written*/ + UART3_LIN_DIVUP_NEXTRXNE = (uint8_t)0x01 /**< LIN LDIV is updated at the next received character*/ + } UART3_LinDivUp_TypeDef; + + +/** + * @brief UART3 Flag possible values + */ +typedef enum +{ + UART3_FLAG_TXE = (uint16_t)0x0080, /*!< Transmit Data Register Empty flag */ + UART3_FLAG_TC = (uint16_t)0x0040, /*!< Transmission Complete flag */ + UART3_FLAG_RXNE = (uint16_t)0x0020, /*!< Read Data Register Not Empty flag */ + UART3_FLAG_IDLE = (uint16_t)0x0010, /*!< Idle line detected flag */ + UART3_FLAG_OR_LHE = (uint16_t)0x0008, /*!< OverRun error flag */ + UART3_FLAG_NF = (uint16_t)0x0004, /*!< Noise error flag */ + UART3_FLAG_FE = (uint16_t)0x0002, /*!< Framing Error flag */ + UART3_FLAG_PE = (uint16_t)0x0001, /*!< Parity Error flag */ + UART3_FLAG_SBK = (uint16_t)0x0101, /**< Send Break Complete interrupt flag */ + UART3_FLAG_LBDF = (uint16_t)0x0210, /**< LIN Break Detection Flag */ + UART3_FLAG_LHDF = (uint16_t)0x0302, /**< LIN Header Detection Flag*/ + UART3_FLAG_LSF = (uint16_t)0x0301 /**< LIN Sync Field Flag*/ +} UART3_Flag_TypeDef; + +/** + * @brief UART3 Interrupt definition + * UART3_IT possible values + * Elements values convention: 0xZYX + * X: Position of the corresponding Interrupt + * - For the following values, X means the interrupt position in the CR2 register. + * UART3_IT_TXE + * UART3_IT_TC + * UART3_IT_RXNE + * UART3_IT_IDLE + * UART3_IT_OR + * - For the UART3_IT_PE value, X means the flag position in the CR1 register. + * - For the UART3_IT_LBDF value, X means the flag position in the CR4 register. + * - For the UART3_IT_LHDF value, X means the flag position in the CR6 register. + * Y: Flag position + * - For the following values, Y means the flag (pending bit) position in the SR register. + * UART3_IT_TXE + * UART3_IT_TC + * UART3_IT_RXNE + * UART3_IT_IDLE + * UART3_IT_OR + * UART3_IT_PE + * - For the UART3_IT_LBDF value, Y means the flag position in the CR4 register. + * - For the UART3_IT_LHDF value, Y means the flag position in the CR6 register. + * Z: Register index: indicate in which register the dedicated interrupt source is: + * - 1==> CR1 register + * - 2==> CR2 register + * - 3==> CR4 register + * - 4==> CR6 register + */ +typedef enum { UART3_IT_TXE = (uint16_t)0x0277, /**< Transmit interrupt */ + UART3_IT_TC = (uint16_t)0x0266, /**< Transmission Complete interrupt */ + UART3_IT_RXNE = (uint16_t)0x0255, /**< Data Register Not Empty interrupt */ + UART3_IT_IDLE = (uint16_t)0x0244, /**< Idle line detected interrupt */ + UART3_IT_OR = (uint16_t)0x0235, /**< OverRun error interrupt */ + UART3_IT_PE = (uint16_t)0x0100, /**< Parity Error interrupt */ + UART3_IT_LBDF = (uint16_t)0x0346, /**< LIN Break Detection interrupt */ + UART3_IT_LHDF = (uint16_t)0x0412, /**< LIN Header Detection interrupt*/ + UART3_IT_RXNE_OR = (uint16_t)0x0205 /*!< Receive/Overrun interrupt */ + } UART3_IT_TypeDef; + + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/* Exported macros ------------------------------------------------------------*/ + +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup UART3_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the FLAGs + */ +#define IS_UART3_FLAG_OK(Flag) \ + (((Flag) == UART3_FLAG_TXE) || \ + ((Flag) == UART3_FLAG_TC) || \ + ((Flag) == UART3_FLAG_RXNE) || \ + ((Flag) == UART3_FLAG_IDLE) || \ + ((Flag) == UART3_FLAG_OR_LHE) || \ + ((Flag) == UART3_FLAG_NF) || \ + ((Flag) == UART3_FLAG_FE) || \ + ((Flag) == UART3_FLAG_PE) || \ + ((Flag) == UART3_FLAG_SBK) || \ + ((Flag) == UART3_FLAG_LSF) || \ + ((Flag) == UART3_FLAG_LHDF) || \ + ((Flag) == UART3_FLAG_LBDF)) + + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the FLAGs that can be cleared by writing 0 + */ +#define IS_UART3_CLEAR_FLAG_OK(Flag) \ + (((Flag) == UART3_FLAG_RXNE) || \ + ((Flag) == UART3_FLAG_LHDF) || \ + ((Flag) == UART3_FLAG_LSF) || \ + ((Flag) == UART3_FLAG_LBDF)) + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the Interrupts + */ + +#define IS_UART3_CONFIG_IT_OK(Interrupt) \ + (((Interrupt) == UART3_IT_PE) || \ + ((Interrupt) == UART3_IT_TXE) || \ + ((Interrupt) == UART3_IT_TC) || \ + ((Interrupt) == UART3_IT_RXNE_OR ) || \ + ((Interrupt) == UART3_IT_IDLE) || \ + ((Interrupt) == UART3_IT_LHDF) || \ + ((Interrupt) == UART3_IT_LBDF)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the pending bit + */ +#define IS_UART3_GET_IT_OK(ITPendingBit) \ + (((ITPendingBit) == UART3_IT_TXE) || \ + ((ITPendingBit) == UART3_IT_TC) || \ + ((ITPendingBit) == UART3_IT_RXNE) || \ + ((ITPendingBit) == UART3_IT_IDLE) || \ + ((ITPendingBit) == UART3_IT_OR) || \ + ((ITPendingBit) == UART3_IT_LBDF) || \ + ((ITPendingBit) == UART3_IT_LHDF) || \ + ((ITPendingBit) == UART3_IT_PE)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the pending bit that can be cleared by writing 0 + */ +#define IS_UART3_CLEAR_IT_OK(ITPendingBit) \ + (((ITPendingBit) == UART3_IT_RXNE) || \ + ((ITPendingBit) == UART3_IT_LHDF) || \ + ((ITPendingBit) == UART3_IT_LBDF)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the MODEs + */ +#define IS_UART3_MODE_OK(Mode) \ + (((Mode) == (uint8_t)UART3_MODE_RX_ENABLE) || \ + ((Mode) == (uint8_t)UART3_MODE_RX_DISABLE) || \ + ((Mode) == (uint8_t)UART3_MODE_TX_ENABLE) || \ + ((Mode) == (uint8_t)UART3_MODE_TX_DISABLE) || \ + ((Mode) == (uint8_t)UART3_MODE_TXRX_ENABLE) || \ + ((Mode) == (uint8_t)((uint8_t)UART3_MODE_TX_ENABLE|(uint8_t)UART3_MODE_RX_ENABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART3_MODE_TX_ENABLE|(uint8_t)UART3_MODE_RX_DISABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART3_MODE_TX_DISABLE|(uint8_t)UART3_MODE_RX_DISABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART3_MODE_TX_DISABLE|(uint8_t)UART3_MODE_RX_ENABLE))) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the WordLengths + */ +#define IS_UART3_WORDLENGTH_OK(WordLength) \ + (((WordLength) == UART3_WORDLENGTH_8D) || \ + ((WordLength) == UART3_WORDLENGTH_9D)) + + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the WakeUps + */ +#define IS_UART3_WAKEUP_OK(WakeUpMode) \ + (((WakeUpMode) == UART3_WAKEUP_IDLELINE) || \ + ((WakeUpMode) == UART3_WAKEUP_ADDRESSMARK)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the LINBreakDetectionLengths + */ +#define IS_UART3_LINBREAKDETECTIONLENGTH_OK(LINBreakDetectionLengths) \ + (((LINBreakDetectionLengths) == UART3_LINBREAKDETECTIONLENGTH_10BITS) || \ + ((LINBreakDetectionLengths) == UART3_LINBREAKDETECTIONLENGTH_11BITS)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the UART3_StopBits + */ +#define IS_UART3_STOPBITS_OK(StopBit) \ + (((StopBit) == UART3_STOPBITS_1) || \ + ((StopBit) == UART3_STOPBITS_2)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the Parity + */ +#define IS_UART3_PARITY_OK(Parity) \ + (((Parity) == UART3_PARITY_NO) || \ + ((Parity) == UART3_PARITY_EVEN) || \ + ((Parity) == UART3_PARITY_ODD )) + +/** + * @brief Macro used by the assert_param function in order to check the maximum + * baudrate value + */ +#define IS_UART3_BAUDRATE_OK(NUM) ((NUM) <= (uint32_t)625000) + +/** + * @brief Macro used by the assert_param function in order to check the address + * of the UART3 or UART node + */ +#define UART3_ADDRESS_MAX ((uint8_t)16) +#define IS_UART3_ADDRESS_OK(Node) ((Node) < UART3_ADDRESS_MAX) + +/** + * @brief Macro used by the assert_param function in order to check the LIN mode + */ +#define IS_UART3_SLAVE_OK(Mode) \ + (((Mode) == UART3_LIN_MODE_MASTER) || \ + ((Mode) == UART3_LIN_MODE_SLAVE)) + +/** + * @brief Macro used by the assert_param function in order to check the LIN + * automatic resynchronization mode + */ +#define IS_UART3_AUTOSYNC_OK(AutosyncMode) \ + (((AutosyncMode) == UART3_LIN_AUTOSYNC_ENABLE) || \ + ((AutosyncMode) == UART3_LIN_AUTOSYNC_DISABLE)) + +/** + * @brief Macro used by the assert_param function in order to check the LIN + * divider update method + */ +#define IS_UART3_DIVUP_OK(DivupMethod) \ + (((DivupMethod) == UART3_LIN_DIVUP_LBRR1) || \ + ((DivupMethod) == UART3_LIN_DIVUP_NEXTRXNE)) + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup UART3_Exported_Functions + * @{ + */ + +void UART3_DeInit(void); +void UART3_Init(uint32_t BaudRate, UART3_WordLength_TypeDef WordLength, + UART3_StopBits_TypeDef StopBits, UART3_Parity_TypeDef Parity, + UART3_Mode_TypeDef Mode); +void UART3_Cmd(FunctionalState NewState); +void UART3_ITConfig(UART3_IT_TypeDef UART3_IT, FunctionalState NewState); +void UART3_LINBreakDetectionConfig(UART3_LINBreakDetectionLength_TypeDef UART3_LINBreakDetectionLength); +void UART3_LINConfig(UART3_LinMode_TypeDef UART3_Mode, + UART3_LinAutosync_TypeDef UART3_Autosync, + UART3_LinDivUp_TypeDef UART3_DivUp); +void UART3_LINCmd(FunctionalState NewState); +void UART3_ReceiverWakeUpCmd(FunctionalState NewState); +void UART3_WakeUpConfig( UART3_WakeUp_TypeDef UART3_WakeUp); +uint8_t UART3_ReceiveData8(void); +uint16_t UART3_ReceiveData9(void); +void UART3_SendData8(uint8_t Data); +void UART3_SendData9(uint16_t Data); +void UART3_SendBreak(void); +void UART3_SetAddress(uint8_t UART3_Address); +FlagStatus UART3_GetFlagStatus(UART3_Flag_TypeDef UART3_FLAG); +void UART3_ClearFlag(UART3_Flag_TypeDef UART3_FLAG); +ITStatus UART3_GetITStatus(UART3_IT_TypeDef UART3_IT); +void UART3_ClearITPendingBit(UART3_IT_TypeDef UART3_IT); +/** + * @} + */ + +#endif /* __STM8S_UART3_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_uart4.h b/4_EXT_INT_1PORT/lib/inc/stm8s_uart4.h new file mode 100644 index 0000000..670af29 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_uart4.h @@ -0,0 +1,444 @@ +/** + ******************************************************************************** + * @file stm8s_uart4.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototypes and macros for the UART4 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_UART4_H +#define __STM8S_UART4_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Exported types ------------------------------------------------------------*/ + +/** @addtogroup UART4_Exported_Types + * @{ + */ + +/** + * @brief UART4 Irda Modes + */ + +typedef enum { UART4_IRDAMODE_NORMAL = (uint8_t)0x00, /**< 0x00 Irda Normal Mode */ + UART4_IRDAMODE_LOWPOWER = (uint8_t)0x01 /**< 0x01 Irda Low Power Mode */ + + } UART4_IrDAMode_TypeDef; + +/** + * @brief UART4 WakeUP Modes + */ + +typedef enum { UART4_WAKEUP_IDLELINE = (uint8_t)0x00, /**< 0x01 Idle Line wake up */ + UART4_WAKEUP_ADDRESSMARK = (uint8_t)0x08 /**< 0x02 Address Mark wake up */ + } UART4_WakeUp_TypeDef; + + +/** + * @brief UART4 LIN Break detection length possible values + */ +typedef enum { UART4_LINBREAKDETECTIONLENGTH_10BITS = (uint8_t)0x00, /**< 0x01 10 bits Lin Break detection */ + UART4_LINBREAKDETECTIONLENGTH_11BITS = (uint8_t)0x01 /**< 0x02 11 bits Lin Break detection */ + } UART4_LINBreakDetectionLength_TypeDef; + +/** + * @brief UART4 stop bits possible values + */ + +typedef enum { UART4_STOPBITS_1 = (uint8_t)0x00, /**< One stop bit is transmitted at the end of frame*/ + UART4_STOPBITS_0_5 = (uint8_t)0x10, /**< Half stop bits is transmitted at the end of frame*/ + UART4_STOPBITS_2 = (uint8_t)0x20, /**< Two stop bits are transmitted at the end of frame*/ + UART4_STOPBITS_1_5 = (uint8_t)0x30 /**< One and half stop bits*/ + } UART4_StopBits_TypeDef; + + +/** + * @brief UART4 parity possible values + */ +typedef enum { UART4_PARITY_NO = (uint8_t)0x00, /**< No Parity*/ + UART4_PARITY_EVEN = (uint8_t)0x04, /**< Even Parity*/ + UART4_PARITY_ODD = (uint8_t)0x06 /**< Odd Parity*/ + } UART4_Parity_TypeDef; +/** + * @brief UART4 Mode possible values + */ +typedef enum { UART4_LIN_MODE_MASTER = (uint8_t)0x00, /**< LIN Master Mode*/ + UART4_LIN_MODE_SLAVE = (uint8_t)0x01 /**< LIN Slave Mode*/ + } UART4_LinMode_TypeDef; +/** + * @brief UART4 automatic resynchronisation possible values + */ +typedef enum { UART4_LIN_AUTOSYNC_DISABLE = (uint8_t)0x00, /**< LIN Autosynchronization Disable*/ + UART4_LIN_AUTOSYNC_ENABLE = (uint8_t)0x01 /**< LIN Autosynchronization Enable*/ + } UART4_LinAutosync_TypeDef; +/** + * @brief UART4 Divider Update Method possible values + */ +typedef enum { UART4_LIN_DIVUP_LBRR1 = (uint8_t)0x00, /**< LIN LDIV is updated as soon as LBRR1 is written*/ + UART4_LIN_DIVUP_NEXTRXNE = (uint8_t)0x01 /**< LIN LDIV is updated at the next received character*/ + } UART4_LinDivUp_TypeDef; + +/** + * @brief UART4 Synchrone modes + */ +typedef enum { UART4_SYNCMODE_CLOCK_DISABLE = (uint8_t)0x80, /**< 0x80 Sync mode Disable, SLK pin Disable */ + UART4_SYNCMODE_CLOCK_ENABLE = (uint8_t)0x08, /**< 0x08 Sync mode Enable, SLK pin Enable */ + UART4_SYNCMODE_CPOL_LOW = (uint8_t)0x40, /**< 0x40 Steady low value on SCLK pin outside transmission window */ + UART4_SYNCMODE_CPOL_HIGH = (uint8_t)0x04, /**< 0x04 Steady high value on SCLK pin outside transmission window */ + UART4_SYNCMODE_CPHA_MIDDLE = (uint8_t)0x20, /**< 0x20 SCLK clock line activated in middle of data bit */ + UART4_SYNCMODE_CPHA_BEGINING = (uint8_t)0x02, /**< 0x02 SCLK clock line activated at beginning of data bit */ + UART4_SYNCMODE_LASTBIT_DISABLE = (uint8_t)0x10, /**< 0x10 The clock pulse of the last data bit is not output to the SCLK pin */ + UART4_SYNCMODE_LASTBIT_ENABLE = (uint8_t)0x01 /**< 0x01 The clock pulse of the last data bit is output to the SCLK pin */ + } UART4_SyncMode_TypeDef; + +/** + * @brief UART4 Word length possible values + */ +typedef enum { UART4_WORDLENGTH_8D = (uint8_t)0x00,/**< 0x00 8 bits Data */ + UART4_WORDLENGTH_9D = (uint8_t)0x10 /**< 0x10 9 bits Data */ + } UART4_WordLength_TypeDef; + +/** + * @brief UART4 Mode possible values + */ +typedef enum { UART4_MODE_RX_ENABLE = (uint8_t)0x08, /**< 0x08 Receive Enable */ + UART4_MODE_TX_ENABLE = (uint8_t)0x04, /**< 0x04 Transmit Enable */ + UART4_MODE_TX_DISABLE = (uint8_t)0x80, /**< 0x80 Transmit Disable */ + UART4_MODE_RX_DISABLE = (uint8_t)0x40, /**< 0x40 Single-wire Half-duplex mode */ + UART4_MODE_TXRX_ENABLE = (uint8_t)0x0C /**< 0x0C Transmit Enable and Receive Enable */ + } UART4_Mode_TypeDef; +/** + * @brief UART4 Flag possible values + */ +typedef enum +{ + UART4_FLAG_TXE = (uint16_t)0x0080, /*!< Transmit Data Register Empty flag */ + UART4_FLAG_TC = (uint16_t)0x0040, /*!< Transmission Complete flag */ + UART4_FLAG_RXNE = (uint16_t)0x0020, /*!< Read Data Register Not Empty flag */ + UART4_FLAG_IDLE = (uint16_t)0x0010, /*!< Idle line detected flag */ + UART4_FLAG_OR_LHE = (uint16_t)0x0008, /*!< OverRun error flag */ + UART4_FLAG_NF = (uint16_t)0x0004, /*!< Noise error flag */ + UART4_FLAG_FE = (uint16_t)0x0002, /*!< Framing Error flag */ + UART4_FLAG_PE = (uint16_t)0x0001, /*!< Parity Error flag */ + UART4_FLAG_SBK = (uint16_t)0x0101, /**< Send Break Complete interrupt flag */ + UART4_FLAG_LBDF = (uint16_t)0x0210, /**< LIN Break Detection Flag */ + UART4_FLAG_LHDF = (uint16_t)0x0302, /**< LIN Header Detection Flag*/ + UART4_FLAG_LSF = (uint16_t)0x0301 /**< LIN Sync Field Flag*/ +} UART4_Flag_TypeDef; + +/** + * @brief UART4 Interrupt definition + * UART4_IT possible values + * Elements values convention: 0xZYX + * X: Position of the corresponding Interrupt + * - For the following values, X means the interrupt position in the CR2 register. + * UART4_IT_TXE + * UART4_IT_TC + * UART4_IT_RXNE + * UART4_IT_IDLE + * UART4_IT_OR + * - For the UART4_IT_PE value, X means the flag position in the CR1 register. + * - For the UART4_IT_LBDF value, X means the flag position in the CR4 register. + * - For the UART4_IT_LHDF value, X means the flag position in the CR6 register. + * Y: Flag position + * - For the following values, Y means the flag (pending bit) position in the SR register. + * UART4_IT_TXE + * UART4_IT_TC + * UART4_IT_RXNE + * UART4_IT_IDLE + * UART4_IT_OR + * UART4_IT_PE + * - For the UART4_IT_LBDF value, Y means the flag position in the CR4 register. + * - For the UART4_IT_LHDF value, Y means the flag position in the CR6 register. + * Z: Register index: indicate in which register the dedicated interrupt source is: + * - 1==> CR1 register + * - 2==> CR2 register + * - 3==> CR4 register + * - 4==> CR6 register + */ +typedef enum { UART4_IT_TXE = (uint16_t)0x0277, /**< Transmit interrupt */ + UART4_IT_TC = (uint16_t)0x0266, /**< Transmission Complete interrupt */ + UART4_IT_RXNE = (uint16_t)0x0255, /**< Data Register Not Empty interrupt */ + UART4_IT_IDLE = (uint16_t)0x0244, /**< Idle line detected interrupt */ + UART4_IT_OR = (uint16_t)0x0235, /**< OverRun error interrupt */ + UART4_IT_PE = (uint16_t)0x0100, /**< Parity Error interrupt */ + UART4_IT_LBDF = (uint16_t)0x0346, /**< LIN Break Detection interrupt */ + UART4_IT_LHDF = (uint16_t)0x0412, /**< LIN Header Detection interrupt*/ + UART4_IT_RXNE_OR = (uint16_t)0x0205 /*!< Receive/Overrun interrupt */ + } UART4_IT_TypeDef; + +/** + * @} + */ + +/* Exported constants --------------------------------------------------------*/ +/* Exported macros -----------------------------------------------------------*/ +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup UART4_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function to check the different functions parameters. + */ + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the MODEs possible combination should be one of + * the following. + */ + +#define IS_UART4_MODE_OK(Mode) \ + (((Mode) == (uint8_t)UART4_MODE_RX_ENABLE) || \ + ((Mode) == (uint8_t)UART4_MODE_RX_DISABLE) || \ + ((Mode) == (uint8_t)UART4_MODE_TX_ENABLE) || \ + ((Mode) == (uint8_t)UART4_MODE_TX_DISABLE) || \ + ((Mode) == (uint8_t)UART4_MODE_TXRX_ENABLE) || \ + ((Mode) == (uint8_t)((uint8_t)UART4_MODE_TX_ENABLE|(uint8_t)UART4_MODE_RX_ENABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART4_MODE_TX_ENABLE|(uint8_t)UART4_MODE_RX_DISABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART4_MODE_TX_DISABLE|(uint8_t)UART4_MODE_RX_DISABLE)) || \ + ((Mode) == (uint8_t)((uint8_t)UART4_MODE_TX_DISABLE|(uint8_t)UART4_MODE_RX_ENABLE))) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the WordLengths + */ +#define IS_UART4_WORDLENGTH_OK(WordLength) \ + (((WordLength) == UART4_WORDLENGTH_8D) || \ + ((WordLength) == UART4_WORDLENGTH_9D)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the SyncModes; it should exclude values such + * as UART4_CLOCK_ENABLE|UART4_CLOCK_DISABLE + */ +#define IS_UART4_SYNCMODE_OK(SyncMode) \ + (!((((SyncMode)&(((uint8_t)UART4_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART4_SYNCMODE_CLOCK_DISABLE))) == (((uint8_t)UART4_SYNCMODE_CLOCK_ENABLE)|((uint8_t)UART4_SYNCMODE_CLOCK_DISABLE))) || \ + (((SyncMode)&(((uint8_t)UART4_SYNCMODE_CPOL_LOW )|((uint8_t)UART4_SYNCMODE_CPOL_HIGH))) == (((uint8_t)UART4_SYNCMODE_CPOL_LOW )|((uint8_t)UART4_SYNCMODE_CPOL_HIGH))) || \ + (((SyncMode)&(((uint8_t)UART4_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART4_SYNCMODE_CPHA_BEGINING))) == (((uint8_t)UART4_SYNCMODE_CPHA_MIDDLE)|((uint8_t)UART4_SYNCMODE_CPHA_BEGINING))) || \ + (((SyncMode)&(((uint8_t)UART4_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART4_SYNCMODE_LASTBIT_ENABLE))) == (((uint8_t)UART4_SYNCMODE_LASTBIT_DISABLE)|((uint8_t)UART4_SYNCMODE_LASTBIT_ENABLE))))) + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the FLAGs + */ +#define IS_UART4_FLAG_OK(Flag) \ + (((Flag) == UART4_FLAG_TXE) || \ + ((Flag) == UART4_FLAG_TC) || \ + ((Flag) == UART4_FLAG_RXNE) || \ + ((Flag) == UART4_FLAG_IDLE) || \ + ((Flag) == UART4_FLAG_OR_LHE) || \ + ((Flag) == UART4_FLAG_NF) || \ + ((Flag) == UART4_FLAG_FE) || \ + ((Flag) == UART4_FLAG_PE) || \ + ((Flag) == UART4_FLAG_SBK) || \ + ((Flag) == UART4_FLAG_LSF) || \ + ((Flag) == UART4_FLAG_LHDF) || \ + ((Flag) == UART4_FLAG_LBDF)) + + +/** + * @brief Macro used by the assert_param function in order to check the + * different sensitivity values for the FLAGs that can be cleared by writing 0 + */ +#define IS_UART4_CLEAR_FLAG_OK(Flag) \ + (((Flag) == UART4_FLAG_RXNE) || \ + ((Flag) == UART4_FLAG_LHDF) || \ + ((Flag) == UART4_FLAG_LSF) || \ + ((Flag) == UART4_FLAG_LBDF)) + +/** + * @brief Macro used by the assert_param function in order to check + * the different sensitivity values for the Interrupts + */ + +#define IS_UART4_CONFIG_IT_OK(Interrupt) \ + (((Interrupt) == UART4_IT_PE) || \ + ((Interrupt) == UART4_IT_TXE) || \ + ((Interrupt) == UART4_IT_TC) || \ + ((Interrupt) == UART4_IT_RXNE_OR ) || \ + ((Interrupt) == UART4_IT_IDLE) || \ + ((Interrupt) == UART4_IT_LHDF) || \ + ((Interrupt) == UART4_IT_LBDF)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the pending bit + */ +#define IS_UART4_GET_IT_OK(ITPendingBit) \ + (((ITPendingBit) == UART4_IT_TXE) || \ + ((ITPendingBit) == UART4_IT_TC) || \ + ((ITPendingBit) == UART4_IT_RXNE) || \ + ((ITPendingBit) == UART4_IT_IDLE) || \ + ((ITPendingBit) == UART4_IT_OR) || \ + ((ITPendingBit) == UART4_IT_LBDF) || \ + ((ITPendingBit) == UART4_IT_LHDF) || \ + ((ITPendingBit) == UART4_IT_PE)) + +/** + * @brief Macro used by the assert function in order to check the different + * sensitivity values for the pending bit that can be cleared by writing 0 + */ +#define IS_UART4_CLEAR_IT_OK(ITPendingBit) \ + (((ITPendingBit) == UART4_IT_RXNE) || \ + ((ITPendingBit) == UART4_IT_LHDF) || \ + ((ITPendingBit) == UART4_IT_LBDF)) + + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the IrDAModes + */ +#define IS_UART4_IRDAMODE_OK(IrDAMode) \ + (((IrDAMode) == UART4_IRDAMODE_LOWPOWER) || \ + ((IrDAMode) == UART4_IRDAMODE_NORMAL)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the WakeUps + */ +#define IS_UART4_WAKEUP_OK(WakeUp) \ + (((WakeUp) == UART4_WAKEUP_IDLELINE) || \ + ((WakeUp) == UART4_WAKEUP_ADDRESSMARK)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the LINBreakDetectionLengths + */ +#define IS_UART4_LINBREAKDETECTIONLENGTH_OK(LINBreakDetectionLength) \ + (((LINBreakDetectionLength) == UART4_LINBREAKDETECTIONLENGTH_10BITS) || \ + ((LINBreakDetectionLength) == UART4_LINBREAKDETECTIONLENGTH_11BITS)) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the UART4_StopBits + */ +#define IS_UART4_STOPBITS_OK(StopBit) (((StopBit) == UART4_STOPBITS_1) || \ + ((StopBit) == UART4_STOPBITS_0_5) || \ + ((StopBit) == UART4_STOPBITS_2) || \ + ((StopBit) == UART4_STOPBITS_1_5 )) + +/** + * @brief Macro used by the assert_param function in order to check the different + * sensitivity values for the Paritys + */ +#define IS_UART4_PARITY_OK(Parity) (((Parity) == UART4_PARITY_NO) || \ + ((Parity) == UART4_PARITY_EVEN) || \ + ((Parity) == UART4_PARITY_ODD )) + +/** + * @brief Macro used by the assert_param function in order to check the maximum + * baudrate value + */ +#define IS_UART4_BAUDRATE_OK(NUM) ((NUM) <= (uint32_t)625000) + +/** + * @brief Macro used by the assert_param function in order to check the address + * of the UART4 or UART node + */ +#define UART4_ADDRESS_MAX ((uint8_t)16) +#define IS_UART4_ADDRESS_OK(node) ((node) < UART4_ADDRESS_MAX ) + +/** + * @brief Macro used by the assert_param function in order to check the LIN mode + */ +#define IS_UART4_SLAVE_OK(Mode) \ + (((Mode) == UART4_LIN_MODE_MASTER) || \ + ((Mode) == UART4_LIN_MODE_SLAVE)) + +/** + * @brief Macro used by the assert_param function in order to check the LIN + * automatic resynchronization mode + */ +#define IS_UART4_AUTOSYNC_OK(AutosyncMode) \ + (((AutosyncMode) == UART4_LIN_AUTOSYNC_ENABLE) || \ + ((AutosyncMode) == UART4_LIN_AUTOSYNC_DISABLE)) + +/** + * @brief Macro used by the assert_param function in order to check the LIN divider update method + */ +#define IS_UART4_DIVUP_OK(DivupMethod) \ + (((DivupMethod) == UART4_LIN_DIVUP_LBRR1) || \ + ((DivupMethod) == UART4_LIN_DIVUP_NEXTRXNE)) + + +/** + * @} + */ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup UART4_Exported_Functions + * @{ + */ +void UART4_DeInit(void); +void UART4_Init(uint32_t BaudRate, UART4_WordLength_TypeDef WordLength, + UART4_StopBits_TypeDef StopBits, UART4_Parity_TypeDef Parity, + UART4_SyncMode_TypeDef SyncMode, UART4_Mode_TypeDef Mode); +void UART4_Cmd(FunctionalState NewState); +void UART4_ITConfig(UART4_IT_TypeDef UART4_IT, FunctionalState NewState); +void UART4_HalfDuplexCmd(FunctionalState NewState); +void UART4_IrDAConfig(UART4_IrDAMode_TypeDef UART4_IrDAMode); +void UART4_IrDACmd(FunctionalState NewState); +void UART4_LINBreakDetectionConfig(UART4_LINBreakDetectionLength_TypeDef UART4_LINBreakDetectionLength); +void UART4_LINConfig(UART4_LinMode_TypeDef UART4_Mode, + UART4_LinAutosync_TypeDef UART4_Autosync, + UART4_LinDivUp_TypeDef UART4_DivUp); +void UART4_LINCmd(FunctionalState NewState); +void UART4_SmartCardCmd(FunctionalState NewState); +void UART4_SmartCardNACKCmd(FunctionalState NewState); +void UART4_WakeUpConfig(UART4_WakeUp_TypeDef UART4_WakeUp); +void UART4_ReceiverWakeUpCmd(FunctionalState NewState); +uint8_t UART4_ReceiveData8(void); +uint16_t UART4_ReceiveData9(void); +void UART4_SendData8(uint8_t Data); +void UART4_SendData9(uint16_t Data); +void UART4_SendBreak(void); +void UART4_SetAddress(uint8_t UART4_Address); +void UART4_SetGuardTime(uint8_t UART4_GuardTime); +void UART4_SetPrescaler(uint8_t UART4_Prescaler); +FlagStatus UART4_GetFlagStatus(UART4_Flag_TypeDef UART4_FLAG); +void UART4_ClearFlag(UART4_Flag_TypeDef UART4_FLAG); +ITStatus UART4_GetITStatus(UART4_IT_TypeDef UART4_IT); +void UART4_ClearITPendingBit(UART4_IT_TypeDef UART4_IT); + + +/** + * @} + */ + +#endif /* __STM8S_UART4_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/inc/stm8s_wwdg.h b/4_EXT_INT_1PORT/lib/inc/stm8s_wwdg.h new file mode 100644 index 0000000..5e8ec20 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/inc/stm8s_wwdg.h @@ -0,0 +1,87 @@ +/** + ******************************************************************************** + * @file stm8s_wwdg.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all functions prototype and macros for the WWDG peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_WWDG_H +#define __STM8S_WWDG_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Private macros ------------------------------------------------------------*/ + +/** @addtogroup WWDG_Private_Macros + * @{ + */ + +/** + * @brief Macro used by the assert function in order to check the + * values of the window register. + */ +#define IS_WWDG_WINDOWLIMITVALUE_OK(WindowLimitValue) ((WindowLimitValue) <= 0x7F) + +/** + * @brief Macro used by the assert function in order to check the different + * values of the counter register. + */ +#define IS_WWDG_COUNTERVALUE_OK(CounterValue) ((CounterValue) <= 0x7F) + +/** + * @} + */ + +/* Exported types ------------------------------------------------------------*/ + +/* Exported functions ------------------------------------------------------- */ + +/** @addtogroup WWDG_Exported_Functions + * @{ + */ + +void WWDG_Init(uint8_t Counter, uint8_t WindowValue); +void WWDG_SetCounter(uint8_t Counter); +uint8_t WWDG_GetCounter(void); +void WWDG_SWReset(void); +void WWDG_SetWindowValue(uint8_t WindowValue); + + +/** + * @} + */ + +#endif /* __STM8S_WWDG_H */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_adc1.c b/4_EXT_INT_1PORT/lib/src/stm8s_adc1.c new file mode 100644 index 0000000..d203a49 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_adc1.c @@ -0,0 +1,697 @@ +/** + ****************************************************************************** + * @file stm8s_adc1.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions/macros for the ADC1 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_adc1.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Public functions ----------------------------------------------------------*/ + +/** + * @addtogroup ADC1_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the ADC1 peripheral registers to their default reset values. + * @param None + * @retval None + */ +void ADC1_DeInit(void) +{ + ADC1->CSR = ADC1_CSR_RESET_VALUE; + ADC1->CR1 = ADC1_CR1_RESET_VALUE; + ADC1->CR2 = ADC1_CR2_RESET_VALUE; + ADC1->CR3 = ADC1_CR3_RESET_VALUE; + ADC1->TDRH = ADC1_TDRH_RESET_VALUE; + ADC1->TDRL = ADC1_TDRL_RESET_VALUE; + ADC1->HTRH = ADC1_HTRH_RESET_VALUE; + ADC1->HTRL = ADC1_HTRL_RESET_VALUE; + ADC1->LTRH = ADC1_LTRH_RESET_VALUE; + ADC1->LTRL = ADC1_LTRL_RESET_VALUE; + ADC1->AWCRH = ADC1_AWCRH_RESET_VALUE; + ADC1->AWCRL = ADC1_AWCRL_RESET_VALUE; +} + +/** + * @brief Initializes the ADC1 peripheral according to the specified parameters + * @param ADC1_ConversionMode: specifies the conversion mode + * can be one of the values of @ref ADC1_ConvMode_TypeDef. + * @param ADC1_Channel: specifies the channel to convert + * can be one of the values of @ref ADC1_Channel_TypeDef. + * @param ADC1_PrescalerSelection: specifies the ADC1 prescaler + * can be one of the values of @ref ADC1_PresSel_TypeDef. + * @param ADC1_ExtTrigger: specifies the external trigger + * can be one of the values of @ref ADC1_ExtTrig_TypeDef. + * @param ADC1_ExtTriggerState: specifies the external trigger new state + * can be one of the values of @ref FunctionalState. + * @param ADC1_Align: specifies the converted data alignment + * can be one of the values of @ref ADC1_Align_TypeDef. + * @param ADC1_SchmittTriggerChannel: specifies the schmitt trigger channel + * can be one of the values of @ref ADC1_SchmittTrigg_TypeDef. + * @param ADC1_SchmittTriggerState: specifies the schmitt trigger state + * can be one of the values of @ref FunctionalState. + * @retval None + */ +void ADC1_Init(ADC1_ConvMode_TypeDef ADC1_ConversionMode, ADC1_Channel_TypeDef ADC1_Channel, ADC1_PresSel_TypeDef ADC1_PrescalerSelection, ADC1_ExtTrig_TypeDef ADC1_ExtTrigger, FunctionalState ADC1_ExtTriggerState, ADC1_Align_TypeDef ADC1_Align, ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel, FunctionalState ADC1_SchmittTriggerState) +{ + /* Check the parameters */ + assert_param(IS_ADC1_CONVERSIONMODE_OK(ADC1_ConversionMode)); + assert_param(IS_ADC1_CHANNEL_OK(ADC1_Channel)); + assert_param(IS_ADC1_PRESSEL_OK(ADC1_PrescalerSelection)); + assert_param(IS_ADC1_EXTTRIG_OK(ADC1_ExtTrigger)); + assert_param(IS_FUNCTIONALSTATE_OK(((ADC1_ExtTriggerState)))); + assert_param(IS_ADC1_ALIGN_OK(ADC1_Align)); + assert_param(IS_ADC1_SCHMITTTRIG_OK(ADC1_SchmittTriggerChannel)); + assert_param(IS_FUNCTIONALSTATE_OK(ADC1_SchmittTriggerState)); + + /*-----------------CR1 & CSR configuration --------------------*/ + /* Configure the conversion mode and the channel to convert + respectively according to ADC1_ConversionMode & ADC1_Channel values & ADC1_Align values */ + ADC1_ConversionConfig(ADC1_ConversionMode, ADC1_Channel, ADC1_Align); + /* Select the prescaler division factor according to ADC1_PrescalerSelection values */ + ADC1_PrescalerConfig(ADC1_PrescalerSelection); + + /*-----------------CR2 configuration --------------------*/ + /* Configure the external trigger state and event respectively + according to NewState, ADC1_ExtTrigger */ + ADC1_ExternalTriggerConfig(ADC1_ExtTrigger, ADC1_ExtTriggerState); + + /*------------------TDR configuration ---------------------------*/ + /* Configure the schmitt trigger channel and state respectively + according to ADC1_SchmittTriggerChannel & ADC1_SchmittTriggerNewState values */ + ADC1_SchmittTriggerConfig(ADC1_SchmittTriggerChannel, ADC1_SchmittTriggerState); + + /* Enable the ADC1 peripheral */ + ADC1->CR1 |= ADC1_CR1_ADON; +} + +/** + * @brief Enables or Disables the ADC1 peripheral. + * @param NewState: specifies the peripheral enabled or disabled state. + * @retval None + */ +void ADC1_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + ADC1->CR1 |= ADC1_CR1_ADON; + } + else /* NewState == DISABLE */ + { + ADC1->CR1 &= (uint8_t)(~ADC1_CR1_ADON); + } +} + +/** + * @brief Enables or Disables the ADC1 scan mode. + * @param NewState: specifies the selected mode enabled or disabled state. + * @retval None + */ +void ADC1_ScanModeCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + ADC1->CR2 |= ADC1_CR2_SCAN; + } + else /* NewState == DISABLE */ + { + ADC1->CR2 &= (uint8_t)(~ADC1_CR2_SCAN); + } +} + +/** + * @brief Enables or Disables the ADC1 data store into the Data Buffer registers rather than in the Data Register + * @param NewState: specifies the selected mode enabled or disabled state. + * @retval None + */ +void ADC1_DataBufferCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + ADC1->CR3 |= ADC1_CR3_DBUF; + } + else /* NewState == DISABLE */ + { + ADC1->CR3 &= (uint8_t)(~ADC1_CR3_DBUF); + } +} + +/** + * @brief Enables or disables the ADC1 interrupt. + * @param ADC1_IT specifies the name of the interrupt to enable or disable. + * This parameter can be one of the following values: + * - ADC1_IT_AWDITEN : Analog WDG interrupt enable + * - ADC1_IT_EOCITEN : EOC iterrupt enable + * @param NewState specifies the state of the interrupt to apply. + * @retval None + */ +void ADC1_ITConfig(ADC1_IT_TypeDef ADC1_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC1_IT_OK(ADC1_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the ADC1 interrupts */ + ADC1->CSR |= (uint8_t)ADC1_IT; + } + else /* NewState == DISABLE */ + { + /* Disable the ADC1 interrupts */ + ADC1->CSR &= (uint8_t)((uint16_t)~(uint16_t)ADC1_IT); + } +} + +/** + * @brief Configure the ADC1 prescaler division factor. + * @param ADC1_Prescaler: the selected precaler. + * It can be one of the values of @ref ADC1_PresSel_TypeDef. + * @retval None + */ +void ADC1_PrescalerConfig(ADC1_PresSel_TypeDef ADC1_Prescaler) +{ + /* Check the parameter */ + assert_param(IS_ADC1_PRESSEL_OK(ADC1_Prescaler)); + + /* Clear the SPSEL bits */ + ADC1->CR1 &= (uint8_t)(~ADC1_CR1_SPSEL); + /* Select the prescaler division factor according to ADC1_PrescalerSelection values */ + ADC1->CR1 |= (uint8_t)(ADC1_Prescaler); +} + +/** + * @brief Enables or disables the ADC1 Schmitt Trigger on a selected channel. + * @param ADC1_SchmittTriggerChannel specifies the desired Channel. + * It can be set of the values of @ref ADC1_SchmittTrigg_TypeDef. + * @param NewState specifies Channel new status. + * can have one of the values of @ref FunctionalState. + * @retval None + */ +void ADC1_SchmittTriggerConfig(ADC1_SchmittTrigg_TypeDef ADC1_SchmittTriggerChannel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC1_SCHMITTTRIG_OK(ADC1_SchmittTriggerChannel)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (ADC1_SchmittTriggerChannel == ADC1_SCHMITTTRIG_ALL) + { + if (NewState != DISABLE) + { + ADC1->TDRL &= (uint8_t)0x0; + ADC1->TDRH &= (uint8_t)0x0; + } + else /* NewState == DISABLE */ + { + ADC1->TDRL |= (uint8_t)0xFF; + ADC1->TDRH |= (uint8_t)0xFF; + } + } + else if (ADC1_SchmittTriggerChannel < ADC1_SCHMITTTRIG_CHANNEL8) + { + if (NewState != DISABLE) + { + ADC1->TDRL &= (uint8_t)(~(uint8_t)((uint8_t)0x01 << (uint8_t)ADC1_SchmittTriggerChannel)); + } + else /* NewState == DISABLE */ + { + ADC1->TDRL |= (uint8_t)((uint8_t)0x01 << (uint8_t)ADC1_SchmittTriggerChannel); + } + } + else /* ADC1_SchmittTriggerChannel >= ADC1_SCHMITTTRIG_CHANNEL8 */ + { + if (NewState != DISABLE) + { + ADC1->TDRH &= (uint8_t)(~(uint8_t)((uint8_t)0x01 << ((uint8_t)ADC1_SchmittTriggerChannel - (uint8_t)8))); + } + else /* NewState == DISABLE */ + { + ADC1->TDRH |= (uint8_t)((uint8_t)0x01 << ((uint8_t)ADC1_SchmittTriggerChannel - (uint8_t)8)); + } + } +} + +/** + * @brief Configure the ADC1 conversion on selected channel. + * @param ADC1_ConversionMode Specifies the conversion type. + * It can be set of the values of @ref ADC1_ConvMode_TypeDef + * @param ADC1_Channel specifies the ADC1 Channel. + * It can be set of the values of @ref ADC1_Channel_TypeDef + * @param ADC1_Align specifies the converted data alignment. + * It can be set of the values of @ref ADC1_Align_TypeDef + * @retval None + */ +void ADC1_ConversionConfig(ADC1_ConvMode_TypeDef ADC1_ConversionMode, ADC1_Channel_TypeDef ADC1_Channel, ADC1_Align_TypeDef ADC1_Align) +{ + /* Check the parameters */ + assert_param(IS_ADC1_CONVERSIONMODE_OK(ADC1_ConversionMode)); + assert_param(IS_ADC1_CHANNEL_OK(ADC1_Channel)); + assert_param(IS_ADC1_ALIGN_OK(ADC1_Align)); + + /* Clear the align bit */ + ADC1->CR2 &= (uint8_t)(~ADC1_CR2_ALIGN); + /* Configure the data alignment */ + ADC1->CR2 |= (uint8_t)(ADC1_Align); + + if (ADC1_ConversionMode == ADC1_CONVERSIONMODE_CONTINUOUS) + { + /* Set the continuous conversion mode */ + ADC1->CR1 |= ADC1_CR1_CONT; + } + else /* ADC1_ConversionMode == ADC1_CONVERSIONMODE_SINGLE */ + { + /* Set the single conversion mode */ + ADC1->CR1 &= (uint8_t)(~ADC1_CR1_CONT); + } + + /* Clear the ADC1 channels */ + ADC1->CSR &= (uint8_t)(~ADC1_CSR_CH); + /* Select the ADC1 channel */ + ADC1->CSR |= (uint8_t)(ADC1_Channel); +} + +/** + * @brief Configure the ADC1 conversion on external trigger event. + * @par Full description: + * The selected external trigger event can be enabled or disabled. + * @param ADC1_ExtTrigger to select the External trigger event. + * can have one of the values of @ref ADC1_ExtTrig_TypeDef. + * @param NewState to enable/disable the selected external trigger + * can have one of the values of @ref FunctionalState. + * @retval None + */ +void ADC1_ExternalTriggerConfig(ADC1_ExtTrig_TypeDef ADC1_ExtTrigger, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC1_EXTTRIG_OK(ADC1_ExtTrigger)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Clear the external trigger selection bits */ + ADC1->CR2 &= (uint8_t)(~ADC1_CR2_EXTSEL); + + if (NewState != DISABLE) + { + /* Enable the selected external Trigger */ + ADC1->CR2 |= (uint8_t)(ADC1_CR2_EXTTRIG); + } + else /* NewState == DISABLE */ + { + /* Disable the selected external trigger */ + ADC1->CR2 &= (uint8_t)(~ADC1_CR2_EXTTRIG); + } + + /* Set the selected external trigger */ + ADC1->CR2 |= (uint8_t)(ADC1_ExtTrigger); +} + +/** + * @brief Start ADC1 conversion + * @par Full description: + * This function triggers the start of conversion, after ADC1 configuration. + * @param None + * @retval None + * @par Required preconditions: + * Enable the ADC1 peripheral before calling this function + */ +void ADC1_StartConversion(void) +{ + ADC1->CR1 |= ADC1_CR1_ADON; +} + +/** + * @brief Get one sample of measured signal. + * @param None + * @retval ConversionValue: value of the measured signal. + * @par Required preconditions: + * ADC1 conversion finished. + */ +uint16_t ADC1_GetConversionValue(void) +{ + uint16_t temph = 0; + uint8_t templ = 0; + + if ((ADC1->CR2 & ADC1_CR2_ALIGN) != 0) /* Right alignment */ + { + /* Read LSB first */ + templ = ADC1->DRL; + /* Then read MSB */ + temph = ADC1->DRH; + + temph = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8)); + } + else /* Left alignment */ + { + /* Read MSB first*/ + temph = ADC1->DRH; + /* Then read LSB */ + templ = ADC1->DRL; + + temph = (uint16_t)((uint16_t)((uint16_t)templ << 6) | (uint16_t)((uint16_t)temph << 8)); + } + + return ((uint16_t)temph); +} + +/** + * @brief Enables or disables the analog watchdog for the given channel. + * @param Channel specifies the desired Channel. + * It can be set of the values of @ref ADC1_Channel_TypeDef. + * @param NewState specifies the analog watchdog new state. + * can have one of the values of @ref FunctionalState. + * @retval None + */ +void ADC1_AWDChannelConfig(ADC1_Channel_TypeDef Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + assert_param(IS_ADC1_CHANNEL_OK(Channel)); + + if (Channel < (uint8_t)8) + { + if (NewState != DISABLE) + { + ADC1->AWCRL |= (uint8_t)((uint8_t)1 << Channel); + } + else /* NewState == DISABLE */ + { + ADC1->AWCRL &= (uint8_t)~(uint8_t)((uint8_t)1 << Channel); + } + } + else + { + if (NewState != DISABLE) + { + ADC1->AWCRH |= (uint8_t)((uint8_t)1 << (Channel - (uint8_t)8)); + } + else /* NewState == DISABLE */ + { + ADC1->AWCRH &= (uint8_t)~(uint8_t)((uint8_t)1 << (uint8_t)(Channel - (uint8_t)8)); + } + } +} + +/** + * @brief Sets the high threshold of the analog watchdog. + * @param Threshold specifies the high threshold value. + * this value depends on the reference voltage range. + * @retval None + */ +void ADC1_SetHighThreshold(uint16_t Threshold) +{ + ADC1->HTRH = (uint8_t)(Threshold >> (uint8_t)2); + ADC1->HTRL = (uint8_t)Threshold; +} + +/** + * @brief Sets the low threshold of the analog watchdog. + * @param Threshold specifies the low threshold value. + * this value depends on the reference voltage range. + * @retval None + */ +void ADC1_SetLowThreshold(uint16_t Threshold) +{ + ADC1->LTRL = (uint8_t)Threshold; + ADC1->LTRH = (uint8_t)(Threshold >> (uint8_t)2); +} + +/** + * @brief Get one sample of measured signal. + * @param Buffer specifies the buffer to read. + * @retval BufferValue: value read from the given buffer. + * @par Required preconditions: + * ADC1 conversion finished. + */ +uint16_t ADC1_GetBufferValue(uint8_t Buffer) +{ + uint16_t temph = 0; + uint8_t templ = 0; + + /* Check the parameters */ + assert_param(IS_ADC1_BUFFER_OK(Buffer)); + + if ((ADC1->CR2 & ADC1_CR2_ALIGN) != 0) /* Right alignment */ + { + /* Read LSB first */ + templ = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer << 1) + 1); + /* Then read MSB */ + temph = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer << 1)); + + temph = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8)); + } + else /* Left alignment */ + { + /* Read MSB first*/ + temph = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer << 1)); + /* Then read LSB */ + templ = *(uint8_t*)(uint16_t)((uint16_t)ADC1_BaseAddress + (uint8_t)(Buffer << 1) + 1); + + temph = (uint16_t)((uint16_t)((uint16_t)templ << 6) | (uint16_t)(temph << 8)); + } + + return ((uint16_t)temph); +} + +/** + * @brief Checks the specified analog watchdog channel status. + * @param Channel: specify the channel of which to check the analog watchdog + * can be one of the values of @ref ADC1_Channel_TypeDef. + * @retval FlagStatus Status of the analog watchdog. + */ +FlagStatus ADC1_GetAWDChannelStatus(ADC1_Channel_TypeDef Channel) +{ + uint8_t status = 0; + + /* Check the parameters */ + assert_param(IS_ADC1_CHANNEL_OK(Channel)); + + if (Channel < (uint8_t)8) + { + status = (uint8_t)(ADC1->AWSRL & (uint8_t)((uint8_t)1 << Channel)); + } + else /* Channel = 8 | 9 */ + { + status = (uint8_t)(ADC1->AWSRH & (uint8_t)((uint8_t)1 << (Channel - (uint8_t)8))); + } + + return ((FlagStatus)status); +} + +/** + * @brief Checks the specified ADC1 flag status. + * @param Flag: ADC1 flag. + * can be one of the values of @ref ADC1_Flag_TypeDef. + * @retval FlagStatus Status of the ADC1 flag. + */ +FlagStatus ADC1_GetFlagStatus(ADC1_Flag_TypeDef Flag) +{ + uint8_t flagstatus = 0; + uint8_t temp = 0; + + /* Check the parameters */ + assert_param(IS_ADC1_FLAG_OK(Flag)); + + if ((Flag & 0x0F) == 0x01) + { + /* Get OVR flag status */ + flagstatus = (uint8_t)(ADC1->CR3 & ADC1_CR3_OVR); + } + else if ((Flag & 0xF0) == 0x10) + { + /* Get analog watchdog channel status */ + temp = (uint8_t)(Flag & (uint8_t)0x0F); + if (temp < 8) + { + flagstatus = (uint8_t)(ADC1->AWSRL & (uint8_t)((uint8_t)1 << temp)); + } + else + { + flagstatus = (uint8_t)(ADC1->AWSRH & (uint8_t)((uint8_t)1 << (temp - 8))); + } + } + else /* Get EOC | AWD flag status */ + { + flagstatus = (uint8_t)(ADC1->CSR & Flag); + } + return ((FlagStatus)flagstatus); + +} + +/** + * @brief Clear the specified ADC1 Flag. + * @param Flag: ADC1 flag. + * can be one of the values of @ref ADC1_Flag_TypeDef. + * @retval None + */ +void ADC1_ClearFlag(ADC1_Flag_TypeDef Flag) +{ + uint8_t temp = 0; + + /* Check the parameters */ + assert_param(IS_ADC1_FLAG_OK(Flag)); + + if ((Flag & 0x0F) == 0x01) + { + /* Clear OVR flag status */ + ADC1->CR3 &= (uint8_t)(~ADC1_CR3_OVR); + } + else if ((Flag & 0xF0) == 0x10) + { + /* Clear analog watchdog channel status */ + temp = (uint8_t)(Flag & (uint8_t)0x0F); + if (temp < 8) + { + ADC1->AWSRL &= (uint8_t)~(uint8_t)((uint8_t)1 << temp); + } + else + { + ADC1->AWSRH &= (uint8_t)~(uint8_t)((uint8_t)1 << (temp - 8)); + } + } + else /* Clear EOC | AWD flag status */ + { + ADC1->CSR &= (uint8_t) (~Flag); + } +} + +/** + * @brief Returns the specified pending bit status + * @param ITPendingBit : the IT pending bit to check. + * This parameter can be one of the following values: + * - ADC1_IT_AWD : Analog WDG IT status + * - ADC1_IT_AWS0 : Analog channel 0 IT status + * - ADC1_IT_AWS1 : Analog channel 1 IT status + * - ADC1_IT_AWS2 : Analog channel 2 IT status + * - ADC1_IT_AWS3 : Analog channel 3 IT status + * - ADC1_IT_AWS4 : Analog channel 4 IT status + * - ADC1_IT_AWS5 : Analog channel 5 IT status + * - ADC1_IT_AWS6 : Analog channel 6 IT status + * - ADC1_IT_AWS7 : Analog channel 7 IT status + * - ADC1_IT_AWS8 : Analog channel 8 IT status + * - ADC1_IT_AWS9 : Analog channel 9 IT status + * - ADC1_IT_EOC : EOC pending bit + * @retval ITStatus: status of the specified pending bit. + */ +ITStatus ADC1_GetITStatus(ADC1_IT_TypeDef ITPendingBit) +{ + ITStatus itstatus = RESET; + uint8_t temp = 0; + + /* Check the parameters */ + assert_param(IS_ADC1_ITPENDINGBIT_OK(ITPendingBit)); + + if (((uint16_t)ITPendingBit & 0xF0) == 0x10) + { + /* Get analog watchdog channel status */ + temp = (uint8_t)((uint16_t)ITPendingBit & 0x0F); + if (temp < 8) + { + itstatus = (ITStatus)(ADC1->AWSRL & (uint8_t)((uint8_t)1 << temp)); + } + else + { + itstatus = (ITStatus)(ADC1->AWSRH & (uint8_t)((uint8_t)1 << (temp - 8))); + } + } + else /* Get EOC | AWD flag status */ + { + itstatus = (ITStatus)(ADC1->CSR & (uint8_t)ITPendingBit); + } + return ((ITStatus)itstatus); +} + +/** + * @brief Clear the ADC1 End of Conversion pending bit. + * @param ITPendingBit : the IT pending bit to clear. + * This parameter can be one of the following values: + * - ADC1_IT_AWD : Analog WDG IT status + * - ADC1_IT_AWS0 : Analog channel 0 IT status + * - ADC1_IT_AWS1 : Analog channel 1 IT status + * - ADC1_IT_AWS2 : Analog channel 2 IT status + * - ADC1_IT_AWS3 : Analog channel 3 IT status + * - ADC1_IT_AWS4 : Analog channel 4 IT status + * - ADC1_IT_AWS5 : Analog channel 5 IT status + * - ADC1_IT_AWS6 : Analog channel 6 IT status + * - ADC1_IT_AWS7 : Analog channel 7 IT status + * - ADC1_IT_AWS8 : Analog channel 8 IT status + * - ADC1_IT_AWS9 : Analog channel 9 IT status + * - ADC1_IT_EOC : EOC pending bit + * @retval None + */ +void ADC1_ClearITPendingBit(ADC1_IT_TypeDef ITPendingBit) +{ + uint8_t temp = 0; + + /* Check the parameters */ + assert_param(IS_ADC1_ITPENDINGBIT_OK(ITPendingBit)); + + if (((uint16_t)ITPendingBit & 0xF0) == 0x10) + { + /* Clear analog watchdog channel status */ + temp = (uint8_t)((uint16_t)ITPendingBit & 0x0F); + if (temp < 8) + { + ADC1->AWSRL &= (uint8_t)~(uint8_t)((uint8_t)1 << temp); + } + else + { + ADC1->AWSRH &= (uint8_t)~(uint8_t)((uint8_t)1 << (temp - 8)); + } + } + else /* Clear EOC | AWD flag status */ + { + ADC1->CSR &= (uint8_t)((uint16_t)~(uint16_t)ITPendingBit); + } +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_adc2.c b/4_EXT_INT_1PORT/lib/src/stm8s_adc2.c new file mode 100644 index 0000000..e65c9bd --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_adc2.c @@ -0,0 +1,398 @@ +/** + ****************************************************************************** + * @file stm8s_adc2.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions/macros for the ADC2 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_adc2.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/* Public functions ----------------------------------------------------------*/ + +/** + * @addtogroup ADC2_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the ADC2 peripheral registers to their default reset + * values. + * @param None + * @retval None + */ +void ADC2_DeInit(void) +{ + ADC2->CSR = ADC2_CSR_RESET_VALUE; + ADC2->CR1 = ADC2_CR1_RESET_VALUE; + ADC2->CR2 = ADC2_CR2_RESET_VALUE; + ADC2->TDRH = ADC2_TDRH_RESET_VALUE; + ADC2->TDRL = ADC2_TDRL_RESET_VALUE; +} + +/** + * @brief Initializes the ADC2 peripheral according to the specified parameters + * @param ADC2_ConversionMode: specifies the conversion mode + * can be one of the values of @ref ADC2_ConvMode_TypeDef. + * @param ADC2_Channel: specifies the channel to convert + * can be one of the values of @ref ADC2_Channel_TypeDef. + * @param ADC2_PrescalerSelection: specifies the ADC2 prescaler + * can be one of the values of @ref ADC2_PresSel_TypeDef. + * @param ADC2_ExtTrigger: specifies the external trigger + * can be one of the values of @ref ADC2_ExtTrig_TypeDef. + * @param ADC2_ExtTriggerState: specifies the external trigger new state + * can be one of the values of @ref FunctionalState. + * @param ADC2_Align: specifies the converted data alignment + * can be one of the values of @ref ADC2_Align_TypeDef. + * @param ADC2_SchmittTriggerChannel: specifies the schmitt trigger channel + * can be one of the values of @ref ADC2_SchmittTrigg_TypeDef. + * @param ADC2_SchmittTriggerState: specifies the schmitt trigger state + * can be one of the values of @ref FunctionalState. + * @retval None + */ +void ADC2_Init(ADC2_ConvMode_TypeDef ADC2_ConversionMode, ADC2_Channel_TypeDef ADC2_Channel, ADC2_PresSel_TypeDef ADC2_PrescalerSelection, ADC2_ExtTrig_TypeDef ADC2_ExtTrigger, FunctionalState ADC2_ExtTriggerState, ADC2_Align_TypeDef ADC2_Align, ADC2_SchmittTrigg_TypeDef ADC2_SchmittTriggerChannel, FunctionalState ADC2_SchmittTriggerState) +{ + /* Check the parameters */ + assert_param(IS_ADC2_CONVERSIONMODE_OK(ADC2_ConversionMode)); + assert_param(IS_ADC2_CHANNEL_OK(ADC2_Channel)); + assert_param(IS_ADC2_PRESSEL_OK(ADC2_PrescalerSelection)); + assert_param(IS_ADC2_EXTTRIG_OK(ADC2_ExtTrigger)); + assert_param(IS_FUNCTIONALSTATE_OK(((ADC2_ExtTriggerState)))); + assert_param(IS_ADC2_ALIGN_OK(ADC2_Align)); + assert_param(IS_ADC2_SCHMITTTRIG_OK(ADC2_SchmittTriggerChannel)); + assert_param(IS_FUNCTIONALSTATE_OK(ADC2_SchmittTriggerState)); + + /*-----------------CR1 & CSR configuration --------------------*/ + /* Configure the conversion mode and the channel to convert + respectively according to ADC2_ConversionMode & ADC2_Channel values & ADC2_Align values */ + ADC2_ConversionConfig(ADC2_ConversionMode, ADC2_Channel, ADC2_Align); + /* Select the prescaler division factor according to ADC2_PrescalerSelection values */ + ADC2_PrescalerConfig(ADC2_PrescalerSelection); + + /*-----------------CR2 configuration --------------------*/ + /* Configure the external trigger state and event respectively + according to ADC2_ExtTrigStatus, ADC2_ExtTrigger */ + ADC2_ExternalTriggerConfig(ADC2_ExtTrigger, ADC2_ExtTriggerState); + + /*------------------TDR configuration ---------------------------*/ + /* Configure the schmitt trigger channel and state respectively + according to ADC2_SchmittTriggerChannel & ADC2_SchmittTriggerNewState values */ + ADC2_SchmittTriggerConfig(ADC2_SchmittTriggerChannel, ADC2_SchmittTriggerState); + + /* Enable the ADC2 peripheral */ + ADC2->CR1 |= ADC2_CR1_ADON; +} + +/** + * @brief Enables or Disables the ADC2 peripheral. + * @param NewState: specifies the peripheral enabled or disabled state. + * @retval None + */ +void ADC2_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + ADC2->CR1 |= ADC2_CR1_ADON; + } + else /* NewState == DISABLE */ + { + ADC2->CR1 &= (uint8_t)(~ADC2_CR1_ADON); + } +} + +/** + * @brief Enables or disables the ADC2 interrupt. + * @param NewState specifies the state of ADC2 interrupt. + * @retval None + */ +void ADC2_ITConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the ADC2 interrupts */ + ADC2->CSR |= (uint8_t)ADC2_CSR_EOCIE; + } + else /*NewState == DISABLE */ + { + /* Disable the ADC2 interrupts */ + ADC2->CSR &= (uint8_t)(~ADC2_CSR_EOCIE); + } +} + +/** + * @brief Configure the ADC2 prescaler division factor. + * @param ADC2_Prescaler: the selected prescaler. + * It can be one of the values of @ref ADC2_PresSel_TypeDef. + * @retval None + */ +void ADC2_PrescalerConfig(ADC2_PresSel_TypeDef ADC2_Prescaler) +{ + /* Check the parameter */ + assert_param(IS_ADC2_PRESSEL_OK(ADC2_Prescaler)); + + /* Clear the SPSEL bits */ + ADC2->CR1 &= (uint8_t)(~ADC2_CR1_SPSEL); + /* Select the prescaler division factor according to ADC2_PrescalerSelection values */ + ADC2->CR1 |= (uint8_t)(ADC2_Prescaler); +} + +/** + * @brief Enables or disables the ADC2 Schmitt Trigger on a selected channel. + * @param ADC2_SchmittTriggerChannel specifies the desired Channel. + * It can be set of the values of @ref ADC2_SchmittTrigg_TypeDef. + * @param NewState specifies the Channel ADC2 Schmitt Trigger new status. + * can have one of the values of @ref FunctionalState. + * @retval None + */ +void ADC2_SchmittTriggerConfig(ADC2_SchmittTrigg_TypeDef ADC2_SchmittTriggerChannel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC2_SCHMITTTRIG_OK(ADC2_SchmittTriggerChannel)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (ADC2_SchmittTriggerChannel == ADC2_SCHMITTTRIG_ALL) + { + if (NewState != DISABLE) + { + ADC2->TDRL &= (uint8_t)0x0; + ADC2->TDRH &= (uint8_t)0x0; + } + else /* NewState == DISABLE */ + { + ADC2->TDRL |= (uint8_t)0xFF; + ADC2->TDRH |= (uint8_t)0xFF; + } + } + else if (ADC2_SchmittTriggerChannel < ADC2_SCHMITTTRIG_CHANNEL8) + { + if (NewState != DISABLE) + { + ADC2->TDRL &= (uint8_t)(~(uint8_t)((uint8_t)0x01 << (uint8_t)ADC2_SchmittTriggerChannel)); + } + else /* NewState == DISABLE */ + { + ADC2->TDRL |= (uint8_t)((uint8_t)0x01 << (uint8_t)ADC2_SchmittTriggerChannel); + } + } + else /* ADC2_SchmittTriggerChannel >= ADC2_SCHMITTTRIG_CHANNEL8 */ + { + if (NewState != DISABLE) + { + ADC2->TDRH &= (uint8_t)(~(uint8_t)((uint8_t)0x01 << ((uint8_t)ADC2_SchmittTriggerChannel - (uint8_t)8))); + } + else /* NewState == DISABLE */ + { + ADC2->TDRH |= (uint8_t)((uint8_t)0x01 << ((uint8_t)ADC2_SchmittTriggerChannel - (uint8_t)8)); + } + } +} + +/** + * @brief Configure the ADC2 conversion on selected channel. + * @param ADC2_ConversionMode Specifies the conversion type. + * It can be set of the values of @ref ADC2_ConvMode_TypeDef + * @param ADC2_Channel specifies the ADC2 Channel. + * It can be set of the values of @ref ADC2_Channel_TypeDef + * @param ADC2_Align specifies the converted data alignment. + * It can be set of the values of @ref ADC2_Align_TypeDef + * @retval None + */ +void ADC2_ConversionConfig(ADC2_ConvMode_TypeDef ADC2_ConversionMode, ADC2_Channel_TypeDef ADC2_Channel, ADC2_Align_TypeDef ADC2_Align) +{ + /* Check the parameters */ + assert_param(IS_ADC2_CONVERSIONMODE_OK(ADC2_ConversionMode)); + assert_param(IS_ADC2_CHANNEL_OK(ADC2_Channel)); + assert_param(IS_ADC2_ALIGN_OK(ADC2_Align)); + + /* Clear the align bit */ + ADC2->CR2 &= (uint8_t)(~ADC2_CR2_ALIGN); + /* Configure the data alignment */ + ADC2->CR2 |= (uint8_t)(ADC2_Align); + + if (ADC2_ConversionMode == ADC2_CONVERSIONMODE_CONTINUOUS) + { + /* Set the continuous conversion mode */ + ADC2->CR1 |= ADC2_CR1_CONT; + } + else /* ADC2_ConversionMode == ADC2_CONVERSIONMODE_SINGLE */ + { + /* Set the single conversion mode */ + ADC2->CR1 &= (uint8_t)(~ADC2_CR1_CONT); + } + + /* Clear the ADC2 channels */ + ADC2->CSR &= (uint8_t)(~ADC2_CSR_CH); + /* Select the ADC2 channel */ + ADC2->CSR |= (uint8_t)(ADC2_Channel); +} + +/** + * @brief Configure the ADC2 conversion on external trigger event. + * @par Full description: + * The selected external trigger event can be enabled or disabled. + * @param ADC2_ExtTrigger to select the External trigger event. + * can have one of the values of @ref ADC2_ExtTrig_TypeDef. + * @param NewState to enable/disable the selected external trigger + * can have one of the values of @ref FunctionalState. + * @retval None + */ +void ADC2_ExternalTriggerConfig(ADC2_ExtTrig_TypeDef ADC2_ExtTrigger, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ADC2_EXTTRIG_OK(ADC2_ExtTrigger)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Clear the external trigger selection bits */ + ADC2->CR2 &= (uint8_t)(~ADC2_CR2_EXTSEL); + + if (NewState != DISABLE) + { + /* Enable the selected external Trigger */ + ADC2->CR2 |= (uint8_t)(ADC2_CR2_EXTTRIG); + } + else /* NewState == DISABLE */ + { + /* Disable the selected external trigger */ + ADC2->CR2 &= (uint8_t)(~ADC2_CR2_EXTTRIG); + } + + /* Set the selected external trigger */ + ADC2->CR2 |= (uint8_t)(ADC2_ExtTrigger); +} + +/** + * @brief Start ADC2 conversion + * @par Full description: + * This function triggers the start of conversion, after ADC2 configuration. + * @param None + * @retval None + * @par Required preconditions: + * Enable the ADC2 peripheral before calling this function + */ +void ADC2_StartConversion(void) +{ + ADC2->CR1 |= ADC2_CR1_ADON; +} + +/** + * @brief Get one sample of measured signal. + * @param None + * @retval ConversionValue: value of the measured signal. + * @par Required preconditions: + * ADC2 conversion finished. + */ +uint16_t ADC2_GetConversionValue(void) +{ + uint16_t temph = 0; + uint8_t templ = 0; + + if ((ADC2->CR2 & ADC2_CR2_ALIGN) != 0) /* Right alignment */ + { + /* Read LSB first */ + templ = ADC2->DRL; + /* Then read MSB */ + temph = ADC2->DRH; + + temph = (uint16_t)(templ | (uint16_t)(temph << (uint8_t)8)); + } + else /* Left alignment */ + { + /* Read MSB first*/ + temph = ADC2->DRH; + /* Then read LSB */ + templ = ADC2->DRL; + + temph = (uint16_t)((uint16_t)((uint16_t)templ << 6) | (uint16_t)((uint16_t)temph << 8)); + } + + return ((uint16_t)temph); +} + +/** + * @brief Checks the ADC2 EOC flag status. + * @param None + * @retval FlagStatus Status of the ADC2 EOC flag. + */ +FlagStatus ADC2_GetFlagStatus(void) +{ + /* Get EOC flag status */ + return (FlagStatus)(ADC2->CSR & ADC2_CSR_EOC); +} + +/** + * @brief Clear the ADC2 EOC Flag. + * @param None + * @retval None + */ +void ADC2_ClearFlag(void) +{ + ADC2->CSR &= (uint8_t)(~ADC2_CSR_EOC); +} + +/** + * @brief Returns the EOC pending bit status + * @par Parameters: + * None + * @retval FlagStatus: status of the EOC pending bit. + */ +ITStatus ADC2_GetITStatus(void) +{ + return (ITStatus)(ADC2->CSR & ADC2_CSR_EOC); +} + +/** + * @brief Clear the ADC2 End of Conversion pending bit. + * @param None + * @retval None + */ +void ADC2_ClearITPendingBit(void) +{ + ADC2->CSR &= (uint8_t)(~ADC2_CSR_EOC); +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_awu.c b/4_EXT_INT_1PORT/lib/src/stm8s_awu.c new file mode 100644 index 0000000..9df7bf5 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_awu.c @@ -0,0 +1,198 @@ +/** + ****************************************************************************** + * @file stm8s_awu.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the AWU peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_awu.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/* See also AWU_Timebase_TypeDef structure in stm8s_awu.h file : + N 2 5 1 2 4 8 1 3 6 1 2 5 1 2 1 3 + O 5 0 m m m m 6 2 4 2 5 1 s s 2 0 + I 0 0 s s s s m m m 8 6 2 s s + T u u s s s m m m + s s s s s +*/ +/** Contains the different values to write in the APR register (used by AWU_Init function) */ +CONST uint8_t APR_Array[17] = + { + 0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 61, 23, 23, 62 + }; + +/** Contains the different values to write in the TBR register (used by AWU_Init function) */ +CONST uint8_t TBR_Array[17] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 14, 15, 15 + }; + +/* Public functions ----------------------------------------------------------*/ + +/** + * @addtogroup AWU_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the AWU peripheral registers to their default reset + * values. + * @param None + * @retval None + */ +void AWU_DeInit(void) +{ + AWU->CSR = AWU_CSR_RESET_VALUE; + AWU->APR = AWU_APR_RESET_VALUE; + AWU->TBR = AWU_TBR_RESET_VALUE; +} + +/** + * @brief Initializes the AWU peripheral according to the specified parameters. + * @param AWU_TimeBase : Time base selection (interval between AWU interrupts). + * can be one of the values of @ref AWU_Timebase_TypeDef. + * @retval None + * @par Required preconditions: + * The LS RC calibration must be performed before calling this function. + */ +void AWU_Init(AWU_Timebase_TypeDef AWU_TimeBase) +{ + /* Check parameter */ + assert_param(IS_AWU_TIMEBASE_OK(AWU_TimeBase)); + + /* Enable the AWU peripheral */ + AWU->CSR |= AWU_CSR_AWUEN; + + /* Set the TimeBase */ + AWU->TBR &= (uint8_t)(~AWU_TBR_AWUTB); + AWU->TBR |= TBR_Array[(uint8_t)AWU_TimeBase]; + + /* Set the APR divider */ + AWU->APR &= (uint8_t)(~AWU_APR_APR); + AWU->APR |= APR_Array[(uint8_t)AWU_TimeBase]; +} + +/** + * @brief Enable or disable the AWU peripheral. + * @param NewState Indicates the new state of the AWU peripheral. + * @retval None + * @par Required preconditions: + * Initialisation of AWU and LS RC calibration must be done before. + */ +void AWU_Cmd(FunctionalState NewState) +{ + if (NewState != DISABLE) + { + /* Enable the AWU peripheral */ + AWU->CSR |= AWU_CSR_AWUEN; + } + else + { + /* Disable the AWU peripheral */ + AWU->CSR &= (uint8_t)(~AWU_CSR_AWUEN); + } +} + +/** + * @brief Update APR register with the measured LSI frequency. + * @par Note on the APR calculation: + * A is the integer part of lsifreqkhz/4 and x the decimal part. + * x <= A/(1+2A) is equivalent to A >= x(1+2A) and also to 4A >= 4x(1+2A) [F1] + * but we know that A + x = lsifreqkhz/4 ==> 4x = lsifreqkhz-4A + * so [F1] can be written : + * 4A >= (lsifreqkhz-4A)(1+2A) + * @param LSIFreqHz Low Speed RC frequency measured by timer (in Hz). + * @retval None + * @par Required preconditions: + * - AWU must be disabled to avoid unwanted interrupts. + */ +void AWU_LSICalibrationConfig(uint32_t LSIFreqHz) +{ + uint16_t lsifreqkhz = 0x0; + uint16_t A = 0x0; + + /* Check parameter */ + assert_param(IS_LSI_FREQUENCY_OK(LSIFreqHz)); + + lsifreqkhz = (uint16_t)(LSIFreqHz / 1000); /* Converts value in kHz */ + + /* Calculation of AWU calibration value */ + + A = (uint16_t)(lsifreqkhz >> 2U); /* Division by 4, keep integer part only */ + + if ((4U * A) >= ((lsifreqkhz - (4U * A)) * (1U + (2U * A)))) + { + AWU->APR = (uint8_t)(A - 2U); + } + else + { + AWU->APR = (uint8_t)(A - 1U); + } +} + +/** + * @brief Configures AWU in Idle mode to reduce power consumption. + * @param None + * @retval None + */ +void AWU_IdleModeEnable(void) +{ + /* Disable AWU peripheral */ + AWU->CSR &= (uint8_t)(~AWU_CSR_AWUEN); + + /* No AWU timebase */ + AWU->TBR = (uint8_t)(~AWU_TBR_AWUTB); +} + +/** + * @brief Returns status of the AWU peripheral flag. + * @param None + * @retval FlagStatus : Status of the AWU flag. + * This parameter can be any of the @ref FlagStatus enumeration. + */ +FlagStatus AWU_GetFlagStatus(void) +{ + return((FlagStatus)(((uint8_t)(AWU->CSR & AWU_CSR_AWUF) == (uint8_t)0x00) ? RESET : SET)); +} + + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_beep.c b/4_EXT_INT_1PORT/lib/src/stm8s_beep.c new file mode 100644 index 0000000..4dacb8a --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_beep.c @@ -0,0 +1,153 @@ +/** + ****************************************************************************** + * @file stm8s_beep.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the BEEP peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_beep.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/* Public functions ----------------------------------------------------------*/ + +/** + * @addtogroup BEEP_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the BEEP peripheral registers to their default reset + * values. + * @param None + * @retval None + */ +void BEEP_DeInit(void) +{ + BEEP->CSR = BEEP_CSR_RESET_VALUE; +} + +/** + * @brief Initializes the BEEP function according to the specified parameters. + * @param BEEP_Frequency Frequency selection. + * can be one of the values of @ref BEEP_Frequency_TypeDef. + * @retval None + * @par Required preconditions: + * The LS RC calibration must be performed before calling this function. + */ +void BEEP_Init(BEEP_Frequency_TypeDef BEEP_Frequency) +{ + /* Check parameter */ + assert_param(IS_BEEP_FREQUENCY_OK(BEEP_Frequency)); + + /* Set a default calibration value if no calibration is done */ + if ((BEEP->CSR & BEEP_CSR_BEEPDIV) == BEEP_CSR_BEEPDIV) + { + BEEP->CSR &= (uint8_t)(~BEEP_CSR_BEEPDIV); /* Clear bits */ + BEEP->CSR |= BEEP_CALIBRATION_DEFAULT; + } + + /* Select the output frequency */ + BEEP->CSR &= (uint8_t)(~BEEP_CSR_BEEPSEL); + BEEP->CSR |= (uint8_t)(BEEP_Frequency); +} + +/** + * @brief Enable or disable the BEEP function. + * @param NewState Indicates the new state of the BEEP function. + * @retval None + * @par Required preconditions: + * Initialisation of BEEP and LS RC calibration must be done before. + */ +void BEEP_Cmd(FunctionalState NewState) +{ + if (NewState != DISABLE) + { + /* Enable the BEEP peripheral */ + BEEP->CSR |= BEEP_CSR_BEEPEN; + } + else + { + /* Disable the BEEP peripheral */ + BEEP->CSR &= (uint8_t)(~BEEP_CSR_BEEPEN); + } +} + +/** + * @brief Update CSR register with the measured LSI frequency. + * @par Note on the APR calculation: + * A is the integer part of LSIFreqkHz/4 and x the decimal part. + * x <= A/(1+2A) is equivalent to A >= x(1+2A) and also to 4A >= 4x(1+2A) [F1] + * but we know that A + x = LSIFreqkHz/4 ==> 4x = LSIFreqkHz-4A + * so [F1] can be written : + * 4A >= (LSIFreqkHz-4A)(1+2A) + * @param LSIFreqHz Low Speed RC frequency measured by timer (in Hz). + * @retval None + * @par Required preconditions: + * - BEEP must be disabled to avoid unwanted interrupts. + */ +void BEEP_LSICalibrationConfig(uint32_t LSIFreqHz) +{ + uint16_t lsifreqkhz; + uint16_t A; + + /* Check parameter */ + assert_param(IS_LSI_FREQUENCY_OK(LSIFreqHz)); + + lsifreqkhz = (uint16_t)(LSIFreqHz / 1000); /* Converts value in kHz */ + + /* Calculation of BEEPER calibration value */ + + BEEP->CSR &= (uint8_t)(~BEEP_CSR_BEEPDIV); /* Clear bits */ + + A = (uint16_t)(lsifreqkhz >> 3U); /* Division by 8, keep integer part only */ + + if ((8U * A) >= ((lsifreqkhz - (8U * A)) * (1U + (2U * A)))) + { + BEEP->CSR |= (uint8_t)(A - 2U); + } + else + { + BEEP->CSR |= (uint8_t)(A - 1U); + } +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_can.c b/4_EXT_INT_1PORT/lib/src/stm8s_can.c new file mode 100644 index 0000000..74d2aaf --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_can.c @@ -0,0 +1,1445 @@ +/** + ****************************************************************************** + * @file stm8s_can.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the CAN peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_can.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define CAN_IDLIST_IDMASK_MASK ((uint8_t) 0x55) +#define CAN_IDMASK_IDLIST_MASK ((uint8_t) 0xAA) +#define CAN_MODE_MASK ((uint8_t) 0x03) +#define CAN_ACKNOWLEDGE_TIMEOUT ((uint16_t)0xFFFF) +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +__IO uint32_t _Id = 0; +__IO uint8_t _IDE = 0; +__IO uint8_t _RTR = 0; +__IO uint8_t _DLC = 0; +__IO uint8_t _Data[8] = {0}; +__IO uint8_t _FMI = 0; +/* Private function prototypes -----------------------------------------------*/ +static ITStatus CheckITStatus(uint8_t CAN_Reg, uint8_t It_Bit); + +/* Private functions ---------------------------------------------------------*/ +/** + * @addtogroup CAN_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the CAN peripheral registers to their default reset values. + * @param None + * @retval None + */ +void CAN_DeInit(void) +{ + /* Request initialisation */ + CAN->MCR = CAN_MCR_INRQ; + CAN->PSR = CAN_Page_Config; + CAN_OperatingModeRequest(CAN_OperatingMode_Initialization); + CAN->Page.Config.ESR = CAN_ESR_RESET_VALUE; + CAN->Page.Config.EIER = CAN_EIER_RESET_VALUE; + CAN->Page.Config.BTR1 = CAN_BTR1_RESET_VALUE; + CAN->Page.Config.BTR2 = CAN_BTR2_RESET_VALUE; + CAN->Page.Config.FMR1 = CAN_FMR1_RESET_VALUE; + CAN->Page.Config.FMR2 = CAN_FMR2_RESET_VALUE; + CAN->Page.Config.FCR1 = CAN_FCR_RESET_VALUE; + CAN->Page.Config.FCR2 = CAN_FCR_RESET_VALUE; + CAN->Page.Config.FCR3 = CAN_FCR_RESET_VALUE; + CAN_OperatingModeRequest(CAN_OperatingMode_Normal); + CAN->PSR = CAN_Page_RxFifo; + CAN->Page.RxFIFO.MDLCR = CAN_MDLC_RESET_VALUE; + CAN->PSR = CAN_Page_TxMailBox0; + CAN->Page.TxMailbox.MDLCR = CAN_MDLC_RESET_VALUE; + CAN->PSR = CAN_Page_TxMailBox1; + CAN->Page.TxMailbox.MDLCR = CAN_MDLC_RESET_VALUE; + CAN->PSR = CAN_Page_TxMailBox2; + CAN->Page.TxMailbox.MDLCR = CAN_MDLC_RESET_VALUE; + + CAN->MCR = CAN_MCR_RESET_VALUE; + CAN->MSR = (uint8_t)(~CAN_MSR_RESET_VALUE);/* rc_w1 */ + CAN->TSR = (uint8_t)(~CAN_TSR_RESET_VALUE);/* rc_w1 */ + CAN->RFR = (uint8_t)(~CAN_RFR_RESET_VALUE);/* rc_w1 */ + CAN->IER = CAN_IER_RESET_VALUE; + CAN->DGR = CAN_DGR_RESET_VALUE; + CAN->PSR = CAN_PSR_RESET_VALUE; +} + +/** + * @brief Initializes the CAN peripheral according to the specified parameters. + * @param CAN_MasterCtrl : Master control option, can be one or a combination of @ref CAN_MasterCtrl_TypeDef. + * @param CAN_Mode : CAN mode , can be one of @ref CAN_Mode_TypeDef. + * @param CAN_SynJumpWidth : CAN Synchronisation Jump Width , can be one of @ref CAN_SynJumpWidth_TypeDef. + * @param CAN_BitSeg1 : CAN bit segment 1 , can be one of @ref CAN_BitSeg1_TypeDef. + * @param CAN_BitSeg2 : CAN bit segment 2 , can be one of @ref CAN_BitSeg2_TypeDef. + * @param CAN_Prescaler : CAN Baud Rate Prescaler , can be a value from 0x01 to 0xFF. + * @retval Indicates if initialization is succeed. it can be one of @ref CAN_InitStatus_TypeDef enumeration. + */ +CAN_InitStatus_TypeDef CAN_Init(CAN_MasterCtrl_TypeDef CAN_MasterCtrl, + CAN_Mode_TypeDef CAN_Mode, + CAN_SynJumpWidth_TypeDef CAN_SynJumpWidth, + CAN_BitSeg1_TypeDef CAN_BitSeg1, + CAN_BitSeg2_TypeDef CAN_BitSeg2, + uint8_t CAN_Prescaler) +{ + CAN_InitStatus_TypeDef InitStatus = CAN_InitStatus_Failed; + uint16_t timeout = CAN_ACKNOWLEDGE_TIMEOUT; + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + + + /* Check the parameters */ + assert_param(IS_CAN_MASTERCTRL_OK(CAN_MasterCtrl)); + assert_param(IS_CAN_MODE_OK(CAN_Mode)); + assert_param(IS_CAN_SYNJUMPWIDTH_OK(CAN_SynJumpWidth)); + assert_param(IS_CAN_BITSEG1_OK(CAN_BitSeg1)); + assert_param(IS_CAN_BITSEG2_OK(CAN_BitSeg2)); + assert_param(IS_CAN_PRESCALER_OK(CAN_Prescaler)); + + /* Request initialisation */ + CAN->MCR = CAN_MCR_INRQ; + /* Wait the acknowledge */ + while (((uint8_t)(CAN->MSR & CAN_MSR_INAK) != 0x01) && ((uint16_t)timeout != 0)) + { + timeout--; + } + + /* Check acknowledged */ + if ((CAN->MSR & CAN_MSR_INAK) != CAN_MSR_INAK) + { + + InitStatus = CAN_InitStatus_Failed; + + } + else + { + /* Set the time triggered communication mode & Set the automatic bus-off management & Set the automatic wake-up mode + & Set the no automatic retransmission & Set the receive FIFO locked mode & Set the transmit FIFO priority */ + CAN->MCR |= (uint8_t)CAN_MasterCtrl; + + /* Set the bit timing register */ + CAN->DGR |= (uint8_t)CAN_Mode ; + CAN->PSR = CAN_Page_Config; + CAN->Page.Config.BTR1 = (uint8_t)((uint8_t)(CAN_Prescaler - (uint8_t)1) | CAN_SynJumpWidth); + CAN->Page.Config.BTR2 = (uint8_t)(CAN_BitSeg1 | (uint8_t)CAN_BitSeg2); + + /* Request leave initialisation */ + CAN->MCR &= (uint8_t)(~CAN_MCR_INRQ); + /* Wait the acknowledge */ + timeout = 0xFFFF; + while ((((uint8_t)(CAN->MSR & CAN_MSR_INAK) == 0x01))&&(timeout != 0)) + { + timeout--; + } + /* Check acknowledged */ + if ((CAN->MSR & CAN_MSR_INAK) == CAN_MSR_INAK) + { + InitStatus = CAN_InitStatus_Failed; + } + else + { + InitStatus = CAN_InitStatus_Success; + } + } + /*Restore Last Page*/ + CAN_SelectPage(can_page); + + /* Return the status of initialization */ + return (CAN_InitStatus_TypeDef)InitStatus; +} + +/** + * @brief Initializes the CAN peripheral Filter according to the specified parameters. + * @param CAN_FilterNumber : CAN Filter number , can be one of @ref CAN_FilterNumber_TypeDef + * @param CAN_FilterActivation : CAN Filter Activation state , can be one of @ref FunctionalState + * @param CAN_FilterMode : CAN Filter Mode , can be one of @ref CAN_FilterMode_TypeDef + * @param CAN_FilterScale : CAN Filter Scale , can be one of @ref CAN_FilterScale_TypeDef + * @param CAN_FilterID1 : CAN Filter ID 1 , can be a value from 0x00 to 0xFF + * @param CAN_FilterID2 : CAN Filter ID 2 , can be a value from 0x00 to 0xFF + * @param CAN_FilterID3 : CAN Filter ID 3 , can be a value from 0x00 to 0xFF + * @param CAN_FilterID4 : CAN Filter ID 4 , can be a value from 0x00 to 0xFF + * @param CAN_FilterIDMask1 : CAN Filter ID 1/ Mask 1 , can be a value from 0x00 to 0xFF depending of CAN_FilterMode parameter + * @param CAN_FilterIDMask2 : CAN Filter ID 2/ Mask 2 , can be a value from 0x00 to 0xFF depending of CAN_FilterMode parameter + * @param CAN_FilterIDMask3 : CAN Filter ID 3/ Mask 3 , can be a value from 0x00 to 0xFF depending of CAN_FilterMode parameter + * @param CAN_FilterIDMask4 : CAN Filter ID 4/ Mask 4 , can be a value from 0x00 to 0xFF depending of CAN_FilterMode parameter + * @retval None + */ +void CAN_FilterInit(CAN_FilterNumber_TypeDef CAN_FilterNumber, + FunctionalState CAN_FilterActivation, + CAN_FilterMode_TypeDef CAN_FilterMode, + CAN_FilterScale_TypeDef CAN_FilterScale, + uint8_t CAN_FilterID1, + uint8_t CAN_FilterID2, + uint8_t CAN_FilterID3, + uint8_t CAN_FilterID4, + uint8_t CAN_FilterIDMask1, + uint8_t CAN_FilterIDMask2, + uint8_t CAN_FilterIDMask3, + uint8_t CAN_FilterIDMask4) +{ + uint8_t fact = 0; + uint8_t fsc = 0; + uint8_t fmhl = 0; + + CAN_Page_TypeDef can_page_filter = CAN_Page_Filter01; + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + + /* Check the parameters */ + assert_param(IS_CAN_FILTER_NUMBER_OK(CAN_FilterNumber)); + assert_param(IS_FUNCTIONALSTATE_OK(CAN_FilterActivation)); + assert_param(IS_CAN_FILTER_MODE_OK(CAN_FilterMode)); + assert_param(IS_CAN_FILTER_SCALE_OK(CAN_FilterScale)); + + + if (CAN_FilterNumber == CAN_FilterNumber_0) + { + fact = 0x01; + fsc = 0x00; + fmhl = 0x03; + + can_page_filter = CAN_Page_Filter01; + } + else if (CAN_FilterNumber == CAN_FilterNumber_1) + { + fact = 0x10; + fsc = 0x04; + fmhl = 0x0C; + + can_page_filter = CAN_Page_Filter01; + } + else if (CAN_FilterNumber == CAN_FilterNumber_2) + { + fact = 0x01; + fsc = 0x00; + fmhl = 0x30; + + can_page_filter = CAN_Page_Filter23; + } + else if (CAN_FilterNumber == CAN_FilterNumber_3) + { + fact = 0x10; + fsc = 0x04; + fmhl = 0xC0; + + can_page_filter = CAN_Page_Filter23; + } + else if (CAN_FilterNumber == CAN_FilterNumber_4) + { + fact = 0x01; + fsc = 0x00; + fmhl = 0x03; + + can_page_filter = CAN_Page_Filter45; + } + else /*if (CAN_FilterNumber == CAN_FilterNumber_5)*/ + { + fact = 0x10; + fsc = 0x04; + fmhl = 0x0C; + + can_page_filter = CAN_Page_Filter45; + } + + + CAN_OperatingModeRequest(CAN_OperatingMode_Initialization); + + CAN->PSR = CAN_Page_Config; + /*---------------------------------------------------------*/ + /*Configuration of Filter Scale */ + /*---------------------------------------------------------*/ + + if (can_page_filter == CAN_Page_Filter01) /* FCR1 */ + { + /* Filter Deactivation & Reset the Filter Scale */ + CAN->Page.Config.FCR1 &= (uint8_t)(~(uint8_t)(fact | (uint8_t)((uint8_t)(CAN_FCR1_FSC00|CAN_FCR1_FSC01) << fsc ))); + /* Set the new Filter Scale */ + CAN->Page.Config.FCR1 |= (uint8_t)(CAN_FilterScale << fsc); + } + else if (can_page_filter == CAN_Page_Filter23) /* FCR2*/ + { + /* Filter Deactivation & Reset the Filter Scale */ + CAN->Page.Config.FCR2 &= (uint8_t)~(uint8_t)( fact | (uint8_t)((uint8_t)(CAN_FCR1_FSC00|CAN_FCR1_FSC01) << fsc )); + + /* Set the new Filter Scale */ + CAN->Page.Config.FCR2 |= (uint8_t)(CAN_FilterScale << fsc); + + } + else /*if(can_page_filter == CAN_Page_Filter45)*/ /* FCR3*/ + { + /* Filter Deactivation & Reset the Filter Scale */ + CAN->Page.Config.FCR3 &= (uint8_t)~(uint8_t)( fact | (uint8_t)((uint8_t)(CAN_FCR1_FSC00|CAN_FCR1_FSC01) << fsc )); + + /* Set the new Filter Scale */ + CAN->Page.Config.FCR3 |= (uint8_t)(CAN_FilterScale << fsc); + } + + /*---------------------------------------------------------*/ + /*Configuration of Filter Mode */ + /*---------------------------------------------------------*/ + if (can_page_filter != CAN_Page_Filter45) /* FMR1*/ + { + /* Filter Mode */ + if (CAN_FilterMode == CAN_FilterMode_IdMask) + { + /*Id/Mask mode for the filter*/ + CAN->Page.Config.FMR1 &= (uint8_t)~(fmhl); + } + else if ( CAN_FilterMode == CAN_FilterMode_IdList) + { + /*Identifier list mode for the filter*/ + CAN->Page.Config.FMR1 |= (uint8_t)(fmhl); + } + else if ( CAN_FilterMode == CAN_FilterMode_IdList_IdMask) + { + /*Identifier list mode is first for the filter*/ + CAN->Page.Config.FMR1 |= (uint8_t)(fmhl & CAN_IDLIST_IDMASK_MASK); + } + else /* ( CAN_FilterMode == CAN_FilterMode_IdMask_IdList)*/ + { + /*Id Mask mode is first for the filter*/ + CAN->Page.Config.FMR1 |= (uint8_t)(fmhl & CAN_IDMASK_IDLIST_MASK); + } + + + } + else /* FMR2 */ + { + + /* Filter Mode */ + if (CAN_FilterMode == CAN_FilterMode_IdMask) + { + /*Id/Mask mode for the filter*/ + CAN->Page.Config.FMR2 &= (uint8_t)~(fmhl); + } + else if ( CAN_FilterMode == CAN_FilterMode_IdList) + { + /*Identifier list mode for the filter*/ + CAN->Page.Config.FMR2 |= (uint8_t)(fmhl); + } + else if ( CAN_FilterMode == CAN_FilterMode_IdList_IdMask) + { + /*Identifier list mode is first for the filter*/ + CAN->Page.Config.FMR2 |= (uint8_t)(fmhl & CAN_IDLIST_IDMASK_MASK); + } + else /* ( CAN_FilterMode == CAN_FilterMode_IdMask_IdList)*/ + { + /*Id Mask mode is first for the filter*/ + CAN->Page.Config.FMR2 |= (uint8_t)(fmhl & CAN_IDMASK_IDLIST_MASK); + } + } + /*---------------------------------------------------------*/ + /*Configuration of Filter IDs */ + /*---------------------------------------------------------*/ + CAN->PSR = (uint8_t)can_page_filter; + if (fsc != 0) + { + /* Filter Scale */ + if (CAN_FilterScale == CAN_FilterScale_8Bit) + { + CAN->Page.Filter.FR09 = CAN_FilterID1; + CAN->Page.Filter.FR10 = CAN_FilterIDMask1; + CAN->Page.Filter.FR11 = CAN_FilterID2; + CAN->Page.Filter.FR12 = CAN_FilterIDMask2; + CAN->Page.Filter.FR13 = CAN_FilterID3; + CAN->Page.Filter.FR14 = CAN_FilterIDMask3; + CAN->Page.Filter.FR15 = CAN_FilterID4; + CAN->Page.Filter.FR16 = CAN_FilterIDMask4; + } + else if (CAN_FilterScale == CAN_FilterScale_16_8Bit) + { + CAN->Page.Filter.FR09 = CAN_FilterID1; + CAN->Page.Filter.FR10 = CAN_FilterID2; + CAN->Page.Filter.FR11 = CAN_FilterIDMask1; + CAN->Page.Filter.FR12 = CAN_FilterIDMask2; + CAN->Page.Filter.FR13 = CAN_FilterID3; + CAN->Page.Filter.FR14 = CAN_FilterIDMask3; + CAN->Page.Filter.FR15 = CAN_FilterID4; + CAN->Page.Filter.FR16 = CAN_FilterIDMask4; + } + else if (CAN_FilterScale == CAN_FilterScale_16Bit) + { + CAN->Page.Filter.FR09 = CAN_FilterID1; + CAN->Page.Filter.FR10 = CAN_FilterID2; + CAN->Page.Filter.FR11 = CAN_FilterIDMask1; + CAN->Page.Filter.FR12 = CAN_FilterIDMask2; + CAN->Page.Filter.FR13 = CAN_FilterID3; + CAN->Page.Filter.FR14 = CAN_FilterID4; + CAN->Page.Filter.FR15 = CAN_FilterIDMask3; + CAN->Page.Filter.FR16 = CAN_FilterIDMask4; + } + else if (CAN_FilterScale == CAN_FilterScale_32Bit) + { + CAN->Page.Filter.FR09 = CAN_FilterID1; + CAN->Page.Filter.FR10 = CAN_FilterID2; + CAN->Page.Filter.FR11 = CAN_FilterID3; + CAN->Page.Filter.FR12 = CAN_FilterID4; + CAN->Page.Filter.FR13 = CAN_FilterIDMask1; + CAN->Page.Filter.FR14 = CAN_FilterIDMask2; + CAN->Page.Filter.FR15 = CAN_FilterIDMask3; + CAN->Page.Filter.FR16 = CAN_FilterIDMask4; + } + } + else + { + /* Filter Scale */ + if (CAN_FilterScale == CAN_FilterScale_8Bit) + { + CAN->Page.Filter.FR01 = CAN_FilterID1; + CAN->Page.Filter.FR02 = CAN_FilterIDMask1; + CAN->Page.Filter.FR03 = CAN_FilterID2; + CAN->Page.Filter.FR04 = CAN_FilterIDMask2; + CAN->Page.Filter.FR05 = CAN_FilterID3; + CAN->Page.Filter.FR06 = CAN_FilterIDMask3; + CAN->Page.Filter.FR07 = CAN_FilterID4; + CAN->Page.Filter.FR08 = CAN_FilterIDMask4; + } + else if (CAN_FilterScale == CAN_FilterScale_16_8Bit) + { + CAN->Page.Filter.FR01 = CAN_FilterID1; + CAN->Page.Filter.FR02 = CAN_FilterID2; + CAN->Page.Filter.FR03 = CAN_FilterIDMask1; + CAN->Page.Filter.FR04 = CAN_FilterIDMask2; + CAN->Page.Filter.FR05 = CAN_FilterID3; + CAN->Page.Filter.FR06 = CAN_FilterIDMask3; + CAN->Page.Filter.FR07 = CAN_FilterID4; + CAN->Page.Filter.FR08 = CAN_FilterIDMask4; + } + else if (CAN_FilterScale == CAN_FilterScale_16Bit) + { + CAN->Page.Filter.FR01 = CAN_FilterID1; + CAN->Page.Filter.FR02 = CAN_FilterID2; + CAN->Page.Filter.FR03 = CAN_FilterIDMask1; + CAN->Page.Filter.FR04 = CAN_FilterIDMask2; + CAN->Page.Filter.FR05 = CAN_FilterID3; + CAN->Page.Filter.FR06 = CAN_FilterID4; + CAN->Page.Filter.FR07 = CAN_FilterIDMask3; + CAN->Page.Filter.FR08 = CAN_FilterIDMask4; + } + else if (CAN_FilterScale == CAN_FilterScale_32Bit) + { + CAN->Page.Filter.FR01 = CAN_FilterID1; + CAN->Page.Filter.FR02 = CAN_FilterID2; + CAN->Page.Filter.FR03 = CAN_FilterID3; + CAN->Page.Filter.FR04 = CAN_FilterID4; + CAN->Page.Filter.FR05 = CAN_FilterIDMask1; + CAN->Page.Filter.FR06 = CAN_FilterIDMask2; + CAN->Page.Filter.FR07 = CAN_FilterIDMask3; + CAN->Page.Filter.FR08 = CAN_FilterIDMask4; + } + } + + + /*---------------------------------------------------------*/ + /*Configuration of Filter Activation */ + /*---------------------------------------------------------*/ + /* Filter activation */ + CAN->PSR = CAN_Page_Config; + if (CAN_FilterActivation != DISABLE) + { + if ((CAN_FilterNumber & 0x06) == 0x00) /* FCR1*/ + { CAN->Page.Config.FCR1 |= (uint8_t)fact; + } + else if ((CAN_FilterNumber & 0x06) == 0x02) /*FCR2*/ + { CAN->Page.Config.FCR2 |= (uint8_t)fact; + } + else /*if((CAN_FilterNumber & 0x06) == 0x04)*/ /*FCR3*/ + { CAN->Page.Config.FCR3 |= (uint8_t)fact; + } + } + CAN_OperatingModeRequest(CAN_OperatingMode_Normal); + /*Restore Last Page*/ + CAN_SelectPage(can_page); +} + +/** + * @brief Enables or disables the specified CAN interrupts. + * @param CAN_IT: specifies the CAN interrupt sources to be enabled or disabled. + * @param NewState : CAN_IT new state , can be one of @ref FunctionalState + * @retval None + */ +void CAN_ITConfig(CAN_IT_TypeDef CAN_IT, FunctionalState NewState) +{ + uint8_t tmperrorinterrupt = 0; + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + + + /* Check the parameters */ + assert_param(IS_CAN_IT_CONFIG_OK(CAN_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + tmperrorinterrupt = (uint8_t)(((uint16_t)CAN_IT) >>7); + tmperrorinterrupt = (uint8_t)((uint8_t)((uint16_t)tmperrorinterrupt & 0xF0) | + (uint8_t)((uint8_t)((uint16_t)tmperrorinterrupt & 0x0F) >>1)); + + CAN->PSR = CAN_Page_Config; + if (NewState != DISABLE) + { + /* Enable the selected CAN interrupt */ + CAN->IER |= (uint8_t)(CAN_IT); + CAN->Page.Config.EIER |= (uint8_t)(tmperrorinterrupt); + } + else + { + /* Disable the selected CAN interrupt */ + CAN->IER &= (uint8_t)~(uint8_t)((uint16_t)CAN_IT); + CAN->Page.Config.EIER &= (uint8_t)~(tmperrorinterrupt); + } + /*Restore Last Page*/ + CAN_SelectPage(can_page); +} + +/** + * @brief Enables or Disables the ST7 CAN Compatibility. + * if the ST7 compatibility is Enabled, CAN provides only 2 mailboxes. + * if the ST7 compatibility is Disabled, CAN provides 3 mailboxes. + * @param CAN_ST7Compatibility : CAN ST7 Compatibility , this parameter can be one of @ref CAN_ST7Compatibility_TypeDef enumeration. + * @retval None + */ +void CAN_ST7CompatibilityCmd(CAN_ST7Compatibility_TypeDef CAN_ST7Compatibility) +{ + /* Check the parameters */ + assert_param(IS_CAN_ST7_COMPATIBILITY_OK(CAN_ST7Compatibility)); + /*Reset the old configuration of TXM2E */ + CAN->DGR &= (uint8_t)(~CAN_DGR_TXM2E); + + /*Set the old configuration of TXM2E */ + CAN->DGR |= (uint8_t)CAN_ST7Compatibility; +} + +/** + * @brief Enables or disables the CAN Time TriggerOperation communication mode. + * @param NewState : Mode new state , can be one of @ref FunctionalState + * @retval None + */ +void CAN_TTComModeCmd(FunctionalState NewState) +{ + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + if (NewState != DISABLE) + { + /*Enable the TTCM mode */ + CAN->MCR |= CAN_MCR_TTCM; + /*Set TGT bits setting in Tx and FIFO pages*/ + CAN->PSR = CAN_Page_TxMailBox0; + CAN->Page.TxMailbox.MDLCR |= CAN_MDLCR_TGT; + CAN->PSR = CAN_Page_TxMailBox1; + CAN->Page.TxMailbox.MDLCR |= CAN_MDLCR_TGT; + CAN->PSR = CAN_Page_TxMailBox2; + CAN->Page.TxMailbox.MDLCR |= CAN_MDLCR_TGT; + CAN->PSR = CAN_Page_RxFifo; + CAN->Page.RxFIFO.MDLCR |= CAN_MDLCR_TGT; + } + else + { + /*Disable the TTCM mode */ + CAN->MCR &= ((uint8_t)~CAN_MCR_TTCM); + /*Reset TGT bits setting in Tx and FIFO pages*/ + CAN->PSR = CAN_Page_TxMailBox0; + CAN->Page.TxMailbox.MDLCR &= ((uint8_t)~CAN_MDLCR_TGT); + CAN->PSR = CAN_Page_TxMailBox1; + CAN->Page.TxMailbox.MDLCR &= ((uint8_t)~CAN_MDLCR_TGT); + CAN->PSR = CAN_Page_TxMailBox2; + CAN->Page.TxMailbox.MDLCR &= ((uint8_t)~CAN_MDLCR_TGT); + CAN->PSR = CAN_Page_RxFifo; + CAN->Page.RxFIFO.MDLCR &= ((uint8_t)~CAN_MDLCR_TGT); + } + /*Restore Last Page*/ + CAN_SelectPage(can_page); +} + +/** + * @brief Initiates the transmission of a message. + * @param CAN_Id the ID number of the message, its size depends on @ref CAN_IDE value. + * @param[in] CAN_IDE the ID type of the message, this parameter can be one of the @ref CAN_Id_TypeDef enumeration. + * @param[in] CAN_RTR the message type, this parameter can be one of the @ref CAN_RTR_TypeDef enumeration. + * @param[in] CAN_DLC the number of data in the message type, this parameter can be a value between 0 to 7. + * @param[in] CAN_Data pointer to a the @ref uint8_t table which contains data to sent. + * @retval Transmit Status, this returned value can be one of the @ref CAN_TxStatus_TypeDef enumeration. + */ +CAN_TxStatus_TypeDef CAN_Transmit(uint32_t CAN_Id, + CAN_Id_TypeDef CAN_IDE, + CAN_RTR_TypeDef CAN_RTR, + uint8_t CAN_DLC, + uint8_t *CAN_Data) +{ + CAN_TxStatus_TypeDef CAN_TxStatus = CAN_TxStatus_NoMailBox; + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + /* Check the parameters */ + assert_param(IS_CAN_IDTYPE_OK(CAN_IDE)); + if (CAN_IDE != CAN_Id_Standard) + { + assert_param(IS_CAN_EXTID_OK(CAN_Id)); + } + else + { + assert_param(IS_CAN_STDID_OK(CAN_Id)); + } + assert_param(IS_CAN_RTR_OK(CAN_RTR)); + assert_param(IS_CAN_DLC_OK(CAN_DLC)); + /* Select one empty transmit mailbox */ + if ((CAN->TPR & CAN_TPR_TME0) == CAN_TPR_TME0) + { + CAN_TxStatus = CAN_TxStatus_MailBox0Ok; + } + else if ((CAN->TPR & CAN_TPR_TME1) == CAN_TPR_TME1) + { + CAN_TxStatus = CAN_TxStatus_MailBox1Ok; + } + else if ((CAN->TPR & CAN_TPR_TME2) == CAN_TPR_TME2) + { + CAN_TxStatus = CAN_TxStatus_MailBox2Ok; + } + else + { + CAN_TxStatus = CAN_TxStatus_NoMailBox; + } + if (CAN_TxStatus != CAN_TxStatus_NoMailBox) + { + CAN->PSR = (uint8_t)CAN_TxStatus; + /* Set up the Id */ + if (CAN_IDE != CAN_Id_Standard) + { + CAN_Id &= (uint32_t)CAN_EXTID_SIZE; + CAN->Page.TxMailbox.MIDR4 = (uint8_t)(CAN_Id); + CAN_Id = CAN_Id>>8; + CAN->Page.TxMailbox.MIDR3 = (uint8_t)(CAN_Id); + CAN_Id = CAN_Id>>8; + CAN->Page.TxMailbox.MIDR2 = (uint8_t)(CAN_Id); + CAN_Id = CAN_Id>>8; + CAN->Page.TxMailbox.MIDR1 = (uint8_t)(CAN_Id |CAN_IDE | CAN_RTR); + } + else + { + CAN_Id &= (uint16_t)CAN_STDID_SIZE; + CAN->Page.TxMailbox.MIDR1 = (uint8_t)((CAN_Id>>6) | (CAN_RTR)) ; + CAN->Page.TxMailbox.MIDR2 = (uint8_t)(CAN_Id<<2); + } + /* Set up the DLC */ + /*clear old DLC value*/ + CAN->Page.TxMailbox.MDLCR &= (uint8_t)0xF0; + /*set the new value of DLC*/ + CAN->Page.TxMailbox.MDLCR |= CAN_DLC; + /* Set up the data field */ + CAN->Page.TxMailbox.MDAR1 = CAN_Data[0]; + CAN->Page.TxMailbox.MDAR2 = CAN_Data[1]; + CAN->Page.TxMailbox.MDAR3 = CAN_Data[2]; + CAN->Page.TxMailbox.MDAR4 = CAN_Data[3]; + CAN->Page.TxMailbox.MDAR5 = CAN_Data[4]; + CAN->Page.TxMailbox.MDAR6 = CAN_Data[5]; + CAN->Page.TxMailbox.MDAR7 = CAN_Data[6]; + CAN->Page.TxMailbox.MDAR8 = CAN_Data[7]; + /* Request transmission */ + CAN->Page.TxMailbox.MCSR |= CAN_MCSR_TXRQ; + } + /*Restore Last Page*/ + CAN_SelectPage(can_page); + return (CAN_TxStatus_TypeDef)CAN_TxStatus; +} + +/** + * @brief Checks the transmission of a message. + * @param TransmitMailbox: the number of the mailbox that is used for transmission, can be on of @ref CAN_TransmitMailBox_TypeDef. + * @retval CAN_TxStatus_Ok if the CAN driver transmits the message, CAN_TxStatus_Failed in an other case. + */ +CAN_TxStatus_TypeDef CAN_TransmitStatus(CAN_TransmitMailBox_TypeDef CAN_TransmitMailbox) +{ + /* RQCP, TXOK and TME bits */ + CAN_TxStatus_TypeDef tstate = CAN_TxStatus_Failed; + uint8_t tmpstate=0; + + /* Check the parameters */ + assert_param(IS_CAN_TRANSMITMAILBOX_OK(CAN_TransmitMailbox)); + + switch (CAN_TransmitMailbox) + { + case (CAN_TransmitMailBox_0): tmpstate = (uint8_t)((CAN->TSR & (uint8_t)(CAN_TSR_RQCP0|CAN_TSR_TXOK0))); + tmpstate |= (uint8_t)((CAN->TPR & CAN_TPR_TME0)); + break; + case (CAN_TransmitMailBox_1): tmpstate = (uint8_t)((uint8_t)(CAN->TSR & (uint8_t)(CAN_TSR_RQCP1|CAN_TSR_TXOK1))>>1); + tmpstate |= (uint8_t)((uint8_t)(CAN->TPR & CAN_TPR_TME1) >> 1); + break; + case (CAN_TransmitMailBox_2): tmpstate = (uint8_t)((uint8_t)(CAN->TSR & (uint8_t)(CAN_TSR_RQCP2|CAN_TSR_TXOK2))>>2); + tmpstate |= (uint8_t)((uint8_t)(CAN->TPR & CAN_TPR_TME2) >> 2); + break; + default: + tstate = CAN_TxStatus_Failed; + break; + } + + switch (tmpstate) + { + /*transmit pending */ + case (0x00): tstate = CAN_TxStatus_Pending; + break; + /* transmit failed */ + case (0x05): tstate = CAN_TxStatus_Failed; + break; + /* transmit succeeded */ + case (0x15): tstate = CAN_TxStatus_Ok; + break; + /* transmit mailbox is empty : no activity on this TX mail box */ + case (0x04): tstate = CAN_TxStatus_MailBoxEmpty; + break; + default: + tstate = CAN_TxStatus_Failed; + break; + } + + return (CAN_TxStatus_TypeDef)tstate; +} + +/** + * @brief Cancels a transmit request. + * @param TransmitMailbox : the Transmission mailbox, can be one of CAN_TransmitMailBox_TypeDef + * @retval None + */ +void CAN_CancelTransmit(CAN_TransmitMailBox_TypeDef CAN_TransmitMailbox) +{ + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + /* Check the parameters */ + assert_param(IS_CAN_TRANSMITMAILBOX_OK(CAN_TransmitMailbox)); + /*switch to the specific page */ + CAN->PSR = (uint8_t)CAN_TransmitMailbox; + /* abort transmission */ + CAN->Page.TxMailbox.MCSR |= CAN_MCSR_ABRQ; + /*Restore Last Page*/ + CAN_SelectPage(can_page); +} + +/** + * @brief Releases the CAN FIFO. + * @param None + * @retval None + */ +void CAN_FIFORelease(void) +{ + /* Release FIFO*/ + CAN->RFR = CAN_RFR_RFOM; /*rc-w1*/ +} + +/** + * @brief Returns the number of pending messages. + * @retval Number of pending messages. + */ +CAN_NbrPendingMessage_TypeDef CAN_MessagePending(void) +{ + CAN_NbrPendingMessage_TypeDef msgpending = CAN_NbrPendingMessage_0; + msgpending = (CAN_NbrPendingMessage_TypeDef)(CAN->RFR & CAN_RFR_FMP01); + return (CAN_NbrPendingMessage_TypeDef)msgpending; +} + +/** + * @brief Receives a message which contains CAN Id, IDE, RTR + * DLC, data and FMI number. + * In order to get these data, use CAN_GetReceivedId(), CAN_GetReceivedIDE(), CAN_GetReceivedRTR(), + * CAN_GetReceivedDLC(), CAN_GetReceivedFMI() and CAN_GetReceivedData() functions. + * @param None + * @retval None + */ +void CAN_Receive(void) +{ + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + uint32_t temp1 = 0, temp2 = 0, temp3 = 0; + + /* select Fifo page*/ + CAN->PSR = CAN_Page_RxFifo; + + /* Get the Id */ + _IDE = (uint8_t)(CAN->Page.RxFIFO.MIDR1 & CAN_Id_Extended); + if (_IDE != CAN_Id_Standard) + { + temp1 = ((uint32_t)((uint32_t)CAN->Page.RxFIFO.MIDR3) << 8); + temp2 = ((uint32_t)((uint32_t)CAN->Page.RxFIFO.MIDR2) << 16); + temp3 = ((uint32_t)((uint32_t)CAN->Page.RxFIFO.MIDR1 & 0x1F) << 24); + + _Id = (uint32_t)CAN_EXTID_SIZE & ((CAN->Page.RxFIFO.MIDR4) | temp1 | temp2 | temp3 ); + } + else + { + temp1 = (uint16_t)((uint16_t)((uint16_t)((uint16_t)CAN->Page.RxFIFO.MIDR1 & 0x1F) << 6)); + temp2 = (uint16_t)((uint16_t)((uint16_t)CAN->Page.RxFIFO.MIDR2 >> 2)&0x3F); + + _Id = (uint16_t)CAN_STDID_SIZE & (temp1 | temp2 ); + } + + _RTR = (uint8_t)((uint8_t)0x20 & CAN->Page.RxFIFO.MIDR1); + + /* Get the DLC */ + _DLC = (uint8_t)(CAN->Page.RxFIFO.MDLCR & (uint8_t)0x0F); + + /* Get the FMI */ + _FMI = CAN->Page.RxFIFO.MFMI; + + /* Get the data field */ + _Data[0] = CAN->Page.RxFIFO.MDAR1; + _Data[1] = CAN->Page.RxFIFO.MDAR2; + _Data[2] = CAN->Page.RxFIFO.MDAR3; + _Data[3] = CAN->Page.RxFIFO.MDAR4; + _Data[4] = CAN->Page.RxFIFO.MDAR5; + _Data[5] = CAN->Page.RxFIFO.MDAR6; + _Data[6] = CAN->Page.RxFIFO.MDAR7; + _Data[7] = CAN->Page.RxFIFO.MDAR8; + + /* Release the FIFO */ + CAN_FIFORelease(); + /*Restore Last Page*/ + CAN_SelectPage(can_page); +} + +/** + * @brief Gets the CAN Id of the received message. + * @param None + * @retval the received CAN message Id. + * @par Required preconditions: + * This function is used to get data loaded by CAN_Receive function. + * Before using this function, CAN_Receive function must be called. + */ +uint32_t CAN_GetReceivedId(void) +{ + return (_Id); +} + +/** + * @brief Gets the CAN IDE of the received message. + * @param None + * @retval the received CAN message IDE. + * @par Required preconditions: + * This function is used to get data loaded by CAN_Receive function. + * Before using this function, CAN_Receive function must be called. + */ +CAN_Id_TypeDef CAN_GetReceivedIDE(void) +{ + return (CAN_Id_TypeDef)(_IDE); +} + +/** + * @brief Gets the CAN RTR of the received message. + * @param None + * @retval the received CAN message RTR. + * @par Required preconditions: + * This function is used to get data loaded by CAN_Receive function. + * Before using this function, CAN_Receive function must be called. + */ +CAN_RTR_TypeDef CAN_GetReceivedRTR(void) +{ + return (CAN_RTR_TypeDef)(_RTR); +} + +/** + * @brief Gets the CAN DLC of the received message. + * @param None + * @retval the received CAN message DLC. + * @par Required preconditions: + * This function is used to get data loaded by CAN_Receive function. + * Before using this function, CAN_Receive function must be called. + */ +uint8_t CAN_GetReceivedDLC(void) +{ + return (_DLC); +} + +/** + * @brief Gets the CAN Data of the received message. + * @param CAN_DataIndexe : number of the received Data, it can + * be an integer between 0 to 7. + * @retval the received CAN message ith Data. + * @par Required preconditions: + * This function is used to get data loaded by CAN_Receive function. + * Before using this function, CAN_Receive function must be called. + */ +uint8_t CAN_GetReceivedData(uint8_t CAN_DataIndex) +{ + assert_param(IS_CAN_DLC_OK(CAN_DataIndex)); + return (_Data[CAN_DataIndex]); +} + +/** + * @brief Gets the CAN FMI of the received message. + * @param None + * @retval the received CAN message FMI. + * @par Required preconditions: + * This function is used to get data loaded by CAN_Receive function. + * Before using this function, CAN_Receive function must be called. + */ +uint8_t CAN_GetReceivedFMI(void) +{ + return (_FMI); +} + +/** + * @brief Returns the Received time stamp. + * @param None + * @retval uint16_t the received time stamp. + */ +uint16_t CAN_GetMessageTimeStamp(void) +{ + uint16_t timestamp = 0; + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + + /*switch to the specific page */ + CAN->PSR = CAN_Page_RxFifo; + /* Get the Received Time stamp */ + timestamp = CAN->Page.RxFIFO.MTSRL; + timestamp |= (uint16_t)(((uint16_t)CAN->Page.RxFIFO.MTSRH)<<8); + + /*Restore Last Page*/ + CAN_SelectPage(can_page); + + return (uint16_t)(timestamp); +} + +/** + * @brief Enters the Sleep low power mode. + * @param None + * @retval CAN_Sleep_Ok if sleep entered, CAN_Sleep_Failed in an other case. + */ +CAN_Sleep_TypeDef CAN_Sleep(void) +{ + CAN_Sleep_TypeDef sleepstatus = CAN_Sleep_Failed; + + /* Request Sleep mode */ + CAN->MCR = (uint8_t)((uint8_t)(CAN->MCR & (uint8_t)(~CAN_MCR_INRQ)) | CAN_MCR_SLEEP); + + /* Sleep mode status */ + if ((CAN->MSR & (CAN_MSR_SLAK|CAN_MSR_INAK)) == CAN_MSR_SLAK) + { + /* Sleep mode not entered */ + sleepstatus = CAN_Sleep_Ok; + } + + /* At this step, sleep mode status */ + return (CAN_Sleep_TypeDef) sleepstatus; +} + +/** + * @brief Wakes the CAN up. + * @param None + * @retval CAN_WakeUp_Ok if sleep mode left, CAN_WakeUp_Failed in an other case. + */ +CAN_WakeUp_TypeDef CAN_WakeUp(void) +{ + CAN_WakeUp_TypeDef wakeupstatus = CAN_WakeUp_Failed; + + /* Wake up request */ + CAN->MCR &= (uint8_t)(~CAN_MCR_SLEEP); + + /* Sleep mode status */ + if ((CAN->MSR & CAN_MSR_SLAK) != CAN_MSR_SLAK) + { + /* Sleep mode exited */ + wakeupstatus = CAN_WakeUp_Ok; + } + + /* At this step, sleep mode status */ + return (CAN_WakeUp_TypeDef)wakeupstatus; +} + +/** + * @brief Select the CAN Operation mode. + * @param CAN_OperatingMode CAN Operating Mode , + * this parameter can be one of @ref CAN_OperatingMode_TypeDef enumeration. + * @retval the status of the requested mode which can be + * - CAN_ModeStatus_Failed CAN failed entering the specific mode + * - CAN_ModeStatus_Success CAN Succeed entering the specific mode + + */ +CAN_ModeStatus_TypeDef CAN_OperatingModeRequest(CAN_OperatingMode_TypeDef CAN_OperatingMode) +{ + uint16_t timeout = CAN_ACKNOWLEDGE_TIMEOUT; + uint8_t modestatus = 0; + + assert_param(IS_CAN_OPERATINGMODE_OK(CAN_OperatingMode)); + + if (CAN_OperatingMode == CAN_OperatingMode_Initialization) + { + /* Request initialisation */ + CAN->MCR = (uint8_t)((uint8_t)(CAN->MCR & (uint8_t)(~CAN_MCR_SLEEP)) | CAN_MCR_INRQ); + + /* Wait the acknowledge */ + while (((CAN->MSR & CAN_MODE_MASK) != CAN_MSR_INAK) && (timeout != 0)) + { + timeout--; + } + if ((CAN->MSR & CAN_MODE_MASK) != CAN_MSR_INAK) + { + modestatus = CAN_ModeStatus_Failed; + } + else + { + modestatus = CAN_ModeStatus_Success; + } + + } + else if (CAN_OperatingMode == CAN_OperatingMode_Normal) + { + /* Request leave initialisation and sleep mode and enter Normal mode */ + CAN->MCR &= (uint8_t)(~(CAN_MCR_SLEEP|CAN_MCR_INRQ)); + + /* Wait the acknowledge */ + while (((CAN->MSR & CAN_MODE_MASK) != 0) && (timeout!=0)) + { + timeout--; + } + if ((CAN->MSR & CAN_MODE_MASK) != 0) + { + modestatus = CAN_ModeStatus_Failed; + } + else + { + modestatus = CAN_ModeStatus_Success; + } + } + else if (CAN_OperatingMode == CAN_OperatingMode_Sleep) + { + /* Request Sleep mode */ + CAN->MCR = (uint8_t)((uint8_t)(CAN->MCR & (uint8_t)(~CAN_MCR_INRQ)) | CAN_MCR_SLEEP); + + /* Wait the acknowledge */ + while (((CAN->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK) && (timeout!=0)) + { + timeout--; + } + if ((CAN->MSR & CAN_MODE_MASK) != CAN_MSR_SLAK) + { + modestatus = CAN_ModeStatus_Failed; + } + else + { + modestatus = CAN_ModeStatus_Success; + } + } + else + { + modestatus = CAN_ModeStatus_Failed; + } + return (CAN_ModeStatus_TypeDef)(modestatus); +} + +/** + * @brief Gets the Last Error Code. + * @param None + * @retval Error Code. + */ +CAN_ErrorCode_TypeDef CAN_GetLastErrorCode(void) +{ + CAN_ErrorCode_TypeDef errcode = CAN_ErrorCode_NoErr; + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + + CAN->PSR = CAN_Page_Config; + errcode = (CAN_ErrorCode_TypeDef)((CAN->Page.Config.ESR) & (CAN_ESR_LEC)); + + /*Restore Last Page*/ + CAN_SelectPage(can_page); + + return (CAN_ErrorCode_TypeDef)(errcode); +} + +/** + * @brief Clears the CAN's pending flags. + * @param CAN_FLAG : Flag to be cleared, can be one of the following parameters: + * CAN_FLAG_RQCP0 Request MailBox0 Flag + * CAN_FLAG_RQCP1 Request MailBox1 Flag + * CAN_FLAG_RQCP2 Request MailBox2 Flag + * CAN_FLAG_FF FIFO Full Flag + * CAN_FLAG_FOV FIFO Overrun Flag + * CAN_FLAG_WKU wake up Flag + * CAN_FLAG_LEC Last error code Flag + * @retval None + */ +void CAN_ClearFlag(CAN_FLAG_TypeDef CAN_Flag) +{ + CAN_Page_TypeDef can_page = (CAN_Page_TypeDef)0; + /* Check the parameters */ + assert_param(IS_CAN_FLAG_CLEAR_OK(CAN_Flag)); + if (((uint16_t)CAN_Flag & 0x0700)!= RESET) + { + if (((uint16_t)CAN_Flag & 0x020B)!= RESET) + { + /*Receive Flags*/ + CAN->RFR = (uint8_t)(CAN_Flag); + } + else if (((uint16_t)CAN_Flag & 0x0403)!= RESET) + { + /*Transmit Flags*/ + CAN->TSR = (uint8_t)(CAN_Flag); + } + else /*if((CAN_Flag & 0x0108)!=(uint16_t)RESET)*/ + { + /*wake up Flags*/ + CAN->MSR = (uint8_t)(CAN_Flag); + } + } + else + { + /*Error Flags*/ + can_page = CAN_GetSelectedPage(); + + /* Clear the selected CAN flags */ + CAN->PSR = CAN_Page_Config; + CAN->Page.Config.ESR = (uint8_t)RESET; + + /*Restore Last Page*/ + CAN_SelectPage(can_page); + } +} + +/** + * @brief Checks whether the specified CAN flag is set or not. + * @param CAN_FLAG: specifies the flag to check, can be one of @ref CAN_FLAG_TypeDef enumeration. + * @retval The new state of CAN_FLAG which can be one of @ref FlagStatus. + */ +FlagStatus CAN_GetFlagStatus(CAN_FLAG_TypeDef CAN_Flag) +{ + FlagStatus bitstatus = RESET; + CAN_Page_TypeDef can_page = (CAN_Page_TypeDef)0; + + /* Check the parameters */ + assert_param(IS_CAN_FLAG_STATUS_OK(CAN_Flag)); + + if (((uint16_t)CAN_Flag & 0x0700)!= RESET) + { + if (((uint16_t)CAN_Flag & 0x020B)!= RESET) + { + /*Receive Flags*/ + if ((CAN->RFR & (uint16_t)CAN_Flag )!= RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + + } + else if (((uint16_t)CAN_Flag & 0x0403)!= RESET) + { + /*Transmit Flags*/ + if ((CAN->TSR & (uint16_t)CAN_Flag )!= RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + } + else /*if((CAN_Flag & 0x0108)!=(uint16_t)RESET)*/ + { + /*wake up Flags*/ + if ((CAN->MSR & (uint16_t)CAN_Flag )!= RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + } + } + else + { + /*Error Flags*/ + can_page = CAN_GetSelectedPage(); + + CAN->PSR = CAN_Page_Config; + if ((CAN->Page.Config.ESR & (uint16_t)CAN_Flag) != RESET) + { + /* CAN_FLAG is set */ + bitstatus = SET; + } + else + { + /* CAN_FLAG is reset */ + bitstatus = RESET; + } + /*Restore Last Page*/ + CAN_SelectPage(can_page); + } + + + /* Return the CAN_FLAG status */ + return (FlagStatus)bitstatus; +} + +/** + * @brief Checks whether the specified CAN interrupt has occurred or not. + * @param CAN_IT: specifies the CAN interrupt source to check, can be one of @ref CAN_IT_TypeDef. + * @retval The new state of CAN_IT, which can be one of @ref ITStatus. + */ +ITStatus CAN_GetITStatus(CAN_IT_TypeDef CAN_IT) +{ + ITStatus pendingbitstatus = RESET; + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + + /* Check the parameters */ + assert_param(IS_CAN_IT_STATUS_OK(CAN_IT)); + + + switch (CAN_IT) + { + case CAN_IT_TME: + if ((CAN->IER & CAN_IER_TMEIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->TSR, CAN_TSR_RQCP012); + } + else + { + pendingbitstatus = RESET; + } + break; + + case CAN_IT_FMP: + if ((CAN->IER & CAN_IER_FMPIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->RFR, CAN_RFR_FMP01); + } + else + { + pendingbitstatus = RESET; + } + break; + case CAN_IT_FF: + if ((CAN->IER & CAN_IER_FFIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->RFR, CAN_RFR_FULL); + } + else + { + pendingbitstatus = RESET; + } + break; + case CAN_IT_FOV: + if ((CAN->IER & CAN_IER_FOVIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->RFR, CAN_RFR_FOVR); + } + else + { + pendingbitstatus = RESET; + } + break; + case CAN_IT_WKU: + if ((CAN->IER & CAN_IER_WKUIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->MSR, CAN_MSR_WKUI); + } + else + { + pendingbitstatus = RESET; + } + break; + + case CAN_IT_ERR: + CAN->PSR = CAN_Page_Config; + if ((CAN->Page.Config.EIER & CAN_EIER_ERRIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->Page.Config.ESR, CAN_ESR_EWGF|CAN_ESR_EPVF|CAN_ESR_BOFF|CAN_ESR_LEC); + } + else + { + pendingbitstatus = RESET; + } + break; + + case CAN_IT_EWG: + CAN->PSR = CAN_Page_Config; + if ((CAN->Page.Config.EIER & CAN_EIER_EWGIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->Page.Config.ESR, CAN_ESR_EWGF); + } + else + { + pendingbitstatus = RESET; + } + break; + + case CAN_IT_EPV: + CAN->PSR = CAN_Page_Config; + if ((CAN->Page.Config.EIER & CAN_EIER_EPVIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->Page.Config.ESR, CAN_ESR_EPVF); + } + else + { + pendingbitstatus = RESET; + } + break; + case CAN_IT_BOF: + CAN->PSR = CAN_Page_Config; + if ((CAN->Page.Config.EIER & CAN_EIER_BOFIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->Page.Config.ESR, CAN_ESR_BOFF); + } + else + { + pendingbitstatus = RESET; + } + break; + case CAN_IT_LEC: + CAN->PSR = CAN_Page_Config; + if ((CAN->Page.Config.EIER & CAN_EIER_LECIE) !=RESET) + { + pendingbitstatus = CheckITStatus(CAN->Page.Config.ESR, CAN_ESR_LEC); + } + else + { + pendingbitstatus = RESET; + } + break; + default : + pendingbitstatus = RESET; + break; + } + /*Restore Last Page*/ + CAN_SelectPage(can_page); + /* Return the CAN_IT status */ + return (ITStatus)pendingbitstatus; +} + +/** + * @brief Clears the CAN’s interrupt pending bits. + * @param CAN_IT: specifies the interrupt pending bit to clear, + * can be one of the following parameters: + * CAN_IT_TME = Transmit mailbox empty interrupt + * CAN_IT_FF =FIFO full interrupt + * CAN_IT_FOV =FIFO overrun interrupt + * CAN_IT_WKU =Wake-up interrupt + * CAN_IT_ERR =General Error interrupt + * CAN_IT_EWG =Error warning interrupt + * CAN_IT_EPV =Error passive interrupt + * CAN_IT_BOF = Bus-off interrupt + * CAN_IT_LEC =Last error code interrupt + * @retval None + */ +void CAN_ClearITPendingBit(CAN_IT_TypeDef CAN_IT) +{ + CAN_Page_TypeDef can_page = CAN_GetSelectedPage(); + /* Check the parameters */ + assert_param(IS_CAN_IT_PENDING_BIT_OK(CAN_IT)); + + switch (CAN_IT) + { + case CAN_IT_TME: + CAN->TSR = CAN_TSR_RQCP012;/* rc_w1*/ + break; + + case CAN_IT_FF: + CAN->RFR = CAN_RFR_FULL; /* rc_w1*/ + break; + + case CAN_IT_FOV: + CAN->RFR = CAN_RFR_FOVR; /* rc_w1*/ + break; + + case CAN_IT_WKU: + CAN->MSR = CAN_MSR_WKUI; /* rc_w1*/ + break; + + case CAN_IT_ERR: + CAN->PSR = CAN_Page_Config; + CAN->Page.Config.ESR = (uint8_t)CAN_ESR_RESET_VALUE; + CAN->MSR = CAN_MSR_ERRI; + break; + + case CAN_IT_EWG: + CAN->MSR = CAN_MSR_ERRI; + break; + + case CAN_IT_EPV: + CAN->MSR = CAN_MSR_ERRI; + break; + + case CAN_IT_BOF: + CAN->MSR = CAN_MSR_ERRI; + break; + + case CAN_IT_LEC: + CAN->PSR = CAN_Page_Config; + CAN->Page.Config.ESR = (uint8_t)CAN_ESR_RESET_VALUE; + break; + + default : + break; + } + /*Restore Last Page*/ + CAN_SelectPage(can_page); +} + +/** + * @brief Gets the selected registers page. + * @param None + * @retval the selected page which can be one of the @ref CAN_Page_TypeDef. + */ +CAN_Page_TypeDef CAN_GetSelectedPage(void) +{ + return (CAN_Page_TypeDef)(CAN->PSR); +} + +/** + * @brief Sets the registers page to be selected. + * @param the selected page which can be one of the @ref CAN_Page_TypeDef. + * @retval None + */ +void CAN_SelectPage(CAN_Page_TypeDef CAN_Page) +{ + CAN->PSR = (uint8_t)CAN_Page; +} + +/** + * @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, which can be one of ITStatus. + */ +static ITStatus CheckITStatus(uint8_t CAN_Reg, uint8_t It_Bit) +{ + ITStatus pendingbitstatus = RESET; + if ((CAN_Reg & It_Bit) != (uint8_t)RESET) + { + /* CAN_IT is set */ + pendingbitstatus = SET; + } + else + { + /* CAN_IT is reset */ + pendingbitstatus = RESET; + } + return (ITStatus)pendingbitstatus; +} + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_clk.c b/4_EXT_INT_1PORT/lib/src/stm8s_clk.c new file mode 100644 index 0000000..b79a737 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_clk.c @@ -0,0 +1,756 @@ +/** + ****************************************************************************** + * @file stm8s_clk.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the CLK peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#include "stm8s_clk.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Private Constants ---------------------------------------------------------*/ + +/** + * @addtogroup CLK_Private_Constants + * @{ + */ + +CONST uint8_t HSIDivFactor[4] = {1, 2, 4, 8}; /*!< Holds the different HSI Divider factors */ +CONST uint8_t CLKPrescTable[8] = {1, 2, 4, 8, 10, 16, 20, 40}; /*!< Holds the different CLK prescaler values */ + +/** + * @} + */ + +/* Public functions ----------------------------------------------------------*/ +/** + * @addtogroup CLK_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the CLK peripheral registers to their default reset + * values. + * @param None + * @retval None + * @par Warning: + * Resetting the CCOR register: \n + * When the CCOEN bit is set, the reset of the CCOR register require + * two consecutive write instructions in order to reset first the CCOEN bit + * and the second one is to reset the CCOSEL bits. + */ +void CLK_DeInit(void) +{ + CLK->ICKR = CLK_ICKR_RESET_VALUE; + CLK->ECKR = CLK_ECKR_RESET_VALUE; + CLK->SWR = CLK_SWR_RESET_VALUE; + CLK->SWCR = CLK_SWCR_RESET_VALUE; + CLK->CKDIVR = CLK_CKDIVR_RESET_VALUE; + CLK->PCKENR1 = CLK_PCKENR1_RESET_VALUE; + CLK->PCKENR2 = CLK_PCKENR2_RESET_VALUE; + CLK->CSSR = CLK_CSSR_RESET_VALUE; + CLK->CCOR = CLK_CCOR_RESET_VALUE; + while ((CLK->CCOR & CLK_CCOR_CCOEN)!= 0) + {} + CLK->CCOR = CLK_CCOR_RESET_VALUE; + CLK->HSITRIMR = CLK_HSITRIMR_RESET_VALUE; + CLK->SWIMCCR = CLK_SWIMCCR_RESET_VALUE; +} + +/** + * @brief Configures the High Speed Internal oscillator (HSI). + * @par Full description: + * If CLK_FastHaltWakeup is enabled, HSI oscillator is automatically + * switched-on (HSIEN=1) and selected as next clock master + * (CKM=SWI=HSI) when resuming from HALT/ActiveHalt modes.\n + * @param NewState this parameter is the Wake-up Mode state. + * @retval None + */ +void CLK_FastHaltWakeUpCmd(FunctionalState NewState) +{ + /* check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Set FHWU bit (HSI oscillator is automatically switched-on) */ + CLK->ICKR |= CLK_ICKR_FHWU; + } + else /* FastHaltWakeup = DISABLE */ + { + /* Reset FHWU bit */ + CLK->ICKR &= (uint8_t)(~CLK_ICKR_FHWU); + } +} + +/** + * @brief Enable or Disable the External High Speed oscillator (HSE). + * @param NewState new state of HSEEN, value accepted ENABLE, DISABLE. + * @retval None + */ +void CLK_HSECmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Set HSEEN bit */ + CLK->ECKR |= CLK_ECKR_HSEEN; + } + else + { + /* Reset HSEEN bit */ + CLK->ECKR &= (uint8_t)(~CLK_ECKR_HSEEN); + } +} + +/** + * @brief Enables or disables the Internal High Speed oscillator (HSI). + * @param NewState new state of HSIEN, value accepted ENABLE, DISABLE. + * @retval None + */ +void CLK_HSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Set HSIEN bit */ + CLK->ICKR |= CLK_ICKR_HSIEN; + } + else + { + /* Reset HSIEN bit */ + CLK->ICKR &= (uint8_t)(~CLK_ICKR_HSIEN); + } +} + +/** + * @brief Enables or disables the Internal Low Speed oscillator (LSI). + * @param NewState new state of LSIEN, value accepted ENABLE, DISABLE. + * @note Before using the LSI clock you have to enable the option bytes (LSI_EN option bit is set). + * @retval None + */ +void CLK_LSICmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Set LSIEN bit */ + CLK->ICKR |= CLK_ICKR_LSIEN; + } + else + { + /* Reset LSIEN bit */ + CLK->ICKR &= (uint8_t)(~CLK_ICKR_LSIEN); + } +} + +/** + * @brief Enables or disablle the Configurable Clock Output (CCO). + * @param NewState : New state of CCEN bit (CCO register). + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void CLK_CCOCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Set CCOEN bit */ + CLK->CCOR |= CLK_CCOR_CCOEN; + } + else + { + /* Reset CCOEN bit */ + CLK->CCOR &= (uint8_t)(~CLK_CCOR_CCOEN); + } +} + +/** + * @brief Starts or Stops manually the clock switch execution. + * @par Full description: + * NewState parameter set the SWEN. + * @param NewState new state of SWEN, value accepted ENABLE, DISABLE. + * @retval None + */ +void CLK_ClockSwitchCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE ) + { + /* Enable the Clock Switch */ + CLK->SWCR |= CLK_SWCR_SWEN; + } + else + { + /* Disable the Clock Switch */ + CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWEN); + } +} + +/** + * @brief Configures the slow active halt wake up + * @param NewState: specifies the Slow Active Halt wake up state. + * can be set of the following values: + * - DISABLE: Slow Active Halt mode disabled; + * - ENABLE: Slow Active Halt mode enabled. + * @retval None + */ +void CLK_SlowActiveHaltWakeUpCmd(FunctionalState NewState) +{ + /* check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Set S_ACTHALT bit */ + CLK->ICKR |= CLK_ICKR_SWUAH; + } + else + { + /* Reset S_ACTHALT bit */ + CLK->ICKR &= (uint8_t)(~CLK_ICKR_SWUAH); + } +} + +/** + * @brief Enables or disables the specified peripheral CLK. + * @param CLK_Peripheral : This parameter specifies the peripheral clock to gate. + * This parameter can be any of the @ref CLK_Peripheral_TypeDef enumeration. + * @param NewState : New state of specified peripheral clock. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void CLK_PeripheralClockConfig(CLK_Peripheral_TypeDef CLK_Peripheral, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + assert_param(IS_CLK_PERIPHERAL_OK(CLK_Peripheral)); + + if (((uint8_t)CLK_Peripheral & (uint8_t)0x10) == 0x00) + { + if (NewState != DISABLE) + { + /* Enable the peripheral Clock */ + CLK->PCKENR1 |= (uint8_t)((uint8_t)1 << ((uint8_t)CLK_Peripheral & (uint8_t)0x0F)); + } + else + { + /* Disable the peripheral Clock */ + CLK->PCKENR1 &= (uint8_t)(~(uint8_t)(((uint8_t)1 << ((uint8_t)CLK_Peripheral & (uint8_t)0x0F)))); + } + } + else + { + if (NewState != DISABLE) + { + /* Enable the peripheral Clock */ + CLK->PCKENR2 |= (uint8_t)((uint8_t)1 << ((uint8_t)CLK_Peripheral & (uint8_t)0x0F)); + } + else + { + /* Disable the peripheral Clock */ + CLK->PCKENR2 &= (uint8_t)(~(uint8_t)(((uint8_t)1 << ((uint8_t)CLK_Peripheral & (uint8_t)0x0F)))); + } + } +} + +/** + * @brief configures the Switch from one clock to another + * @param CLK_SwitchMode select the clock switch mode. + * It can be set of the values of @ref CLK_SwitchMode_TypeDef + * @param CLK_NewClock choice of the future clock. + * It can be set of the values of @ref CLK_Source_TypeDef + * @param NewState Enable or Disable the Clock Switch interrupt. + * @param CLK_CurrentClockState current clock to switch OFF or to keep ON. + * It can be set of the values of @ref CLK_CurrentClockState_TypeDef + * @note LSI selected as master clock source only if LSI_EN option bit is set. + * @retval ErrorStatus this shows the clock switch status (ERROR/SUCCESS). + */ +ErrorStatus CLK_ClockSwitchConfig(CLK_SwitchMode_TypeDef CLK_SwitchMode, CLK_Source_TypeDef CLK_NewClock, FunctionalState ITState, CLK_CurrentClockState_TypeDef CLK_CurrentClockState) +{ + CLK_Source_TypeDef clock_master; + uint16_t DownCounter = CLK_TIMEOUT; + ErrorStatus Swif = ERROR; + + /* Check the parameters */ + assert_param(IS_CLK_SOURCE_OK(CLK_NewClock)); + assert_param(IS_CLK_SWITCHMODE_OK(CLK_SwitchMode)); + assert_param(IS_FUNCTIONALSTATE_OK(ITState)); + assert_param(IS_CLK_CURRENTCLOCKSTATE_OK(CLK_CurrentClockState)); + + /* Current clock master saving */ + clock_master = (CLK_Source_TypeDef)CLK->CMSR; + + /* Automatic switch mode management */ + if (CLK_SwitchMode == CLK_SWITCHMODE_AUTO) + { + /* Enables Clock switch */ + CLK->SWCR |= CLK_SWCR_SWEN; + + /* Enables or Disables Switch interrupt */ + if (ITState != DISABLE) + { + CLK->SWCR |= CLK_SWCR_SWIEN; + } + else + { + CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWIEN); + } + + /* Selection of the target clock source */ + CLK->SWR = (uint8_t)CLK_NewClock; + + /* Wait until the target clock source is ready */ + while((((CLK->SWCR & CLK_SWCR_SWBSY) != 0 )&& (DownCounter != 0))) + { + DownCounter--; + } + + if(DownCounter != 0) + { + Swif = SUCCESS; + } + else + { + Swif = ERROR; + } + } + else /* CLK_SwitchMode == CLK_SWITCHMODE_MANUAL */ + { + /* Enables or Disables Switch interrupt if required */ + if (ITState != DISABLE) + { + CLK->SWCR |= CLK_SWCR_SWIEN; + } + else + { + CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWIEN); + } + + /* Selection of the target clock source */ + CLK->SWR = (uint8_t)CLK_NewClock; + + /* Wait until the target clock source is ready */ + while((((CLK->SWCR & CLK_SWCR_SWIF) != 0 ) && (DownCounter != 0))) + { + DownCounter--; + } + + if(DownCounter != 0) + { + /* Enables Clock switch */ + CLK->SWCR |= CLK_SWCR_SWEN; + Swif = SUCCESS; + } + else + { + Swif = ERROR; + } + } + if(Swif != ERROR) + { + /* Switch OFF current clock if required */ + if((CLK_CurrentClockState == CLK_CURRENTCLOCKSTATE_DISABLE) && ( clock_master == CLK_SOURCE_HSI)) + { + CLK->ICKR &= (uint8_t)(~CLK_ICKR_HSIEN); + } + else if((CLK_CurrentClockState == CLK_CURRENTCLOCKSTATE_DISABLE) && ( clock_master == CLK_SOURCE_LSI)) + { + CLK->ICKR &= (uint8_t)(~CLK_ICKR_LSIEN); + } + else if ((CLK_CurrentClockState == CLK_CURRENTCLOCKSTATE_DISABLE) && ( clock_master == CLK_SOURCE_HSE)) + { + CLK->ECKR &= (uint8_t)(~CLK_ECKR_HSEEN); + } + } + return(Swif); +} + +/** + * @brief Configures the HSI clock dividers. + * @param HSIPrescaler : Specifies the HSI clock divider to apply. + * This parameter can be any of the @ref CLK_Prescaler_TypeDef enumeration. + * @retval None + */ +void CLK_HSIPrescalerConfig(CLK_Prescaler_TypeDef HSIPrescaler) +{ + /* check the parameters */ + assert_param(IS_CLK_HSIPRESCALER_OK(HSIPrescaler)); + + /* Clear High speed internal clock prescaler */ + CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV); + + /* Set High speed internal clock prescaler */ + CLK->CKDIVR |= (uint8_t)HSIPrescaler; +} + +/** + * @brief Output the selected clock on a dedicated I/O pin. + * @param CLK_CCO : Specifies the clock source. + * This parameter can be any of the @ref CLK_Output_TypeDef enumeration. + * @retval None + * @par Required preconditions: + * The dedicated I/O pin must be set at 1 in the corresponding Px_CR1 register \n + * to be set as input with pull-up or push-pull output. + */ +void CLK_CCOConfig(CLK_Output_TypeDef CLK_CCO) +{ + /* check the parameters */ + assert_param(IS_CLK_OUTPUT_OK(CLK_CCO)); + + /* Clears of the CCO type bits part */ + CLK->CCOR &= (uint8_t)(~CLK_CCOR_CCOSEL); + + /* Selects the source provided on cco_ck output */ + CLK->CCOR |= (uint8_t)CLK_CCO; + + /* Enable the clock output */ + CLK->CCOR |= CLK_CCOR_CCOEN; +} + +/** + * @brief Enables or disables the specified CLK interrupts. + * @param CLK_IT This parameter specifies the interrupt sources. + * It can be one of the values of @ref CLK_IT_TypeDef. + * @param NewState New state of the Interrupt. + * Value accepted ENABLE, DISABLE. + * @retval None + */ +void CLK_ITConfig(CLK_IT_TypeDef CLK_IT, FunctionalState NewState) +{ + /* check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + assert_param(IS_CLK_IT_OK(CLK_IT)); + + if (NewState != DISABLE) + { + switch (CLK_IT) + { + case CLK_IT_SWIF: /* Enable the clock switch interrupt */ + CLK->SWCR |= CLK_SWCR_SWIEN; + break; + case CLK_IT_CSSD: /* Enable the clock security system detection interrupt */ + CLK->CSSR |= CLK_CSSR_CSSDIE; + break; + default: + break; + } + } + else /*(NewState == DISABLE)*/ + { + switch (CLK_IT) + { + case CLK_IT_SWIF: /* Disable the clock switch interrupt */ + CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWIEN); + break; + case CLK_IT_CSSD: /* Disable the clock security system detection interrupt */ + CLK->CSSR &= (uint8_t)(~CLK_CSSR_CSSDIE); + break; + default: + break; + } + } +} + +/** + * @brief Configures the HSI and CPU clock dividers. + * @param ClockPrescaler Specifies the HSI or CPU clock divider to apply. + * @retval None + */ +void CLK_SYSCLKConfig(CLK_Prescaler_TypeDef CLK_Prescaler) +{ + /* check the parameters */ + assert_param(IS_CLK_PRESCALER_OK(CLK_Prescaler)); + + if (((uint8_t)CLK_Prescaler & (uint8_t)0x80) == 0x00) /* Bit7 = 0 means HSI divider */ + { + CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_HSIDIV); + CLK->CKDIVR |= (uint8_t)((uint8_t)CLK_Prescaler & (uint8_t)CLK_CKDIVR_HSIDIV); + } + else /* Bit7 = 1 means CPU divider */ + { + CLK->CKDIVR &= (uint8_t)(~CLK_CKDIVR_CPUDIV); + CLK->CKDIVR |= (uint8_t)((uint8_t)CLK_Prescaler & (uint8_t)CLK_CKDIVR_CPUDIV); + } +} + +/** + * @brief Configures the SWIM clock frequency on the fly. + * @param CLK_SWIMDivider Specifies the SWIM clock divider to apply. + * can be one of the value of @ref CLK_SWIMDivider_TypeDef + * @retval None + */ +void CLK_SWIMConfig(CLK_SWIMDivider_TypeDef CLK_SWIMDivider) +{ + /* check the parameters */ + assert_param(IS_CLK_SWIMDIVIDER_OK(CLK_SWIMDivider)); + + if (CLK_SWIMDivider != CLK_SWIMDIVIDER_2) + { + /* SWIM clock is not divided by 2 */ + CLK->SWIMCCR |= CLK_SWIMCCR_SWIMDIV; + } + else /* CLK_SWIMDivider == CLK_SWIMDIVIDER_2 */ + { + /* SWIM clock is divided by 2 */ + CLK->SWIMCCR &= (uint8_t)(~CLK_SWIMCCR_SWIMDIV); + } +} + +/** + * @brief Enables the Clock Security System. + * @par Full description: + * once CSS is enabled it cannot be disabled until the next reset. + * @param None + * @retval None + */ +void CLK_ClockSecuritySystemEnable(void) +{ + /* Set CSSEN bit */ + CLK->CSSR |= CLK_CSSR_CSSEN; +} + +/** + * @brief Returns the clock source used as system clock. + * @param None + * @retval Clock source used. + * can be one of the values of @ref CLK_Source_TypeDef + */ +CLK_Source_TypeDef CLK_GetSYSCLKSource(void) +{ + return((CLK_Source_TypeDef)CLK->CMSR); +} + +/** + * @brief This function returns the frequencies of different on chip clocks. + * @param None + * @retval the master clock frequency + */ +uint32_t CLK_GetClockFreq(void) +{ + uint32_t clockfrequency = 0; + CLK_Source_TypeDef clocksource = CLK_SOURCE_HSI; + uint8_t tmp = 0, presc = 0; + + /* Get CLK source. */ + clocksource = (CLK_Source_TypeDef)CLK->CMSR; + + if (clocksource == CLK_SOURCE_HSI) + { + tmp = (uint8_t)(CLK->CKDIVR & CLK_CKDIVR_HSIDIV); + tmp = (uint8_t)(tmp >> 3); + presc = HSIDivFactor[tmp]; + clockfrequency = HSI_VALUE / presc; + } + else if ( clocksource == CLK_SOURCE_LSI) + { + clockfrequency = LSI_VALUE; + } + else + { + clockfrequency = HSE_VALUE; + } + + return((uint32_t)clockfrequency); +} + +/** + * @brief Adjusts the Internal High Speed oscillator (HSI) calibration value. + * @par Full description: + * @param CLK_HSICalibrationValue calibration trimming value. + * can be one of the values of @ref CLK_HSITrimValue_TypeDef + * @retval None + */ +void CLK_AdjustHSICalibrationValue(CLK_HSITrimValue_TypeDef CLK_HSICalibrationValue) +{ + /* check the parameters */ + assert_param(IS_CLK_HSITRIMVALUE_OK(CLK_HSICalibrationValue)); + + /* Store the new value */ + CLK->HSITRIMR = (uint8_t)( (uint8_t)(CLK->HSITRIMR & (uint8_t)(~CLK_HSITRIMR_HSITRIM))|((uint8_t)CLK_HSICalibrationValue)); +} + +/** + * @brief Reset the SWBSY flag (SWICR Register) + * @par Full description: + * This function reset SWBSY flag in order to reset clock switch operations (target + * oscillator is broken, stabilization is longing too much, etc.). If at the same time \n + * software attempts to set SWEN and clear SWBSY, SWBSY action takes precedence. + * @param None + * @retval None + */ +void CLK_SYSCLKEmergencyClear(void) +{ + CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWBSY); +} + +/** + * @brief Checks whether the specified CLK flag is set or not. + * @par Full description: + * @param CLK_FLAG Flag to check. + * can be one of the values of @ref CLK_Flag_TypeDef + * @retval FlagStatus, status of the checked flag + */ +FlagStatus CLK_GetFlagStatus(CLK_Flag_TypeDef CLK_FLAG) +{ + uint16_t statusreg = 0; + uint8_t tmpreg = 0; + FlagStatus bitstatus = RESET; + + /* check the parameters */ + assert_param(IS_CLK_FLAG_OK(CLK_FLAG)); + + /* Get the CLK register index */ + statusreg = (uint16_t)((uint16_t)CLK_FLAG & (uint16_t)0xFF00); + + + if (statusreg == 0x0100) /* The flag to check is in ICKRregister */ + { + tmpreg = CLK->ICKR; + } + else if (statusreg == 0x0200) /* The flag to check is in ECKRregister */ + { + tmpreg = CLK->ECKR; + } + else if (statusreg == 0x0300) /* The flag to check is in SWIC register */ + { + tmpreg = CLK->SWCR; + } + else if (statusreg == 0x0400) /* The flag to check is in CSS register */ + { + tmpreg = CLK->CSSR; + } + else /* The flag to check is in CCO register */ + { + tmpreg = CLK->CCOR; + } + + if ((tmpreg & (uint8_t)CLK_FLAG) != (uint8_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + + /* Return the flag status */ + return((FlagStatus)bitstatus); +} + +/** + * @brief Checks whether the specified CLK interrupt has is enabled or not. + * @param CLK_IT specifies the CLK interrupt. + * can be one of the values of @ref CLK_IT_TypeDef + * @retval ITStatus, new state of CLK_IT (SET or RESET). + */ +ITStatus CLK_GetITStatus(CLK_IT_TypeDef CLK_IT) +{ + ITStatus bitstatus = RESET; + + /* check the parameters */ + assert_param(IS_CLK_IT_OK(CLK_IT)); + + if (CLK_IT == CLK_IT_SWIF) + { + /* Check the status of the clock switch interrupt */ + if ((CLK->SWCR & (uint8_t)CLK_IT) == (uint8_t)0x0C) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else /* CLK_IT == CLK_IT_CSSDIE */ + { + /* Check the status of the security system detection interrupt */ + if ((CLK->CSSR & (uint8_t)CLK_IT) == (uint8_t)0x0C) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + /* Return the CLK_IT status */ + return bitstatus; +} + +/** + * @brief Clears the CLK’s interrupt pending bits. + * @param CLK_IT specifies the interrupt pending bits. + * can be one of the values of @ref CLK_IT_TypeDef + * @retval None + */ +void CLK_ClearITPendingBit(CLK_IT_TypeDef CLK_IT) +{ + /* check the parameters */ + assert_param(IS_CLK_IT_OK(CLK_IT)); + + if (CLK_IT == (uint8_t)CLK_IT_CSSD) + { + /* Clear the status of the security system detection interrupt */ + CLK->CSSR &= (uint8_t)(~CLK_CSSR_CSSD); + } + else /* CLK_PendingBit == (uint8_t)CLK_IT_SWIF */ + { + /* Clear the status of the clock switch interrupt */ + CLK->SWCR &= (uint8_t)(~CLK_SWCR_SWIF); + } + +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_exti.c b/4_EXT_INT_1PORT/lib/src/stm8s_exti.c new file mode 100644 index 0000000..a59f74d --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_exti.c @@ -0,0 +1,181 @@ +/** + ****************************************************************************** + * @file stm8s_exti.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the EXTI peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_exti.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/* Public functions ----------------------------------------------------------*/ + +/** + * @addtogroup EXTI_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the external interrupt control registers to their default reset value. + * @param None + * @retval None + */ +void EXTI_DeInit(void) +{ + EXTI->CR1 = EXTI_CR1_RESET_VALUE; + EXTI->CR2 = EXTI_CR2_RESET_VALUE; +} + +/** + * @brief Set the external interrupt sensitivity of the selected port. + * @warning + * - The modification of external interrupt sensitivity is only possible when the interrupts are disabled. + * - The normal behavior is to disable the interrupts before calling this function, and re-enable them after. + * @param Port The port number to access. + * @param SensitivityValue The external interrupt sensitivity value to set. + * @retval None + * @par Required preconditions: + * Global interrupts must be disabled before calling this function. + */ +void EXTI_SetExtIntSensitivity(EXTI_Port_TypeDef Port, EXTI_Sensitivity_TypeDef SensitivityValue) +{ + /* Check function parameters */ + assert_param(IS_EXTI_PORT_OK(Port)); + assert_param(IS_EXTI_SENSITIVITY_OK(SensitivityValue)); + + /* Set external interrupt sensitivity */ + switch (Port) + { + case EXTI_PORT_GPIOA: + EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PAIS); + EXTI->CR1 |= (uint8_t)(SensitivityValue); + break; + case EXTI_PORT_GPIOB: + EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PBIS); + EXTI->CR1 |= (uint8_t)((uint8_t)(SensitivityValue) << 2); + break; + case EXTI_PORT_GPIOC: + EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PCIS); + EXTI->CR1 |= (uint8_t)((uint8_t)(SensitivityValue) << 4); + break; + case EXTI_PORT_GPIOD: + EXTI->CR1 &= (uint8_t)(~EXTI_CR1_PDIS); + EXTI->CR1 |= (uint8_t)((uint8_t)(SensitivityValue) << 6); + break; + case EXTI_PORT_GPIOE: + EXTI->CR2 &= (uint8_t)(~EXTI_CR2_PEIS); + EXTI->CR2 |= (uint8_t)(SensitivityValue); + break; + default: + break; + } +} + +/** + * @brief Set the TLI interrupt sensitivity. + * @param SensitivityValue The TLI interrupt sensitivity value. + * @retval None + * @par Required preconditions: + * Global interrupts must be disabled before calling this function. + */ +void EXTI_SetTLISensitivity(EXTI_TLISensitivity_TypeDef SensitivityValue) +{ + /* Check function parameters */ + assert_param(IS_EXTI_TLISENSITIVITY_OK(SensitivityValue)); + + /* Set TLI interrupt sensitivity */ + EXTI->CR2 &= (uint8_t)(~EXTI_CR2_TLIS); + EXTI->CR2 |= (uint8_t)(SensitivityValue); +} + +/** + * @brief Get the external interrupt sensitivity of the selected port. + * @param Port The port number to access. + * @retval EXTI_Sensitivity_TypeDef The external interrupt sensitivity of the selected port. + */ +EXTI_Sensitivity_TypeDef EXTI_GetExtIntSensitivity(EXTI_Port_TypeDef Port) +{ + uint8_t value = 0; + + /* Check function parameters */ + assert_param(IS_EXTI_PORT_OK(Port)); + + switch (Port) + { + case EXTI_PORT_GPIOA: + value = (uint8_t)(EXTI->CR1 & EXTI_CR1_PAIS); + break; + case EXTI_PORT_GPIOB: + value = (uint8_t)((uint8_t)(EXTI->CR1 & EXTI_CR1_PBIS) >> 2); + break; + case EXTI_PORT_GPIOC: + value = (uint8_t)((uint8_t)(EXTI->CR1 & EXTI_CR1_PCIS) >> 4); + break; + case EXTI_PORT_GPIOD: + value = (uint8_t)((uint8_t)(EXTI->CR1 & EXTI_CR1_PDIS) >> 6); + break; + case EXTI_PORT_GPIOE: + value = (uint8_t)(EXTI->CR2 & EXTI_CR2_PEIS); + break; + default: + break; + } + + return((EXTI_Sensitivity_TypeDef)value); +} + +/** + * @brief Get the TLI interrupt sensitivity. + * @param None + * @retval EXTI_TLISensitivity_TypeDef The TLI interrupt sensitivity read. + */ +EXTI_TLISensitivity_TypeDef EXTI_GetTLISensitivity(void) +{ + uint8_t value = 0; + + /* Get TLI interrupt sensitivity */ + value = (uint8_t)(EXTI->CR2 & EXTI_CR2_TLIS); + + return((EXTI_TLISensitivity_TypeDef)value); +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_flash.c b/4_EXT_INT_1PORT/lib/src/stm8s_flash.c new file mode 100644 index 0000000..ec2e33c --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_flash.c @@ -0,0 +1,714 @@ +/** + ****************************************************************************** + * @file stm8s_flash.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the FLASH peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_flash.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/** +@code + This driver provides functions to configure and program the Flash memory of all + STM8S devices. + + It includes as well functions that can be either executed from RAM or not, and + other functions that must be executed from RAM otherwise useless. + + The table below lists the functions that can be executed from RAM. + + +--------------------------------------------------------------------------------| + | Functions prototypes | RAM execution | Comments | + ---------------------------------------------------------------------------------| + | | Mandatory in case of block | Can be executed | + | FLASH_WaitForLastOperation | Operation: | from Flash in case | + | | - Block programming | of byte and word | + | | - Block erase | Operations | + |--------------------------------------------------------------------------------| + | FLASH_ProgramBlock | Exclusively | useless from Flash | + |--------------------------------------------------------------------------------| + | FLASH_EraseBlock | Exclusively | useless from Flash | + |--------------------------------------------------------------------------------| + + To be able to execute functions from RAM several steps have to be followed. + These steps may differ from one toolchain to another. + A detailed description is available below within this driver. + You can also refer to the FLASH examples provided within the + STM8S_StdPeriph_Lib package. + +@endcode +*/ + + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +#define FLASH_CLEAR_BYTE ((uint8_t)0x00) +#define FLASH_SET_BYTE ((uint8_t)0xFF) +#define OPERATION_TIMEOUT ((uint16_t)0xFFFF) +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private Constants ---------------------------------------------------------*/ + +/** @addtogroup FLASH_Public_functions + * @{ + */ + +/** + * @brief Unlocks the program or data EEPROM memory + * @param FLASH_MemType : Memory type to unlock + * This parameter can be a value of @ref FLASH_MemType_TypeDef + * @retval None + */ +void FLASH_Unlock(FLASH_MemType_TypeDef FLASH_MemType) +{ + /* Check parameter */ + assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType)); + + /* Unlock program memory */ + if(FLASH_MemType == FLASH_MEMTYPE_PROG) + { + FLASH->PUKR = FLASH_RASS_KEY1; + FLASH->PUKR = FLASH_RASS_KEY2; + } + /* Unlock data memory */ + else + { + FLASH->DUKR = FLASH_RASS_KEY2; /* Warning: keys are reversed on data memory !!! */ + FLASH->DUKR = FLASH_RASS_KEY1; + } +} + +/** + * @brief Locks the program or data EEPROM memory + * @param FLASH_MemType : Memory type + * This parameter can be a value of @ref FLASH_MemType_TypeDef + * @retval None + */ +void FLASH_Lock(FLASH_MemType_TypeDef FLASH_MemType) +{ + /* Check parameter */ + assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType)); + + /* Lock memory */ + FLASH->IAPSR &= (uint8_t)FLASH_MemType; +} + +/** + * @brief DeInitializes the FLASH registers to their default reset values. + * @param None + * @retval None + */ +void FLASH_DeInit(void) +{ + FLASH->CR1 = FLASH_CR1_RESET_VALUE; + FLASH->CR2 = FLASH_CR2_RESET_VALUE; + FLASH->NCR2 = FLASH_NCR2_RESET_VALUE; + FLASH->IAPSR &= (uint8_t)(~FLASH_IAPSR_DUL); + FLASH->IAPSR &= (uint8_t)(~FLASH_IAPSR_PUL); + (void) FLASH->IAPSR; /* Reading of this register causes the clearing of status flags */ +} + +/** + * @brief Enables or Disables the Flash interrupt mode + * @param NewState : The new state of the flash interrupt mode + * This parameter can be a value of @ref FunctionalState enumeration. + * @retval None + */ +void FLASH_ITConfig(FunctionalState NewState) +{ + /* Check parameter */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if(NewState != DISABLE) + { + FLASH->CR1 |= FLASH_CR1_IE; /* Enables the interrupt sources */ + } + else + { + FLASH->CR1 &= (uint8_t)(~FLASH_CR1_IE); /* Disables the interrupt sources */ + } +} + +/** + * @brief Erases one byte in the program or data EEPROM memory + * @note PointerAttr define is declared in the stm8s.h file to select if + * the pointer will be declared as near (2 bytes) or far (3 bytes). + * @param Address : Address of the byte to erase + * @retval None + */ +void FLASH_EraseByte(uint32_t Address) +{ + /* Check parameter */ + assert_param(IS_FLASH_ADDRESS_OK(Address)); + + /* Erase byte */ + *(PointerAttr uint8_t*) (MemoryAddressCast)Address = FLASH_CLEAR_BYTE; +} + +/** + * @brief Programs one byte in program or data EEPROM memory + * @note PointerAttr define is declared in the stm8s.h file to select if + * the pointer will be declared as near (2 bytes) or far (3 bytes). + * @param Address : Address where the byte will be programmed + * @param Data : Value to be programmed + * @retval None + */ +void FLASH_ProgramByte(uint32_t Address, uint8_t Data) +{ + /* Check parameters */ + assert_param(IS_FLASH_ADDRESS_OK(Address)); + *(PointerAttr uint8_t*) (MemoryAddressCast)Address = Data; +} + +/** + * @brief Reads any byte from flash memory + * @note PointerAttr define is declared in the stm8s.h file to select if + * the pointer will be declared as near (2 bytes) or far (3 bytes). + * @param Address : Address to read + * @retval Value of the byte + */ +uint8_t FLASH_ReadByte(uint32_t Address) +{ + /* Check parameter */ + assert_param(IS_FLASH_ADDRESS_OK(Address)); + + /* Read byte */ + return(*(PointerAttr uint8_t *) (MemoryAddressCast)Address); +} + +/** + * @brief Programs one word (4 bytes) in program or data EEPROM memory + * @note PointerAttr define is declared in the stm8s.h file to select if + * the pointer will be declared as near (2 bytes) or far (3 bytes). + * @param Address : The address where the data will be programmed + * @param Data : Value to be programmed + * @retval None + */ +void FLASH_ProgramWord(uint32_t Address, uint32_t Data) +{ + /* Check parameters */ + assert_param(IS_FLASH_ADDRESS_OK(Address)); + + /* Enable Word Write Once */ + FLASH->CR2 |= FLASH_CR2_WPRG; + FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NWPRG); + + /* Write one byte - from lowest address*/ + *((PointerAttr uint8_t*)(MemoryAddressCast)Address) = *((uint8_t*)(&Data)); + /* Write one byte*/ + *(((PointerAttr uint8_t*)(MemoryAddressCast)Address) + 1) = *((uint8_t*)(&Data)+1); + /* Write one byte*/ + *(((PointerAttr uint8_t*)(MemoryAddressCast)Address) + 2) = *((uint8_t*)(&Data)+2); + /* Write one byte - from higher address*/ + *(((PointerAttr uint8_t*)(MemoryAddressCast)Address) + 3) = *((uint8_t*)(&Data)+3); +} + +/** + * @brief Programs option byte + * @param Address : option byte address to program + * @param Data : Value to write + * @retval None + */ +void FLASH_ProgramOptionByte(uint16_t Address, uint8_t Data) +{ + /* Check parameter */ + assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address)); + + /* Enable write access to option bytes */ + FLASH->CR2 |= FLASH_CR2_OPT; + FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NOPT); + + /* check if the option byte to program is ROP*/ + if(Address == 0x4800) + { + /* Program option byte*/ + *((NEAR uint8_t*)Address) = Data; + } + else + { + /* Program option byte and his complement */ + *((NEAR uint8_t*)Address) = Data; + *((NEAR uint8_t*)((uint16_t)(Address + 1))) = (uint8_t)(~Data); + } + FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG); + + /* Disable write access to option bytes */ + FLASH->CR2 &= (uint8_t)(~FLASH_CR2_OPT); + FLASH->NCR2 |= FLASH_NCR2_NOPT; +} + +/** + * @brief Erases option byte + * @param Address : Option byte address to erase + * @retval None + */ +void FLASH_EraseOptionByte(uint16_t Address) +{ + /* Check parameter */ + assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address)); + + /* Enable write access to option bytes */ + FLASH->CR2 |= FLASH_CR2_OPT; + FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NOPT); + + /* check if the option byte to erase is ROP */ + if(Address == 0x4800) + { + /* Erase option byte */ + *((NEAR uint8_t*)Address) = FLASH_CLEAR_BYTE; + } + else + { + /* Erase option byte and his complement */ + *((NEAR uint8_t*)Address) = FLASH_CLEAR_BYTE; + *((NEAR uint8_t*)((uint16_t)(Address + (uint16_t)1 ))) = FLASH_SET_BYTE; + } + FLASH_WaitForLastOperation(FLASH_MEMTYPE_PROG); + + /* Disable write access to option bytes */ + FLASH->CR2 &= (uint8_t)(~FLASH_CR2_OPT); + FLASH->NCR2 |= FLASH_NCR2_NOPT; +} + +/** + * @brief Reads one option byte + * @param Address option byte address to read. + * @retval Option byte read value + its complement + */ +uint16_t FLASH_ReadOptionByte(uint16_t Address) +{ + uint8_t value_optbyte, value_optbyte_complement = 0; + uint16_t res_value = 0; + + /* Check parameter */ + assert_param(IS_OPTION_BYTE_ADDRESS_OK(Address)); + + value_optbyte = *((NEAR uint8_t*)Address); /* Read option byte */ + value_optbyte_complement = *(((NEAR uint8_t*)Address) + 1); /* Read option byte complement */ + + /* Read-out protection option byte */ + if(Address == 0x4800) + { + res_value = value_optbyte; + } + else + { + if(value_optbyte == (uint8_t)(~value_optbyte_complement)) + { + res_value = (uint16_t)((uint16_t)value_optbyte << 8); + res_value = res_value | (uint16_t)value_optbyte_complement; + } + else + { + res_value = FLASH_OPTIONBYTE_ERROR; + } + } + return(res_value); +} + +/** + * @brief Select the Flash behaviour in low power mode + * @param FLASH_LPMode Low power mode selection + * This parameter can be any of the @ref FLASH_LPMode_TypeDef values. + * @retval None + */ +void FLASH_SetLowPowerMode(FLASH_LPMode_TypeDef FLASH_LPMode) +{ + /* Check parameter */ + assert_param(IS_FLASH_LOW_POWER_MODE_OK(FLASH_LPMode)); + + /* Clears the two bits */ + FLASH->CR1 &= (uint8_t)(~(FLASH_CR1_HALT | FLASH_CR1_AHALT)); + + /* Sets the new mode */ + FLASH->CR1 |= (uint8_t)FLASH_LPMode; +} + +/** + * @brief Sets the fixed programming time + * @param FLASH_ProgTime Indicates the programming time to be fixed + * This parameter can be any of the @ref FLASH_ProgramTime_TypeDef values. + * @retval None + */ +void FLASH_SetProgrammingTime(FLASH_ProgramTime_TypeDef FLASH_ProgTime) +{ + /* Check parameter */ + assert_param(IS_FLASH_PROGRAM_TIME_OK(FLASH_ProgTime)); + + FLASH->CR1 &= (uint8_t)(~FLASH_CR1_FIX); + FLASH->CR1 |= (uint8_t)FLASH_ProgTime; +} + +/** + * @brief Returns the Flash behaviour type in low power mode + * @param None + * @retval FLASH_LPMode_TypeDef Flash behaviour type in low power mode + */ +FLASH_LPMode_TypeDef FLASH_GetLowPowerMode(void) +{ + return((FLASH_LPMode_TypeDef)(FLASH->CR1 & (uint8_t)(FLASH_CR1_HALT | FLASH_CR1_AHALT))); +} + +/** + * @brief Returns the fixed programming time + * @param None + * @retval FLASH_ProgramTime_TypeDef Fixed programming time value + */ +FLASH_ProgramTime_TypeDef FLASH_GetProgrammingTime(void) +{ + return((FLASH_ProgramTime_TypeDef)(FLASH->CR1 & FLASH_CR1_FIX)); +} + +/** + * @brief Returns the Boot memory size in bytes + * @param None + * @retval Boot memory size in bytes + */ +uint32_t FLASH_GetBootSize(void) +{ + uint32_t temp = 0; + + /* Calculates the number of bytes */ + temp = (uint32_t)((uint32_t)FLASH->FPR * (uint32_t)512); + + /* Correction because size of 127.5 kb doesn't exist */ + if(FLASH->FPR == 0xFF) + { + temp += 512; + } + + /* Return value */ + return(temp); +} + +/** + * @brief Checks whether the specified SPI flag is set or not. + * @param FLASH_FLAG : Specifies the flag to check. + * This parameter can be any of the @ref FLASH_Flag_TypeDef enumeration. + * @retval FlagStatus : Indicates the state of FLASH_FLAG. + * This parameter can be any of the @ref FlagStatus enumeration. + * @note This function can clear the EOP, WR_PG_DIS flags in the IAPSR register. + */ +FlagStatus FLASH_GetFlagStatus(FLASH_Flag_TypeDef FLASH_FLAG) +{ + FlagStatus status = RESET; + /* Check parameters */ + assert_param(IS_FLASH_FLAGS_OK(FLASH_FLAG)); + + /* Check the status of the specified FLASH flag */ + if((FLASH->IAPSR & (uint8_t)FLASH_FLAG) != (uint8_t)RESET) + { + status = SET; /* FLASH_FLAG is set */ + } + else + { + status = RESET; /* FLASH_FLAG is reset*/ + } + + /* Return the FLASH_FLAG status */ + return status; +} + +/** +@code + All the functions defined below must be executed from RAM exclusively, except + for the FLASH_WaitForLastOperation function which can be executed from Flash. + + Steps of the execution from RAM differs from one toolchain to another: + - For Cosmic Compiler: + 1- Define a segment FLASH_CODE by the mean of " #pragma section (FLASH_CODE)". + This segment is defined in the stm8s_flash.c file. + 2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8s.h file, + or define it in Cosmic compiler preprocessor to enable the FLASH_CODE segment + definition. + 3- In STVD Select Project\Settings\Linker\Category "input" and in the RAM section + add the FLASH_CODE segment with "-ic" options. + 4- In main.c file call the _fctcpy() function with first segment character as + parameter "_fctcpy('F');" to load the declared moveable code segment + (FLASH_CODE) in RAM before execution. + 5- By default the _fctcpy function is packaged in the Cosmic machine library, + so the function prototype "int _fctcopy(char name);" must be added in main.c + file. + + - For Raisonance Compiler + 1- Use the inram keyword in the function declaration to specify that it can be + executed from RAM. + This is done within the stm8s_flash.c file, and it's conditioned by + RAM_EXECUTION definition. + 2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8s.h file, or + define it in Raisonance compiler preprocessor to enable the access for the + inram functions. + 3- An inram function code is copied from Flash to RAM by the C startup code. + In some applications, the RAM area where the code was initially stored may be + erased or corrupted, so it may be desirable to perform the copy again. + Depending on the application memory model, the memcpy() or fmemcpy() functions + should be used to perform the copy. + • In case your project uses the SMALL memory model (code smaller than 64K), + memcpy()function is recommended to perform the copy + • In case your project uses the LARGE memory model, functions can be + everywhere in the 24-bits address space (not limited to the first 64KB of + code), In this case, the use of memcpy() function will not be appropriate, + you need to use the specific fmemcpy() function (which copies objects with + 24-bit addresses). + - The linker automatically defines 2 symbols for each inram function: + • __address__functionname is a symbol that holds the Flash address + where the given function code is stored. + • __size__functionname is a symbol that holds the function size in bytes. + And we already have the function address (which is itself a pointer) + 4- In main.c file these two steps should be performed for each inram function: + • Import the "__address__functionname" and "__size__functionname" symbols + as global variables: + extern int __address__functionname; // Symbol holding the flash address + extern int __size__functionname; // Symbol holding the function size + • In case of SMALL memory model use, Call the memcpy() function to copy the + inram function to the RAM destination address: + memcpy(functionname, // RAM destination address + (void*)&__address__functionname, // Flash source address + (int)&__size__functionname); // Code size of the function + • In case of LARGE memory model use, call the fmemcpy() function to copy + the inram function to the RAM destination address: + memcpy(functionname, // RAM destination address + (void @far*)&__address__functionname, // Flash source address + (int)&__size__functionname); // Code size of the function + + - For IAR Compiler: + 1- Use the __ramfunc keyword in the function declaration to specify that it + can be executed from RAM. + This is done within the stm8s_flash.c file, and it's conditioned by + RAM_EXECUTION definition. + 2- Uncomment the "#define RAM_EXECUTION (1)" line in the stm8s.h file, or + define it in IAR compiler preprocessor to enable the access for the + __ramfunc functions. + + - Note: + 1- Ignore the IAR compiler warnings, these warnings don't impact the FLASH Program/Erase + operations. + The code performing the Flash Program/erase must be executed from RAM; the variables + initializations don't necessary require the execution from RAM, only CR2/NCR2 registers + configuration and data programing must be executed from RAM. + 2- These warnings depends on IAR compiler: as the code generation is made using many + runtime library functions to keep code size to a minimum. + 3- It is recommended to use High Speed Optimization with IAR (-Ohs), in order + to reduce the runtime library calls in the generated code. + + + + The FLASH examples given within the STM8S_StdPeriph_Lib package, details all + the steps described above. + +@endcode +*/ + +/** + * @brief + ******************************************************************************* + * Execution from RAM enable + ******************************************************************************* + * + * To enable execution from RAM you can either uncomment the following define + * in the stm8s.h file or define it in your toolchain compiler preprocessor + * - #define RAM_EXECUTION (1) + */ + +#if defined (_COSMIC_) && defined (RAM_EXECUTION) + #pragma section (FLASH_CODE) +#endif /* _COSMIC_ && RAM_EXECUTION */ +/** + * @brief Wait for a Flash operation to complete. + * @note The call and execution of this function must be done from RAM in case + * of Block operation. + * @param FLASH_MemType : Memory type + * This parameter can be a value of @ref FLASH_MemType_TypeDef + * @retval FLASH status + */ +IN_RAM(FLASH_Status_TypeDef FLASH_WaitForLastOperation(FLASH_MemType_TypeDef FLASH_MemType)) +{ + uint8_t flagstatus = 0x00; + uint16_t timeout = OPERATION_TIMEOUT; + + /* Wait until operation completion or write protection page occurred */ +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ + defined(STM8S005) || defined(STM8AF52Ax) || defined(STM8AF62Ax) || defined(STM8AF626x) + if(FLASH_MemType == FLASH_MEMTYPE_PROG) + { + while((flagstatus == 0x00) && (timeout != 0x00)) + { + flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_EOP | + FLASH_IAPSR_WR_PG_DIS)); + timeout--; + } + } + else + { + while((flagstatus == 0x00) && (timeout != 0x00)) + { + flagstatus = (uint8_t)(FLASH->IAPSR & (uint8_t)(FLASH_IAPSR_HVOFF | + FLASH_IAPSR_WR_PG_DIS)); + timeout--; + } + } +#else /*STM8S103, STM8S903, STM8AF622x */ + while((flagstatus == 0x00) && (timeout != 0x00)) + { + flagstatus = (uint8_t)(FLASH->IAPSR & (FLASH_IAPSR_EOP | FLASH_IAPSR_WR_PG_DIS)); + timeout--; + } +#endif /* STM8S208, STM8S207, STM8S105, STM8AF52Ax, STM8AF62Ax, STM8AF262x */ + + if(timeout == 0x00 ) + { + flagstatus = FLASH_STATUS_TIMEOUT; + } + + return((FLASH_Status_TypeDef)flagstatus); +} + +/** + * @brief Erases a block in the program or data memory. + * @note This function should be executed from RAM. + * @param FLASH_MemType : The type of memory to erase + * @param BlockNum : Indicates the block number to erase + * @retval None. + */ +IN_RAM(void FLASH_EraseBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType)) +{ + uint32_t startaddress = 0; + +#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ + defined (STM8S903) || defined (STM8AF626x) || defined (STM8AF622x) + uint32_t PointerAttr *pwFlash; +#elif defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || defined (STM8AF52Ax) + uint8_t PointerAttr *pwFlash; +#endif + + /* Check parameters */ + assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType)); + if(FLASH_MemType == FLASH_MEMTYPE_PROG) + { + assert_param(IS_FLASH_PROG_BLOCK_NUMBER_OK(BlockNum)); + startaddress = FLASH_PROG_START_PHYSICAL_ADDRESS; + } + else + { + assert_param(IS_FLASH_DATA_BLOCK_NUMBER_OK(BlockNum)); + startaddress = FLASH_DATA_START_PHYSICAL_ADDRESS; + } + + /* Point to the first block address */ +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || defined (STM8AF52Ax) + pwFlash = (PointerAttr uint8_t *)(MemoryAddressCast)(startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE)); +#elif defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ + defined (STM8S903) || defined (STM8AF626x) || defined (STM8AF622x) + pwFlash = (PointerAttr uint32_t *)(MemoryAddressCast)(startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE)); +#endif /* STM8S208, STM8S207 */ + + /* Enable erase block mode */ + FLASH->CR2 |= FLASH_CR2_ERASE; + FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NERASE); + +#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ + defined (STM8S903) || defined (STM8AF626x) || defined (STM8AF622x) + *pwFlash = (uint32_t)0; +#elif defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF62Ax) || \ + defined (STM8AF52Ax) + *pwFlash = (uint8_t)0; + *(pwFlash + 1) = (uint8_t)0; + *(pwFlash + 2) = (uint8_t)0; + *(pwFlash + 3) = (uint8_t)0; +#endif +} + +/** + * @brief Programs a memory block + * @note This function should be executed from RAM. + * @param FLASH_MemType : The type of memory to program + * @param BlockNum : The block number + * @param FLASH_ProgMode : The programming mode. + * @param Buffer : Pointer to buffer containing source data. + * @retval None. + */ +IN_RAM(void FLASH_ProgramBlock(uint16_t BlockNum, FLASH_MemType_TypeDef FLASH_MemType, + FLASH_ProgramMode_TypeDef FLASH_ProgMode, uint8_t *Buffer)) +{ + uint16_t Count = 0; + uint32_t startaddress = 0; + + /* Check parameters */ + assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType)); + assert_param(IS_FLASH_PROGRAM_MODE_OK(FLASH_ProgMode)); + if(FLASH_MemType == FLASH_MEMTYPE_PROG) + { + assert_param(IS_FLASH_PROG_BLOCK_NUMBER_OK(BlockNum)); + startaddress = FLASH_PROG_START_PHYSICAL_ADDRESS; + } + else + { + assert_param(IS_FLASH_DATA_BLOCK_NUMBER_OK(BlockNum)); + startaddress = FLASH_DATA_START_PHYSICAL_ADDRESS; + } + + /* Point to the first block address */ + startaddress = startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_SIZE); + + /* Selection of Standard or Fast programming mode */ + if(FLASH_ProgMode == FLASH_PROGRAMMODE_STANDARD) + { + /* Standard programming mode */ /*No need in standard mode */ + FLASH->CR2 |= FLASH_CR2_PRG; + FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NPRG); + } + else + { + /* Fast programming mode */ + FLASH->CR2 |= FLASH_CR2_FPRG; + FLASH->NCR2 &= (uint8_t)(~FLASH_NCR2_NFPRG); + } + + /* Copy data bytes from RAM to FLASH memory */ + for(Count = 0; Count < FLASH_BLOCK_SIZE; Count++) + { + *((PointerAttr uint8_t*) (MemoryAddressCast)startaddress + Count) = ((uint8_t)(Buffer[Count])); + } +} + +#if defined (_COSMIC_) && defined (RAM_EXECUTION) + /* End of FLASH_CODE section */ + #pragma section () +#endif /* _COSMIC_ && RAM_EXECUTION */ + + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_gpio.c b/4_EXT_INT_1PORT/lib/src/stm8s_gpio.c new file mode 100644 index 0000000..956ffb0 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_gpio.c @@ -0,0 +1,249 @@ +/** + ****************************************************************************** + * @file stm8s_gpio.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the GPIO peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_gpio.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/* Public functions ----------------------------------------------------------*/ + +/** + * @addtogroup GPIO_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the GPIOx peripheral registers to their default reset values. + * @param GPIOx: Select the GPIO peripheral number (x = A to I). + * @retval None + */ +void GPIO_DeInit(GPIO_TypeDef* GPIOx) +{ + GPIOx->ODR = GPIO_ODR_RESET_VALUE; /* Reset Output Data Register */ + GPIOx->DDR = GPIO_DDR_RESET_VALUE; /* Reset Data Direction Register */ + GPIOx->CR1 = GPIO_CR1_RESET_VALUE; /* Reset Control Register 1 */ + GPIOx->CR2 = GPIO_CR2_RESET_VALUE; /* Reset Control Register 2 */ +} + +/** + * @brief Initializes the GPIOx according to the specified parameters. + * @param GPIOx : Select the GPIO peripheral number (x = A to I). + * @param GPIO_Pin : This parameter contains the pin number, it can be any value + * of the @ref GPIO_Pin_TypeDef enumeration. + * @param GPIO_Mode : This parameter can be a value of the + * @Ref GPIO_Mode_TypeDef enumeration. + * @retval None + */ + +void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode) +{ + /*----------------------*/ + /* Check the parameters */ + /*----------------------*/ + + assert_param(IS_GPIO_MODE_OK(GPIO_Mode)); + assert_param(IS_GPIO_PIN_OK(GPIO_Pin)); + + /* Reset corresponding bit to GPIO_Pin in CR2 register */ + GPIOx->CR2 &= (uint8_t)(~(GPIO_Pin)); + + /*-----------------------------*/ + /* Input/Output mode selection */ + /*-----------------------------*/ + + if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x80) != (uint8_t)0x00) /* Output mode */ + { + if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x10) != (uint8_t)0x00) /* High level */ + { + GPIOx->ODR |= (uint8_t)GPIO_Pin; + } + else /* Low level */ + { + GPIOx->ODR &= (uint8_t)(~(GPIO_Pin)); + } + /* Set Output mode */ + GPIOx->DDR |= (uint8_t)GPIO_Pin; + } + else /* Input mode */ + { + /* Set Input mode */ + GPIOx->DDR &= (uint8_t)(~(GPIO_Pin)); + } + + /*------------------------------------------------------------------------*/ + /* Pull-Up/Float (Input) or Push-Pull/Open-Drain (Output) modes selection */ + /*------------------------------------------------------------------------*/ + + if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x40) != (uint8_t)0x00) /* Pull-Up or Push-Pull */ + { + GPIOx->CR1 |= (uint8_t)GPIO_Pin; + } + else /* Float or Open-Drain */ + { + GPIOx->CR1 &= (uint8_t)(~(GPIO_Pin)); + } + + /*-----------------------------------------------------*/ + /* Interrupt (Input) or Slope (Output) modes selection */ + /*-----------------------------------------------------*/ + + if ((((uint8_t)(GPIO_Mode)) & (uint8_t)0x20) != (uint8_t)0x00) /* Interrupt or Slow slope */ + { + GPIOx->CR2 |= (uint8_t)GPIO_Pin; + } + else /* No external interrupt or No slope control */ + { + GPIOx->CR2 &= (uint8_t)(~(GPIO_Pin)); + } +} + +/** + * @brief Writes data to the specified GPIO data port. + * @note The port must be configured in output mode. + * @param GPIOx : Select the GPIO peripheral number (x = A to I). + * @param GPIO_PortVal : Specifies the value to be written to the port output + * data register. + * @retval None + */ +void GPIO_Write(GPIO_TypeDef* GPIOx, uint8_t PortVal) +{ + GPIOx->ODR = PortVal; +} + +/** + * @brief Writes high level to the specified GPIO pins. + * @note The port must be configured in output mode. + * @param GPIOx : Select the GPIO peripheral number (x = A to I). + * @param PortPins : Specifies the pins to be turned high to the port output. + * data register. + * @retval None + */ +void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) +{ + GPIOx->ODR |= (uint8_t)PortPins; +} + +/** + * @brief Writes low level to the specified GPIO pins. + * @note The port must be configured in output mode. + * @param GPIOx : Select the GPIO peripheral number (x = A to I). + * @param PortPins : Specifies the pins to be turned low to the port output. + * data register. + * @retval None + */ +void GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) +{ + GPIOx->ODR &= (uint8_t)(~PortPins); +} + +/** + * @brief Writes reverse level to the specified GPIO pins. + * @note The port must be configured in output mode. + * @param GPIOx : Select the GPIO peripheral number (x = A to I). + * @param PortPins : Specifies the pins to be reversed to the port output. + * data register. + * @retval None + */ +void GPIO_WriteReverse(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins) +{ + GPIOx->ODR ^= (uint8_t)PortPins; +} + +/** + * @brief Reads the specified GPIO output data port. + * @note The port must be configured in input mode. + * @param GPIOx : Select the GPIO peripheral number (x = A to I). + * @retval GPIO output data port value. + */ +uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx) +{ + return ((uint8_t)GPIOx->ODR); +} + +/** + * @brief Reads the specified GPIO input data port. + * @note The port must be configured in input mode. + * @param GPIOx : Select the GPIO peripheral number (x = A to I). + * @retval GPIO input data port value. + */ +uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx) +{ + return ((uint8_t)GPIOx->IDR); +} + +/** + * @brief Reads the specified GPIO input data pin. + * @param GPIOx : Select the GPIO peripheral number (x = A to I). + * @param GPIO_Pin : Specifies the pin number. + * @retval BitStatus : GPIO input pin status. + */ +BitStatus GPIO_ReadInputPin(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin) +{ + return ((BitStatus)(GPIOx->IDR & (uint8_t)GPIO_Pin)); +} + +/** + * @brief Configures the external pull-up on GPIOx pins. + * @param GPIOx : Select the GPIO peripheral number (x = A to I). + * @param GPIO_Pin : Specifies the pin number + * @param NewState : The new state of the pull up pin. + * @retval None + */ +void GPIO_ExternalPullUpConfig(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_GPIO_PIN_OK(GPIO_Pin)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) /* External Pull-Up Set*/ + { + GPIOx->CR1 |= (uint8_t)GPIO_Pin; + } else /* External Pull-Up Reset*/ + { + GPIOx->CR1 &= (uint8_t)(~(GPIO_Pin)); + } +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_i2c.c b/4_EXT_INT_1PORT/lib/src/stm8s_i2c.c new file mode 100644 index 0000000..07c8d05 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_i2c.c @@ -0,0 +1,893 @@ +/** + ****************************************************************************** + * @file stm8s_i2c.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the I2C peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_i2c.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ + +/** @defgroup I2C_Private_Defines + * @{ + */ +/* I2C register mask */ +#define REGISTER_Mask ((uint16_t)0x3000) +#define REGISTER_SR1_Index ((uint16_t)0x0100) +#define REGISTER_SR2_Index ((uint16_t)0x0200) +/* I2C Interrupt Enable mask */ +#define ITEN_Mask ((uint16_t)0x0700) +/* I2C FLAG mask */ +#define FLAG_Mask ((uint16_t)0x00FF) +/** + * @} + */ + +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + + +/** + * @addtogroup I2C_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the I2C peripheral registers to their default reset values. + * @param None + * @retval None + */ +void I2C_DeInit(void) +{ + I2C->CR1 = I2C_CR1_RESET_VALUE; + I2C->CR2 = I2C_CR2_RESET_VALUE; + I2C->FREQR = I2C_FREQR_RESET_VALUE; + I2C->OARL = I2C_OARL_RESET_VALUE; + I2C->OARH = I2C_OARH_RESET_VALUE; + I2C->ITR = I2C_ITR_RESET_VALUE; + I2C->CCRL = I2C_CCRL_RESET_VALUE; + I2C->CCRH = I2C_CCRH_RESET_VALUE; + I2C->TRISER = I2C_TRISER_RESET_VALUE; +} + +/** + * @brief Initializes the I2C according to the specified parameters in standard + * or fast mode. + * @param OutputClockFrequencyHz : Specifies the output clock frequency in Hz. + * @param OwnAddress : Specifies the own address. + * @param I2C_DutyCycle : Specifies the duty cycle to apply in fast mode. + * This parameter can be any of the @ref I2C_DutyCycle_TypeDef enumeration. + * @note This parameter don't have impact when the OutputClockFrequency lower + * than 100KHz. + * @param Ack : Specifies the acknowledge mode to apply. + * This parameter can be any of the @ref I2C_Ack_TypeDef enumeration. + * @param AddMode : Specifies the acknowledge address to apply. + * This parameter can be any of the @ref I2C_AddMode_TypeDef enumeration. + * @param InputClockFrequencyMHz : Specifies the input clock frequency in MHz. + * @retval None + */ +void I2C_Init(uint32_t OutputClockFrequencyHz, uint16_t OwnAddress, + I2C_DutyCycle_TypeDef I2C_DutyCycle, I2C_Ack_TypeDef Ack, + I2C_AddMode_TypeDef AddMode, uint8_t InputClockFrequencyMHz ) +{ + uint16_t result = 0x0004; + uint16_t tmpval = 0; + uint8_t tmpccrh = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ACK_OK(Ack)); + assert_param(IS_I2C_ADDMODE_OK(AddMode)); + assert_param(IS_I2C_OWN_ADDRESS_OK(OwnAddress)); + assert_param(IS_I2C_DUTYCYCLE_OK(I2C_DutyCycle)); + assert_param(IS_I2C_INPUT_CLOCK_FREQ_OK(InputClockFrequencyMHz)); + assert_param(IS_I2C_OUTPUT_CLOCK_FREQ_OK(OutputClockFrequencyHz)); + + + /*------------------------- I2C FREQ Configuration ------------------------*/ + /* Clear frequency bits */ + I2C->FREQR &= (uint8_t)(~I2C_FREQR_FREQ); + /* Write new value */ + I2C->FREQR |= InputClockFrequencyMHz; + + /*--------------------------- I2C CCR Configuration ------------------------*/ + /* Disable I2C to configure TRISER */ + I2C->CR1 &= (uint8_t)(~I2C_CR1_PE); + + /* Clear CCRH & CCRL */ + I2C->CCRH &= (uint8_t)(~(I2C_CCRH_FS | I2C_CCRH_DUTY | I2C_CCRH_CCR)); + I2C->CCRL &= (uint8_t)(~I2C_CCRL_CCR); + + /* Detect Fast or Standard mode depending on the Output clock frequency selected */ + if (OutputClockFrequencyHz > I2C_MAX_STANDARD_FREQ) /* FAST MODE */ + { + /* Set F/S bit for fast mode */ + tmpccrh = I2C_CCRH_FS; + + if (I2C_DutyCycle == I2C_DUTYCYCLE_2) + { + /* Fast mode speed calculate: Tlow/Thigh = 2 */ + result = (uint16_t) ((InputClockFrequencyMHz * 1000000) / (OutputClockFrequencyHz * 3)); + } + else /* I2C_DUTYCYCLE_16_9 */ + { + /* Fast mode speed calculate: Tlow/Thigh = 16/9 */ + result = (uint16_t) ((InputClockFrequencyMHz * 1000000) / (OutputClockFrequencyHz * 25)); + /* Set DUTY bit */ + tmpccrh |= I2C_CCRH_DUTY; + } + + /* Verify and correct CCR value if below minimum value */ + if (result < (uint16_t)0x01) + { + /* Set the minimum allowed value */ + result = (uint16_t)0x0001; + } + + /* Set Maximum Rise Time: 300ns max in Fast Mode + = [300ns/(1/InputClockFrequencyMHz.10e6)]+1 + = [(InputClockFrequencyMHz * 3)/10]+1 */ + tmpval = ((InputClockFrequencyMHz * 3) / 10) + 1; + I2C->TRISER = (uint8_t)tmpval; + + } + else /* STANDARD MODE */ + { + + /* Calculate standard mode speed */ + result = (uint16_t)((InputClockFrequencyMHz * 1000000) / (OutputClockFrequencyHz << (uint8_t)1)); + + /* Verify and correct CCR value if below minimum value */ + if (result < (uint16_t)0x0004) + { + /* Set the minimum allowed value */ + result = (uint16_t)0x0004; + } + + /* Set Maximum Rise Time: 1000ns max in Standard Mode + = [1000ns/(1/InputClockFrequencyMHz.10e6)]+1 + = InputClockFrequencyMHz+1 */ + I2C->TRISER = (uint8_t)(InputClockFrequencyMHz + (uint8_t)1); + + } + + /* Write CCR with new calculated value */ + I2C->CCRL = (uint8_t)result; + I2C->CCRH = (uint8_t)((uint8_t)((uint8_t)(result >> 8) & I2C_CCRH_CCR) | tmpccrh); + + /* Enable I2C */ + I2C->CR1 |= I2C_CR1_PE; + + /* Configure I2C acknowledgement */ + I2C_AcknowledgeConfig(Ack); + + /*--------------------------- I2C OAR Configuration ------------------------*/ + I2C->OARL = (uint8_t)(OwnAddress); + I2C->OARH = (uint8_t)((uint8_t)(AddMode | I2C_OARH_ADDCONF) | + (uint8_t)((OwnAddress & (uint16_t)0x0300) >> (uint8_t)7)); +} + +/** + * @brief Enables or disables the I2C peripheral. + * @param NewState : Indicate the new I2C peripheral state. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void I2C_Cmd(FunctionalState NewState) +{ + /* Check function parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable I2C peripheral */ + I2C->CR1 |= I2C_CR1_PE; + } + else /* NewState == DISABLE */ + { + /* Disable I2C peripheral */ + I2C->CR1 &= (uint8_t)(~I2C_CR1_PE); + } +} + +/** + * @brief Enables or disables the I2C General Call feature. + * @param NewState : State of the General Call feature. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void I2C_GeneralCallCmd(FunctionalState NewState) +{ + /* Check function parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable General Call */ + I2C->CR1 |= I2C_CR1_ENGC; + } + else /* NewState == DISABLE */ + { + /* Disable General Call */ + I2C->CR1 &= (uint8_t)(~I2C_CR1_ENGC); + } +} + +/** + * @brief Generates I2C communication START condition. + * @note CCR must be programmed, i.e. I2C_Init function must have been called + * with a valid I2C_ClockSpeed + * @param NewState : Enable or disable the start condition. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void I2C_GenerateSTART(FunctionalState NewState) +{ + /* Check function parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Generate a START condition */ + I2C->CR2 |= I2C_CR2_START; + } + else /* NewState == DISABLE */ + { + /* Disable the START condition generation */ + I2C->CR2 &= (uint8_t)(~I2C_CR2_START); + } +} + +/** + * @brief Generates I2C communication STOP condition. + * @param NewState : Enable or disable the stop condition. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void I2C_GenerateSTOP(FunctionalState NewState) +{ + /* Check function parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Generate a STOP condition */ + I2C->CR2 |= I2C_CR2_STOP; + } + else /* NewState == DISABLE */ + { + /* Disable the STOP condition generation */ + I2C->CR2 &= (uint8_t)(~I2C_CR2_STOP); + } +} + +/** + * @brief Enables or disables I2C software reset. + * @param NewState : Specifies the new state of the I2C software reset. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void I2C_SoftwareResetCmd(FunctionalState NewState) +{ + /* Check function parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Peripheral under reset */ + I2C->CR2 |= I2C_CR2_SWRST; + } + else /* NewState == DISABLE */ + { + /* Peripheral not under reset */ + I2C->CR2 &= (uint8_t)(~I2C_CR2_SWRST); + } +} + +/** + * @brief Enables or disables the I2C clock stretching. + * @param NewState : Specifies the new state of the I2C Clock stretching. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ + +void I2C_StretchClockCmd(FunctionalState NewState) +{ + /* Check function parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Clock Stretching Enable */ + I2C->CR1 &= (uint8_t)(~I2C_CR1_NOSTRETCH); + + } + else /* NewState == DISABLE */ + { + /* Clock Stretching Disable (Slave mode) */ + I2C->CR1 |= I2C_CR1_NOSTRETCH; + } +} + +/** + * @brief Enable or Disable the I2C acknowledge and position acknowledge feature. + * @note This function must be called before data reception start + * @param Ack : Specifies the acknowledge mode to apply. + * This parameter can be any of the @ref I2C_Ack_TypeDef enumeration. + * @retval None + */ +void I2C_AcknowledgeConfig(I2C_Ack_TypeDef Ack) +{ + /* Check function parameters */ + assert_param(IS_I2C_ACK_OK(Ack)); + + if (Ack == I2C_ACK_NONE) + { + /* Disable the acknowledgement */ + I2C->CR2 &= (uint8_t)(~I2C_CR2_ACK); + } + else + { + /* Enable the acknowledgement */ + I2C->CR2 |= I2C_CR2_ACK; + + if (Ack == I2C_ACK_CURR) + { + /* Configure (N)ACK on current byte */ + I2C->CR2 &= (uint8_t)(~I2C_CR2_POS); + } + else + { + /* Configure (N)ACK on next byte */ + I2C->CR2 |= I2C_CR2_POS; + } + } +} + +/** + * @brief Enables or disables the specified I2C interrupt. + * @param ITName : Name of the interrupt to enable or disable. + * This parameter can be any of the @ref I2C_IT_TypeDef enumeration. + * @param NewState : State of the interrupt to apply. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void I2C_ITConfig(I2C_IT_TypeDef I2C_IT, FunctionalState NewState) +{ + /* Check functions parameters */ + assert_param(IS_I2C_INTERRUPT_OK(I2C_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected I2C interrupts */ + I2C->ITR |= (uint8_t)I2C_IT; + } + else /* NewState == DISABLE */ + { + /* Disable the selected I2C interrupts */ + I2C->ITR &= (uint8_t)(~(uint8_t)I2C_IT); + } +} + +/** + * @brief Selects the specified I2C fast mode duty cycle. + * @param I2C_DutyCycle : Specifies the duty cycle to apply. + * This parameter can be any of the @ref I2C_DutyCycle_TypeDef enumeration. + * @retval None + */ +void I2C_FastModeDutyCycleConfig(I2C_DutyCycle_TypeDef I2C_DutyCycle) +{ + /* Check function parameters */ + assert_param(IS_I2C_DUTYCYCLE_OK(I2C_DutyCycle)); + + if (I2C_DutyCycle == I2C_DUTYCYCLE_16_9) + { + /* I2C fast mode Tlow/Thigh = 16/9 */ + I2C->CCRH |= I2C_CCRH_DUTY; + } + else /* I2C_DUTYCYCLE_2 */ + { + /* I2C fast mode Tlow/Thigh = 2 */ + I2C->CCRH &= (uint8_t)(~I2C_CCRH_DUTY); + } +} + +/** + * @brief Returns the most recent received data. + * @param None + * @retval uint8_t : The value of the received byte data. + */ +uint8_t I2C_ReceiveData(void) +{ + /* Return the data present in the DR register */ + return ((uint8_t)I2C->DR); +} + +/** + * @brief Transmits the 7-bit address (to select the) slave device. + * @param Address : Specifies the slave address which will be transmitted. + * @param Direction : Specifies whether the I2C device will be a Transmitter or a Receiver. + * This parameter can be any of the @ref I2C_Direction_TypeDef enumeration. + * @retval None + */ +void I2C_Send7bitAddress(uint8_t Address, I2C_Direction_TypeDef Direction) +{ + /* Check function parameters */ + assert_param(IS_I2C_ADDRESS_OK(Address)); + assert_param(IS_I2C_DIRECTION_OK(Direction)); + + /* Clear bit0 (direction) just in case */ + Address &= (uint8_t)0xFE; + + /* Send the Address + Direction */ + I2C->DR = (uint8_t)(Address | (uint8_t)Direction); +} + +/** + * @brief Send a byte by writing in the DR register. + * @param Data : Byte to be sent. + * @retval None + */ +void I2C_SendData(uint8_t Data) +{ + /* Write in the DR register the data to be sent */ + I2C->DR = Data; +} + +/** + * @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, SR2 and SR3) 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 + * (RM0016). + * - 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). + * - I2C_IRQHandler() which is called when the I2C interrupts occur. + * - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into the + * I2C_IRQHandler() function in order to determine which error occurred. + * - 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 SR1 + * & SR3 status registers in a single word (uint16_t) (Status Register 3 value + * is shifted left by 8 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 (stm8s_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. + * + * For detailed description of Events, please refer to section I2C_Events in + * stm8s_i2c.h file. + * + */ +/** + * + * 1) Basic state monitoring + ******************************************************************************* + */ + +/** + * @brief Checks whether the last I2C Event is equal to the one passed + * as parameter. + * @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_GENERALCALLADDRESS_MATCHED : EV1 + * @arg I2C_EVENT_SLAVE_BYTE_RECEIVED : 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_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 stm8s_i2c.h file. + * + * @retval An ErrorStatus enumeration value: + * - SUCCESS: Last event is equal to the I2C_EVENT + * - ERROR: Last event is different from the I2C_EVENT + */ +ErrorStatus I2C_CheckEvent(I2C_Event_TypeDef I2C_Event) +{ + __IO uint16_t lastevent = 0x00; + uint8_t flag1 = 0x00 ; + uint8_t flag2 = 0x00; + ErrorStatus status = ERROR; + + /* Check the parameters */ + assert_param(IS_I2C_EVENT_OK(I2C_Event)); + + if (I2C_Event == I2C_EVENT_SLAVE_ACK_FAILURE) + { + lastevent = I2C->SR2 & I2C_SR2_AF; + } + else + { + flag1 = I2C->SR1; + flag2 = I2C->SR3; + lastevent = ((uint16_t)((uint16_t)flag2 << (uint16_t)8) | (uint16_t)flag1); + } + /* Check whether the last event is equal to I2C_EVENT */ + if (((uint16_t)lastevent & (uint16_t)I2C_Event) == (uint16_t)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 I2C Event. + * + * @note: For detailed description of Events, please refer to section + * I2C_Events in stm8s_i2c.h file. + * + * @retval The last event + * This parameter can be any of the @ref I2C_Event_TypeDef enumeration. + */ +I2C_Event_TypeDef I2C_GetLastEvent(void) +{ + __IO uint16_t lastevent = 0; + uint16_t flag1 = 0; + uint16_t flag2 = 0; + + if ((I2C->SR2 & I2C_SR2_AF) != 0x00) + { + lastevent = I2C_EVENT_SLAVE_ACK_FAILURE; + } + else + { + /* Read the I2C status register */ + flag1 = I2C->SR1; + flag2 = I2C->SR3; + + /* Get the last event value from I2C status register */ + lastevent = ((uint16_t)((uint16_t)flag2 << 8) | (uint16_t)flag1); + } + /* Return status */ + return (I2C_Event_TypeDef)lastevent; +} + +/** + * + * 3) Flag-based state monitoring + ******************************************************************************* + */ +/** + * @brief Checks whether the specified I2C flag is set or not. + * @param I2C_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg I2C_FLAG_GENERALCALL: General call header flag (Slave mode) + * @arg I2C_FLAG_TRANSMITTERRECEIVER: Transmitter/Receiver flag + * @arg I2C_FLAG_BUSBUSY: Bus busy flag + * @arg I2C_FLAG_MASTERSLAVE: Master/Slave flag + * @arg I2C_FLAG_WAKEUPFROMHALT: Wake up from HALT flag + * @arg I2C_FLAG_OVERRUNUNDERRUN: Overrun/Underrun flag (Slave mode) + * @arg I2C_FLAG_ACKNOWLEDGEFAILURE: Acknowledge failure flag + * @arg I2C_FLAG_ARBITRATIONLOSS: Arbitration lost flag (Master mode) + * @arg I2C_FLAG_BUSERROR: Bus error flag + * @arg I2C_FLAG_TXEMPTY: Data register empty flag (Transmitter) + * @arg I2C_FLAG_RXNOTEMPTY: Data register not empty (Receiver) flag + * @arg I2C_FLAG_STOPDETECTION: Stop detection flag (Slave mode) + * @arg I2C_FLAG_HEADERSENT: 10-bit header sent flag (Master mode) + * @arg I2C_FLAG_TRANSFERFINISHED: Byte transfer finished flag + * @arg I2C_FLAG_ADDRESSSENTMATCHED: Address sent flag (Master mode) “ADSL” + * Address matched flag (Slave mode)”ENDAD” + * @arg I2C_FLAG_STARTDETECTION: Start bit flag (Master mode) + * @retval The new state of I2C_FLAG (SET or RESET). + */ +FlagStatus I2C_GetFlagStatus(I2C_Flag_TypeDef I2C_Flag) +{ + uint8_t tempreg = 0; + uint8_t regindex = 0; + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_I2C_FLAG_OK(I2C_Flag)); + + /* Read flag register index */ + regindex = (uint8_t)((uint16_t)I2C_Flag >> 8); + /* Check SRx index */ + switch (regindex) + { + /* Returns whether the status register to check is SR1 */ + case 0x01: + tempreg = (uint8_t)I2C->SR1; + break; + + /* Returns whether the status register to check is SR2 */ + case 0x02: + tempreg = (uint8_t)I2C->SR2; + break; + + /* Returns whether the status register to check is SR3 */ + case 0x03: + tempreg = (uint8_t)I2C->SR3; + break; + + default: + break; + } + + /* Check the status of the specified I2C flag */ + if ((tempreg & (uint8_t)I2C_Flag ) != 0) + { + /* Flag is set */ + bitstatus = SET; + } + else + { + /* Flag is reset */ + bitstatus = RESET; + } + /* Return the flag status */ + return bitstatus; +} + +/** + * @brief Clear flags + * @param I2C_Flag : Specifies the flag to clear + * This parameter can be any combination of the following values: + * - I2C_FLAG_WAKEUPFROMHALT: Wakeup from Halt + * - I2C_FLAG_OVERRUNUNDERRUN: Overrun/Underrun flag (Slave mode) + * - I2C_FLAG_ACKNOWLEDGEFAILURE: Acknowledge failure flag + * - I2C_FLAG_ARBITRATIONLOSS: Arbitration lost flag (Master mode) + * - I2C_FLAG_BUSERROR: Bus error flag. + * @note Notes: + * - STOPF (STOP detection) is cleared by software + * sequence: a read operation to I2C_SR1 register + * (I2C_GetFlagStatus()) followed by a write operation + * to I2C_CR2 register. + * - 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_SR3 register ((void)(I2C->SR3)). + * - 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_Flag_TypeDef I2C_FLAG) +{ + uint16_t flagpos = 0; + /* Check the parameters */ + assert_param(IS_I2C_CLEAR_FLAG_OK(I2C_FLAG)); + + /* Get the I2C flag position */ + flagpos = (uint16_t)I2C_FLAG & FLAG_Mask; + /* Clear the selected I2C flag */ + I2C->SR2 = (uint8_t)((uint16_t)(~flagpos)); +} + +/** + * @brief Checks whether the specified I2C interrupt has occurred or not. + * @param I2C_ITPendingBit: specifies the interrupt source to check. + * This parameter can be one of the following values: + * - I2C_ITPENDINGBIT_WAKEUPFROMHALT: Wakeup from Halt + * - I2C_ITPENDINGBIT_OVERRUNUNDERRUN: Overrun/Underrun flag (Slave mode) + * - I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE: Acknowledge failure flag + * - I2C_ITPENDINGBIT_ARBITRATIONLOSS: Arbitration lost flag (Master mode) + * - I2C_ITPENDINGBIT_BUSERROR: Bus error flag + * - I2C_ITPENDINGBIT_TXEMPTY: Data register empty flag (Transmitter) + * - I2C_ITPENDINGBIT_RXNOTEMPTY: Data register not empty (Receiver) flag + * - I2C_ITPENDINGBIT_STOPDETECTION: Stop detection flag (Slave mode) + * - I2C_ITPENDINGBIT_HEADERSENT: 10-bit header sent flag (Master mode) + * - I2C_ITPENDINGBIT_TRANSFERFINISHED: Byte transfer finished flag + * - I2C_ITPENDINGBIT_ADDRESSSENTMATCHED: Address sent flag (Master mode) “ADSL” + * Address matched flag (Slave mode)“ENDAD” + * - I2C_ITPENDINGBIT_STARTDETECTION: Start bit flag (Master mode) + * @retval The new state of I2C_ITPendingBit + * This parameter can be any of the @ref ITStatus enumeration. + */ +ITStatus I2C_GetITStatus(I2C_ITPendingBit_TypeDef I2C_ITPendingBit) +{ + ITStatus bitstatus = RESET; + __IO uint8_t enablestatus = 0; + uint16_t tempregister = 0; + + /* Check the parameters */ + assert_param(IS_I2C_ITPENDINGBIT_OK(I2C_ITPendingBit)); + + tempregister = (uint8_t)( ((uint16_t)((uint16_t)I2C_ITPendingBit & ITEN_Mask)) >> 8); + + /* Check if the interrupt source is enabled or not */ + enablestatus = (uint8_t)(I2C->ITR & ( uint8_t)tempregister); + + if ((uint16_t)((uint16_t)I2C_ITPendingBit & REGISTER_Mask) == REGISTER_SR1_Index) + { + /* Check the status of the specified I2C flag */ + if (((I2C->SR1 & (uint8_t)I2C_ITPendingBit) != RESET) && enablestatus) + { + /* I2C_IT is set */ + bitstatus = SET; + } + else + { + /* I2C_IT is reset */ + bitstatus = RESET; + } + } + else + { + /* Check the status of the specified I2C flag */ + if (((I2C->SR2 & (uint8_t)I2C_ITPendingBit) != RESET) && enablestatus) + { + /* I2C_IT is set */ + bitstatus = SET; + } + else + { + /* I2C_IT is reset */ + bitstatus = RESET; + } + } + /* Return the I2C_IT status */ + return bitstatus; +} + +/** + * @brief Clear IT pending bit + * @param I2C_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * - I2C_ITPENDINGBIT_WAKEUPFROMHALT: Wakeup from Halt + * - I2C_ITPENDINGBIT_OVERRUNUNDERRUN: Overrun/Underrun interrupt (Slave mode) + * - I2C_ITPENDINGBIT_ACKNOWLEDGEFAILURE: Acknowledge failure interrupt + * - I2C_ITPENDINGBIT_ARBITRATIONLOSS: Arbitration lost interrupt (Master mode) + * - I2C_ITPENDINGBIT_BUSERROR: Bus error interrupt + * + * Notes: + * - STOPF (STOP detection) is cleared by software + * sequence: a read operation to I2C_SR1 register + * (I2C_GetITStatus()) followed by a write operation to + * I2C_CR2 register (I2C_AcknowledgeConfig() to configure + * the I2C peripheral Acknowledge). + * - 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_SR3 register + * ((void)(I2C->SR3)). + * - 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_ITPendingBit_TypeDef I2C_ITPendingBit) +{ + uint16_t flagpos = 0; + + /* Check the parameters */ + assert_param(IS_I2C_CLEAR_ITPENDINGBIT_OK(I2C_ITPendingBit)); + + /* Get the I2C flag position */ + flagpos = (uint16_t)I2C_ITPendingBit & FLAG_Mask; + + /* Clear the selected I2C flag */ + I2C->SR2 = (uint8_t)((uint16_t)~flagpos); +} + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_itc.c b/4_EXT_INT_1PORT/lib/src/stm8s_itc.c new file mode 100644 index 0000000..91f8310 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_itc.c @@ -0,0 +1,343 @@ +/** + ****************************************************************************** + * @file stm8s_itc.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the ITC peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_itc.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @addtogroup ITC_Private_Functions + * @{ + */ + +/** + * @brief Utility function used to read CC register. + * @param None + * @retval CPU CC register value + */ +uint8_t ITC_GetCPUCC(void) +{ +#ifdef _COSMIC_ + _asm("push cc"); + _asm("pop a"); + return; /* Ignore compiler warning, the returned value is in A register */ +#elif defined _RAISONANCE_ /* _RAISONANCE_ */ + return _getCC_(); +#else /* _IAR_ */ + asm("push cc"); + asm("pop a"); /* Ignore compiler warning, the returned value is in A register */ +#endif /* _COSMIC_*/ +} + + +/** + * @} + */ + +/* Public functions ----------------------------------------------------------*/ + +/** @addtogroup ITC_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the ITC registers to their default reset value. + * @param None + * @retval None + */ +void ITC_DeInit(void) +{ + ITC->ISPR1 = ITC_SPRX_RESET_VALUE; + ITC->ISPR2 = ITC_SPRX_RESET_VALUE; + ITC->ISPR3 = ITC_SPRX_RESET_VALUE; + ITC->ISPR4 = ITC_SPRX_RESET_VALUE; + ITC->ISPR5 = ITC_SPRX_RESET_VALUE; + ITC->ISPR6 = ITC_SPRX_RESET_VALUE; + ITC->ISPR7 = ITC_SPRX_RESET_VALUE; + ITC->ISPR8 = ITC_SPRX_RESET_VALUE; +} + +/** + * @brief Gets the interrupt software priority bits (I1, I0) value from CPU CC register. + * @param None + * @retval The interrupt software priority bits value. + */ +uint8_t ITC_GetSoftIntStatus(void) +{ + return (uint8_t)(ITC_GetCPUCC() & CPU_CC_I1I0); +} + +/** + * @brief Gets the software priority of the specified interrupt source. + * @param IrqNum : Specifies the peripheral interrupt source. + * @retval ITC_PriorityLevel_TypeDef : Specifies the software priority of the interrupt source. + */ +ITC_PriorityLevel_TypeDef ITC_GetSoftwarePriority(ITC_Irq_TypeDef IrqNum) +{ + uint8_t Value = 0; + uint8_t Mask = 0; + + /* Check function parameters */ + assert_param(IS_ITC_IRQ_OK((uint8_t)IrqNum)); + + /* Define the mask corresponding to the bits position in the SPR register */ + Mask = (uint8_t)(0x03U << (((uint8_t)IrqNum % 4U) * 2U)); + + switch (IrqNum) + { + case ITC_IRQ_TLI: /* TLI software priority can be read but has no meaning */ + case ITC_IRQ_AWU: + case ITC_IRQ_CLK: + case ITC_IRQ_PORTA: + Value = (uint8_t)(ITC->ISPR1 & Mask); /* Read software priority */ + break; + + case ITC_IRQ_PORTB: + case ITC_IRQ_PORTC: + case ITC_IRQ_PORTD: + case ITC_IRQ_PORTE: + Value = (uint8_t)(ITC->ISPR2 & Mask); /* Read software priority */ + break; + +#if defined(STM8S208) || defined(STM8AF52Ax) + case ITC_IRQ_CAN_RX: + case ITC_IRQ_CAN_TX: +#endif /*STM8S208 or STM8AF52Ax */ +#if defined(STM8S903) || defined(STM8AF622x) + case ITC_IRQ_PORTF: +#endif /*STM8S903 or STM8AF622x */ + case ITC_IRQ_SPI: + case ITC_IRQ_TIM1_OVF: + Value = (uint8_t)(ITC->ISPR3 & Mask); /* Read software priority */ + break; + + case ITC_IRQ_TIM1_CAPCOM: +#if defined (STM8S903) || defined (STM8AF622x) + case ITC_IRQ_TIM5_OVFTRI: + case ITC_IRQ_TIM5_CAPCOM: +#else + case ITC_IRQ_TIM2_OVF: + case ITC_IRQ_TIM2_CAPCOM: +#endif /* STM8S903 or STM8AF622x*/ + case ITC_IRQ_TIM3_OVF: + Value = (uint8_t)(ITC->ISPR4 & Mask); /* Read software priority */ + break; + + case ITC_IRQ_TIM3_CAPCOM: +#if defined(STM8S208) ||defined(STM8S207) || defined (STM8S007) || defined(STM8S103) || \ + defined(STM8S003) ||defined(STM8S903) || defined (STM8AF52Ax) || defined (STM8AF62Ax) + case ITC_IRQ_UART1_TX: + case ITC_IRQ_UART1_RX: +#endif /*STM8S208 or STM8S207 or STM8S007 or STM8S103 or STM8S003 or STM8S903 or STM8AF52Ax or STM8AF62Ax */ +#if defined(STM8AF622x) + case ITC_IRQ_UART4_TX: + case ITC_IRQ_UART4_RX: +#endif /*STM8AF622x */ + case ITC_IRQ_I2C: + Value = (uint8_t)(ITC->ISPR5 & Mask); /* Read software priority */ + break; + +#if defined(STM8S105) || defined(STM8S005) || defined(STM8AF626x) + case ITC_IRQ_UART2_TX: + case ITC_IRQ_UART2_RX: +#endif /*STM8S105 or STM8AF626x*/ +#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8AF52Ax) || \ + defined(STM8AF62Ax) + case ITC_IRQ_UART3_TX: + case ITC_IRQ_UART3_RX: + case ITC_IRQ_ADC2: +#endif /*STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax */ +#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ + defined(STM8S903) || defined(STM8AF626x) || defined(STM8AF622x) + case ITC_IRQ_ADC1: +#endif /*STM8S105, STM8S005, STM8S103 or STM8S003 or STM8S903 or STM8AF626x or STM8AF622x */ +#if defined (STM8S903) || defined (STM8AF622x) + case ITC_IRQ_TIM6_OVFTRI: +#else + case ITC_IRQ_TIM4_OVF: +#endif /*STM8S903 or STM8AF622x */ + Value = (uint8_t)(ITC->ISPR6 & Mask); /* Read software priority */ + break; + + case ITC_IRQ_EEPROM_EEC: + Value = (uint8_t)(ITC->ISPR7 & Mask); /* Read software priority */ + break; + + default: + break; + } + + Value >>= (uint8_t)(((uint8_t)IrqNum % 4u) * 2u); + + return((ITC_PriorityLevel_TypeDef)Value); +} + +/** + * @brief Sets the software priority of the specified interrupt source. + * @note - The modification of the software priority is only possible when + * the interrupts are disabled. + * - The normal behavior is to disable the interrupt before calling + * this function, and re-enable it after. + * - The priority level 0 cannot be set (see product specification + * for more details). + * @param IrqNum : Specifies the peripheral interrupt source. + * @param PriorityValue : Specifies the software priority value to set, + * can be a value of @ref ITC_PriorityLevel_TypeDef . + * @retval None +*/ +void ITC_SetSoftwarePriority(ITC_Irq_TypeDef IrqNum, ITC_PriorityLevel_TypeDef PriorityValue) +{ + uint8_t Mask = 0; + uint8_t NewPriority = 0; + + /* Check function parameters */ + assert_param(IS_ITC_IRQ_OK((uint8_t)IrqNum)); + assert_param(IS_ITC_PRIORITY_OK(PriorityValue)); + + /* Check if interrupts are disabled */ + assert_param(IS_ITC_INTERRUPTS_DISABLED); + + /* Define the mask corresponding to the bits position in the SPR register */ + /* The mask is reversed in order to clear the 2 bits after more easily */ + Mask = (uint8_t)(~(uint8_t)(0x03U << (((uint8_t)IrqNum % 4U) * 2U))); + + /* Define the new priority to write */ + NewPriority = (uint8_t)((uint8_t)(PriorityValue) << (((uint8_t)IrqNum % 4U) * 2U)); + + switch (IrqNum) + { + case ITC_IRQ_TLI: /* TLI software priority can be written but has no meaning */ + case ITC_IRQ_AWU: + case ITC_IRQ_CLK: + case ITC_IRQ_PORTA: + ITC->ISPR1 &= Mask; + ITC->ISPR1 |= NewPriority; + break; + + case ITC_IRQ_PORTB: + case ITC_IRQ_PORTC: + case ITC_IRQ_PORTD: + case ITC_IRQ_PORTE: + ITC->ISPR2 &= Mask; + ITC->ISPR2 |= NewPriority; + break; + +#if defined(STM8S208) || defined(STM8AF52Ax) + case ITC_IRQ_CAN_RX: + case ITC_IRQ_CAN_TX: +#endif /*STM8S208 or STM8AF52Ax */ +#if defined(STM8S903) || defined(STM8AF622x) + case ITC_IRQ_PORTF: +#endif /*STM8S903 or STM8AF622x */ + case ITC_IRQ_SPI: + case ITC_IRQ_TIM1_OVF: + ITC->ISPR3 &= Mask; + ITC->ISPR3 |= NewPriority; + break; + + case ITC_IRQ_TIM1_CAPCOM: +#if defined(STM8S903) || defined(STM8AF622x) + case ITC_IRQ_TIM5_OVFTRI: + case ITC_IRQ_TIM5_CAPCOM: +#else + case ITC_IRQ_TIM2_OVF: + case ITC_IRQ_TIM2_CAPCOM: +#endif /*STM8S903 or STM8AF622x */ + case ITC_IRQ_TIM3_OVF: + ITC->ISPR4 &= Mask; + ITC->ISPR4 |= NewPriority; + break; + + case ITC_IRQ_TIM3_CAPCOM: +#if defined(STM8S208) ||defined(STM8S207) || defined (STM8S007) || defined(STM8S103) || \ + defined(STM8S003) ||defined(STM8S903) || defined (STM8AF52Ax) || defined (STM8AF62Ax) + case ITC_IRQ_UART1_TX: + case ITC_IRQ_UART1_RX: +#endif /*STM8S208 or STM8S207 or STM8S007 or STM8S103 or STM8S003 or STM8S903 or STM8AF52Ax or STM8AF62Ax */ +#if defined(STM8AF622x) + case ITC_IRQ_UART4_TX: + case ITC_IRQ_UART4_RX: +#endif /*STM8AF622x */ + case ITC_IRQ_I2C: + ITC->ISPR5 &= Mask; + ITC->ISPR5 |= NewPriority; + break; + +#if defined(STM8S105) || defined(STM8S005) || defined(STM8AF626x) + case ITC_IRQ_UART2_TX: + case ITC_IRQ_UART2_RX: +#endif /*STM8S105 or STM8AF626x */ + +#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8AF52Ax) || \ + defined(STM8AF62Ax) + case ITC_IRQ_UART3_TX: + case ITC_IRQ_UART3_RX: + case ITC_IRQ_ADC2: +#endif /*STM8S208 or STM8S207 or STM8AF52Ax or STM8AF62Ax */ + +#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) || \ + defined(STM8S903) || defined(STM8AF626x) || defined (STM8AF622x) + case ITC_IRQ_ADC1: +#endif /*STM8S105, STM8S005, STM8S103 or STM8S003 or STM8S903 or STM8AF626x or STM8AF622x */ + +#if defined (STM8S903) || defined (STM8AF622x) + case ITC_IRQ_TIM6_OVFTRI: +#else + case ITC_IRQ_TIM4_OVF: +#endif /* STM8S903 or STM8AF622x */ + ITC->ISPR6 &= Mask; + ITC->ISPR6 |= NewPriority; + break; + + case ITC_IRQ_EEPROM_EEC: + ITC->ISPR7 &= Mask; + ITC->ISPR7 |= NewPriority; + break; + + default: + break; + } +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_iwdg.c b/4_EXT_INT_1PORT/lib/src/stm8s_iwdg.c new file mode 100644 index 0000000..516e8ee --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_iwdg.c @@ -0,0 +1,113 @@ +/** + ******************************************************************************** + * @file stm8s_iwdg.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the IWDG peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_iwdg.h" + +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Public functions ----------------------------------------------------------*/ + +/** @addtogroup IWDG_Public_Functions + * @{ + */ + +/** + * @brief Enables or disables write access to Prescaler and Reload registers. + * @param IWDG_WriteAccess : New state of write access to Prescaler and Reload + * registers. This parameter can be a value of @ref IWDG_WriteAccess_TypeDef. + * @retval None + */ +void IWDG_WriteAccessCmd(IWDG_WriteAccess_TypeDef IWDG_WriteAccess) +{ + /* Check the parameters */ + assert_param(IS_IWDG_WRITEACCESS_MODE_OK(IWDG_WriteAccess)); + + IWDG->KR = (uint8_t)IWDG_WriteAccess; /* Write Access */ +} + +/** + * @brief Sets IWDG Prescaler value. + * @note Write access should be enabled + * @param IWDG_Prescaler : Specifies the IWDG Prescaler value. + * This parameter can be a value of @ref IWDG_Prescaler_TypeDef. + * @retval None + */ +void IWDG_SetPrescaler(IWDG_Prescaler_TypeDef IWDG_Prescaler) +{ + /* Check the parameters */ + assert_param(IS_IWDG_PRESCALER_OK(IWDG_Prescaler)); + + IWDG->PR = (uint8_t)IWDG_Prescaler; +} + +/** + * @brief Sets IWDG Reload value. + * @note Write access should be enabled + * @param IWDG_Reload : Reload register value. + * This parameter must be a number between 0 and 0xFF. + * @retval None + */ +void IWDG_SetReload(uint8_t IWDG_Reload) +{ + IWDG->RLR = IWDG_Reload; +} + +/** + * @brief Reloads IWDG counter + * @note Write access should be enabled + * @param None + * @retval None + */ +void IWDG_ReloadCounter(void) +{ + IWDG->KR = IWDG_KEY_REFRESH; +} + +/** + * @brief Enables IWDG. + * @param None + * @retval None + */ +void IWDG_Enable(void) +{ + IWDG->KR = IWDG_KEY_ENABLE; +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_rst.c b/4_EXT_INT_1PORT/lib/src/stm8s_rst.c new file mode 100644 index 0000000..4947a43 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_rst.c @@ -0,0 +1,86 @@ +/** + ****************************************************************************** + * @file stm8s_rst.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the RST peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#include "stm8s_rst.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private Constants ---------------------------------------------------------*/ +/* Public functions ----------------------------------------------------------*/ +/** + * @addtogroup RST_Public_Functions + * @{ + */ + + +/** + * @brief Checks whether the specified RST flag is set or not. + * @param RST_Flag : specify the reset flag to check. + * This parameter can be a value of @ref RST_FLAG_TypeDef. + * @retval FlagStatus: status of the given RST flag. + */ +FlagStatus RST_GetFlagStatus(RST_Flag_TypeDef RST_Flag) +{ + /* Check the parameters */ + assert_param(IS_RST_FLAG_OK(RST_Flag)); + + /* Get flag status */ + return((FlagStatus)(((uint8_t)(RST->SR & RST_Flag) == (uint8_t)0x00) ? RESET : SET)); +} + +/** + * @brief Clears the specified RST flag. + * @param RST_Flag : specify the reset flag to clear. + * This parameter can be a value of @ref RST_FLAG_TypeDef. + * @retval None + */ +void RST_ClearFlag(RST_Flag_TypeDef RST_Flag) +{ + /* Check the parameters */ + assert_param(IS_RST_FLAG_OK(RST_Flag)); + + RST->SR = (uint8_t)RST_Flag; +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_spi.c b/4_EXT_INT_1PORT/lib/src/stm8s_spi.c new file mode 100644 index 0000000..c004549 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_spi.c @@ -0,0 +1,435 @@ +/** + ****************************************************************************** + * @file stm8s_spi.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the SPI peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_spi.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @addtogroup SPI_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the SPI peripheral registers to their default reset values. + * @param None + * @retval None + */ +void SPI_DeInit(void) +{ + SPI->CR1 = SPI_CR1_RESET_VALUE; + SPI->CR2 = SPI_CR2_RESET_VALUE; + SPI->ICR = SPI_ICR_RESET_VALUE; + SPI->SR = SPI_SR_RESET_VALUE; + SPI->CRCPR = SPI_CRCPR_RESET_VALUE; +} + +/** + * @brief Initializes the SPI according to the specified parameters. + * @param FirstBit : This parameter can be any of the + * @ref SPI_FirstBit_TypeDef enumeration. + * @param BaudRatePrescaler : This parameter can be any of the + * @ref SPI_BaudRatePrescaler_TypeDef enumeration. + * @param Mode : This parameter can be any of the + * @ref SPI_Mode_TypeDef enumeration. + * @param ClockPolarity : This parameter can be any of the + * @ref SPI_ClockPolarity_TypeDef enumeration. + * @param ClockPhase : This parameter can be any of the + * @ref SPI_ClockPhase_TypeDef enumeration. + * @param Data_Direction : This parameter can be any of the + * @ref SPI_DataDirection_TypeDef enumeration. + * @param Slave_Management : This parameter can be any of the + * @ref SPI_NSS_TypeDef enumeration. + * @param CRCPolynomial : Configures the CRC polynomial. + * @retval None + */ +void SPI_Init(SPI_FirstBit_TypeDef FirstBit, SPI_BaudRatePrescaler_TypeDef BaudRatePrescaler, SPI_Mode_TypeDef Mode, SPI_ClockPolarity_TypeDef ClockPolarity, SPI_ClockPhase_TypeDef ClockPhase, SPI_DataDirection_TypeDef Data_Direction, SPI_NSS_TypeDef Slave_Management, uint8_t CRCPolynomial) +{ + /* Check structure elements */ + assert_param(IS_SPI_FIRSTBIT_OK(FirstBit)); + assert_param(IS_SPI_BAUDRATE_PRESCALER_OK(BaudRatePrescaler)); + assert_param(IS_SPI_MODE_OK(Mode)); + assert_param(IS_SPI_POLARITY_OK(ClockPolarity)); + assert_param(IS_SPI_PHASE_OK(ClockPhase)); + assert_param(IS_SPI_DATA_DIRECTION_OK(Data_Direction)); + assert_param(IS_SPI_SLAVEMANAGEMENT_OK(Slave_Management)); + assert_param(IS_SPI_CRC_POLYNOMIAL_OK(CRCPolynomial)); + + /* Frame Format, BaudRate, Clock Polarity and Phase configuration */ + SPI->CR1 = (uint8_t)((uint8_t)((uint8_t)FirstBit | BaudRatePrescaler) | + (uint8_t)((uint8_t)ClockPolarity | ClockPhase)); + + /* Data direction configuration: BDM, BDOE and RXONLY bits */ + SPI->CR2 = (uint8_t)((uint8_t)(Data_Direction) | (uint8_t)(Slave_Management)); + + if (Mode == SPI_MODE_MASTER) + { + SPI->CR2 |= (uint8_t)SPI_CR2_SSI; + } + else + { + SPI->CR2 &= (uint8_t)~(SPI_CR2_SSI); + } + + /* Master/Slave mode configuration */ + SPI->CR1 |= (uint8_t)(Mode); + + /* CRC configuration */ + SPI->CRCPR = (uint8_t)CRCPolynomial; +} + +/** + * @brief Enables or disables the SPI peripheral. + * @param NewState New state of the SPI peripheral. + * This parameter can be: ENABLE or DISABLE + * @retval None + */ +void SPI_Cmd(FunctionalState NewState) +{ + /* Check function parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + SPI->CR1 |= SPI_CR1_SPE; /* Enable the SPI peripheral*/ + } + else + { + SPI->CR1 &= (uint8_t)(~SPI_CR1_SPE); /* Disable the SPI peripheral*/ + } +} + +/** + * @brief Enables or disables the specified interrupts. + * @param SPI_IT Specifies the SPI interrupts sources to be enabled or disabled. + * @param NewState: The new state of the specified SPI interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_ITConfig(SPI_IT_TypeDef SPI_IT, FunctionalState NewState) +{ + uint8_t itpos = 0; + /* Check function parameters */ + assert_param(IS_SPI_CONFIG_IT_OK(SPI_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Get the SPI IT index */ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)SPI_IT & (uint8_t)0x0F)); + + if (NewState != DISABLE) + { + SPI->ICR |= itpos; /* Enable interrupt*/ + } + else + { + SPI->ICR &= (uint8_t)(~itpos); /* Disable interrupt*/ + } +} + +/** + * @brief Transmits a Data through the SPI peripheral. + * @param Data : Byte to be transmitted. + * @retval None + */ +void SPI_SendData(uint8_t Data) +{ + SPI->DR = Data; /* Write in the DR register the data to be sent*/ +} + +/** + * @brief Returns the most recent received data by the SPI peripheral. + * @param None + * @retval The value of the received data. + */ +uint8_t SPI_ReceiveData(void) +{ + return ((uint8_t)SPI->DR); /* Return the data in the DR register*/ +} + +/** + * @brief Configures internally by software the NSS pin. + * @param NewState Indicates the new state of the SPI Software slave management. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_NSSInternalSoftwareCmd(FunctionalState NewState) +{ + /* Check function parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + SPI->CR2 |= SPI_CR2_SSI; /* Set NSS pin internally by software*/ + } + else + { + SPI->CR2 &= (uint8_t)(~SPI_CR2_SSI); /* Reset NSS pin internally by software*/ + } +} + +/** + * @brief Enables the transmit of the CRC value. + * @param None + * @retval None + */ +void SPI_TransmitCRC(void) +{ + SPI->CR2 |= SPI_CR2_CRCNEXT; /* Enable the CRC transmission*/ +} + +/** + * @brief Enables or disables the CRC value calculation of the transferred bytes. + * @param NewState Indicates the new state of the SPI CRC value calculation. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void SPI_CalculateCRCCmd(FunctionalState NewState) +{ + /* Check function parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + SPI->CR2 |= SPI_CR2_CRCEN; /* Enable the CRC calculation*/ + } + else + { + SPI->CR2 &= (uint8_t)(~SPI_CR2_CRCEN); /* Disable the CRC calculation*/ + } +} + +/** + * @brief Returns the transmit or the receive CRC register value. + * @param SPI_CRC Specifies the CRC register to be read. + * @retval The selected CRC register value. + */ +uint8_t SPI_GetCRC(SPI_CRC_TypeDef SPI_CRC) +{ + uint8_t crcreg = 0; + + /* Check function parameters */ + assert_param(IS_SPI_CRC_OK(SPI_CRC)); + + if (SPI_CRC != SPI_CRC_RX) + { + crcreg = SPI->TXCRCR; /* Get the Tx CRC register*/ + } + else + { + crcreg = SPI->RXCRCR; /* Get the Rx CRC register*/ + } + + /* Return the selected CRC register status*/ + return crcreg; +} + +/** + * @brief Reset the Rx CRCR and Tx CRCR registers. + * @param None + * @retval None + */ +void SPI_ResetCRC(void) +{ + /* Rx CRCR & Tx CRCR registers are reset when CRCEN (hardware calculation) + bit in SPI_CR2 is written to 1 (enable) */ + SPI_CalculateCRCCmd(ENABLE); + + /* Previous function disable the SPI */ + SPI_Cmd(ENABLE); +} + +/** + * @brief Returns the CRC Polynomial register value. + * @param None + * @retval The CRC Polynomial register value. + */ +uint8_t SPI_GetCRCPolynomial(void) +{ + return SPI->CRCPR; /* Return the CRC polynomial register */ +} + +/** + * @brief Selects the data transfer direction in bi-directional mode. + * @param SPI_Direction Specifies the data transfer direction in bi-directional mode. + * @retval None + */ +void SPI_BiDirectionalLineConfig(SPI_Direction_TypeDef SPI_Direction) +{ + /* Check function parameters */ + assert_param(IS_SPI_DIRECTION_OK(SPI_Direction)); + + if (SPI_Direction != SPI_DIRECTION_RX) + { + SPI->CR2 |= SPI_CR2_BDOE; /* Set the Tx only mode*/ + } + else + { + SPI->CR2 &= (uint8_t)(~SPI_CR2_BDOE); /* Set the Rx only mode*/ + } +} + +/** + * @brief Checks whether the specified SPI flag is set or not. + * @param SPI_FLAG : Specifies the flag to check. + * This parameter can be any of the @ref SPI_FLAG_TypeDef enumeration. + * @retval FlagStatus : Indicates the state of SPI_FLAG. + * This parameter can be any of the @ref FlagStatus enumeration. + */ + +FlagStatus SPI_GetFlagStatus(SPI_Flag_TypeDef SPI_FLAG) +{ + FlagStatus status = RESET; + /* Check parameters */ + assert_param(IS_SPI_FLAGS_OK(SPI_FLAG)); + + /* Check the status of the specified SPI flag */ + if ((SPI->SR & (uint8_t)SPI_FLAG) != (uint8_t)RESET) + { + status = SET; /* SPI_FLAG is set */ + } + else + { + status = RESET; /* SPI_FLAG is reset*/ + } + + /* Return the SPI_FLAG status */ + return status; +} + +/** + * @brief Clears the SPI flags. + * @param SPI_FLAG : Specifies the flag to clear. + * This parameter can be one of the following values: + * - SPI_FLAG_CRCERR + * - SPI_FLAG_WKUP + * @note - OVR (OverRun Error) interrupt pending bit is cleared by software + * sequence: + * a read operation to SPI_DR register (SPI_ReceiveData()) followed by + * a read operation to SPI_SR register (SPI_GetFlagStatus()). + * - MODF (Mode Fault) interrupt pending bit is cleared by software sequence: + * a read/write operation to SPI_SR register (SPI_GetFlagStatus()) followed by + * a write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). + * @retval None + */ +void SPI_ClearFlag(SPI_Flag_TypeDef SPI_FLAG) +{ + assert_param(IS_SPI_CLEAR_FLAGS_OK(SPI_FLAG)); + /* Clear the flag bit */ + SPI->SR = (uint8_t)(~SPI_FLAG); +} + +/** + * @brief Checks whether the specified interrupt has occurred or not. + * @param SPI_IT: Specifies the SPI interrupt pending bit to check. + * This parameter can be one of the following values: + * - SPI_IT_CRCERR + * - SPI_IT_WKUP + * - SPI_IT_OVR + * - SPI_IT_MODF + * - SPI_IT_RXNE + * - SPI_IT_TXE + * @retval ITStatus : Indicates the state of the SPI_IT. + * This parameter can be any of the @ref ITStatus enumeration. + */ +ITStatus SPI_GetITStatus(SPI_IT_TypeDef SPI_IT) +{ + ITStatus pendingbitstatus = RESET; + uint8_t itpos = 0; + uint8_t itmask1 = 0; + uint8_t itmask2 = 0; + uint8_t enablestatus = 0; + assert_param(IS_SPI_GET_IT_OK(SPI_IT)); + /* Get the SPI IT index */ + itpos = (uint8_t)((uint8_t)1 << ((uint8_t)SPI_IT & (uint8_t)0x0F)); + + /* Get the SPI IT mask */ + itmask1 = (uint8_t)((uint8_t)SPI_IT >> (uint8_t)4); + /* Set the IT mask */ + itmask2 = (uint8_t)((uint8_t)1 << itmask1); + /* Get the SPI_ITPENDINGBIT enable bit status */ + enablestatus = (uint8_t)((uint8_t)SPI->SR & itmask2); + /* Check the status of the specified SPI interrupt */ + if (((SPI->ICR & itpos) != RESET) && enablestatus) + { + /* SPI_ITPENDINGBIT is set */ + pendingbitstatus = SET; + } + else + { + /* SPI_ITPENDINGBIT is reset */ + pendingbitstatus = RESET; + } + /* Return the SPI_ITPENDINGBIT status */ + return pendingbitstatus; +} + +/** + * @brief Clears the interrupt pending bits. + * @param SPI_IT: Specifies the interrupt pending bit to clear. + * This parameter can be one of the following values: + * - SPI_IT_CRCERR + * - SPI_IT_WKUP + * @note - OVR (OverRun Error) interrupt pending bit is cleared by software sequence: + * a read operation to SPI_DR register (SPI_ReceiveData()) followed by + * a read operation to SPI_SR register (SPI_GetITStatus()). + * - MODF (Mode Fault) interrupt pending bit is cleared by software sequence: + * a read/write operation to SPI_SR register (SPI_GetITStatus()) followed by + * a write operation to SPI_CR1 register (SPI_Cmd() to enable the SPI). + * @retval None + */ +void SPI_ClearITPendingBit(SPI_IT_TypeDef SPI_IT) +{ + uint8_t itpos = 0; + assert_param(IS_SPI_CLEAR_IT_OK(SPI_IT)); + + /* Clear SPI_IT_CRCERR or SPI_IT_WKUP interrupt pending bits */ + + /* Get the SPI pending bit index */ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)(SPI_IT & (uint8_t)0xF0) >> 4)); + /* Clear the pending bit */ + SPI->SR = (uint8_t)(~itpos); + +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_tim1.c b/4_EXT_INT_1PORT/lib/src/stm8s_tim1.c new file mode 100644 index 0000000..86826e0 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_tim1.c @@ -0,0 +1,2329 @@ +/** + ****************************************************************************** + * @file stm8s_tim1.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the TIM1 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_tim1.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TI1_Config(uint8_t TIM1_ICPolarity, uint8_t TIM1_ICSelection, + uint8_t TIM1_ICFilter); +static void TI2_Config(uint8_t TIM1_ICPolarity, uint8_t TIM1_ICSelection, + uint8_t TIM1_ICFilter); +static void TI3_Config(uint8_t TIM1_ICPolarity, uint8_t TIM1_ICSelection, + uint8_t TIM1_ICFilter); +static void TI4_Config(uint8_t TIM1_ICPolarity, uint8_t TIM1_ICSelection, + uint8_t TIM1_ICFilter); + +/** + * @addtogroup TIM1_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the TIM1 peripheral registers to their default reset values. + * @param None + * @retval None + */ +void TIM1_DeInit(void) +{ + TIM1->CR1 = TIM1_CR1_RESET_VALUE; + TIM1->CR2 = TIM1_CR2_RESET_VALUE; + TIM1->SMCR = TIM1_SMCR_RESET_VALUE; + TIM1->ETR = TIM1_ETR_RESET_VALUE; + TIM1->IER = TIM1_IER_RESET_VALUE; + TIM1->SR2 = TIM1_SR2_RESET_VALUE; + /* Disable channels */ + TIM1->CCER1 = TIM1_CCER1_RESET_VALUE; + TIM1->CCER2 = TIM1_CCER2_RESET_VALUE; + /* Configure channels as inputs: it is necessary if lock level is equal to 2 or 3 */ + TIM1->CCMR1 = 0x01; + TIM1->CCMR2 = 0x01; + TIM1->CCMR3 = 0x01; + TIM1->CCMR4 = 0x01; + /* Then reset channel registers: it also works if lock level is equal to 2 or 3 */ + TIM1->CCER1 = TIM1_CCER1_RESET_VALUE; + TIM1->CCER2 = TIM1_CCER2_RESET_VALUE; + TIM1->CCMR1 = TIM1_CCMR1_RESET_VALUE; + TIM1->CCMR2 = TIM1_CCMR2_RESET_VALUE; + TIM1->CCMR3 = TIM1_CCMR3_RESET_VALUE; + TIM1->CCMR4 = TIM1_CCMR4_RESET_VALUE; + TIM1->CNTRH = TIM1_CNTRH_RESET_VALUE; + TIM1->CNTRL = TIM1_CNTRL_RESET_VALUE; + TIM1->PSCRH = TIM1_PSCRH_RESET_VALUE; + TIM1->PSCRL = TIM1_PSCRL_RESET_VALUE; + TIM1->ARRH = TIM1_ARRH_RESET_VALUE; + TIM1->ARRL = TIM1_ARRL_RESET_VALUE; + TIM1->CCR1H = TIM1_CCR1H_RESET_VALUE; + TIM1->CCR1L = TIM1_CCR1L_RESET_VALUE; + TIM1->CCR2H = TIM1_CCR2H_RESET_VALUE; + TIM1->CCR2L = TIM1_CCR2L_RESET_VALUE; + TIM1->CCR3H = TIM1_CCR3H_RESET_VALUE; + TIM1->CCR3L = TIM1_CCR3L_RESET_VALUE; + TIM1->CCR4H = TIM1_CCR4H_RESET_VALUE; + TIM1->CCR4L = TIM1_CCR4L_RESET_VALUE; + TIM1->OISR = TIM1_OISR_RESET_VALUE; + TIM1->EGR = 0x01; /* TIM1_EGR_UG */ + TIM1->DTR = TIM1_DTR_RESET_VALUE; + TIM1->BKR = TIM1_BKR_RESET_VALUE; + TIM1->RCR = TIM1_RCR_RESET_VALUE; + TIM1->SR1 = TIM1_SR1_RESET_VALUE; +} + +/** + * @brief Initializes the TIM1 Time Base Unit according to the specified parameters. + * @param TIM1_Prescaler specifies the Prescaler value. + * @param TIM1_CounterMode specifies the counter mode from @ref TIM1_CounterMode_TypeDef . + * @param TIM1_Period specifies the Period value. + * @param TIM1_RepetitionCounter specifies the Repetition counter value + * @retval None + */ +void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler, + TIM1_CounterMode_TypeDef TIM1_CounterMode, + uint16_t TIM1_Period, + uint8_t TIM1_RepetitionCounter) +{ + /* Check parameters */ + assert_param(IS_TIM1_COUNTER_MODE_OK(TIM1_CounterMode)); + + /* Set the Autoreload value */ + TIM1->ARRH = (uint8_t)(TIM1_Period >> 8); + TIM1->ARRL = (uint8_t)(TIM1_Period); + + /* Set the Prescaler value */ + TIM1->PSCRH = (uint8_t)(TIM1_Prescaler >> 8); + TIM1->PSCRL = (uint8_t)(TIM1_Prescaler); + + /* Select the Counter Mode */ + TIM1->CR1 = (uint8_t)((uint8_t)(TIM1->CR1 & (uint8_t)(~(TIM1_CR1_CMS | TIM1_CR1_DIR))) + | (uint8_t)(TIM1_CounterMode)); + + /* Set the Repetition Counter value */ + TIM1->RCR = TIM1_RepetitionCounter; +} + +/** + * @brief Initializes the TIM1 Channel1 according to the specified parameters. + * @param TIM1_OCMode specifies the Output Compare mode from + * @ref TIM1_OCMode_TypeDef. + * @param TIM1_OutputState specifies the Output State from + * @ref TIM1_OutputState_TypeDef. + * @param TIM1_OutputNState specifies the Complementary Output State + * from @ref TIM1_OutputNState_TypeDef. + * @param TIM1_Pulse specifies the Pulse width value. + * @param TIM1_OCPolarity specifies the Output Compare Polarity from + * @ref TIM1_OCPolarity_TypeDef. + * @param TIM1_OCNPolarity specifies the Complementary Output Compare Polarity + * from @ref TIM1_OCNPolarity_TypeDef. + * @param TIM1_OCIdleState specifies the Output Compare Idle State from + * @ref TIM1_OCIdleState_TypeDef. + * @param TIM1_OCNIdleState specifies the Complementary Output Compare Idle + * State from @ref TIM1_OCIdleState_TypeDef. + * @retval None + */ +void TIM1_OC1Init(TIM1_OCMode_TypeDef TIM1_OCMode, + TIM1_OutputState_TypeDef TIM1_OutputState, + TIM1_OutputNState_TypeDef TIM1_OutputNState, + uint16_t TIM1_Pulse, + TIM1_OCPolarity_TypeDef TIM1_OCPolarity, + TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity, + TIM1_OCIdleState_TypeDef TIM1_OCIdleState, + TIM1_OCNIdleState_TypeDef TIM1_OCNIdleState) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OC_MODE_OK(TIM1_OCMode)); + assert_param(IS_TIM1_OUTPUT_STATE_OK(TIM1_OutputState)); + assert_param(IS_TIM1_OUTPUTN_STATE_OK(TIM1_OutputNState)); + assert_param(IS_TIM1_OC_POLARITY_OK(TIM1_OCPolarity)); + assert_param(IS_TIM1_OCN_POLARITY_OK(TIM1_OCNPolarity)); + assert_param(IS_TIM1_OCIDLE_STATE_OK(TIM1_OCIdleState)); + assert_param(IS_TIM1_OCNIDLE_STATE_OK(TIM1_OCNIdleState)); + + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , + the Output N State, the Output Polarity & the Output N Polarity*/ + TIM1->CCER1 &= (uint8_t)(~( TIM1_CCER1_CC1E | TIM1_CCER1_CC1NE + | TIM1_CCER1_CC1P | TIM1_CCER1_CC1NP)); + /* Set the Output State & Set the Output N State & Set the Output Polarity & + Set the Output N Polarity */ + TIM1->CCER1 |= (uint8_t)((uint8_t)((uint8_t)(TIM1_OutputState & TIM1_CCER1_CC1E) + | (uint8_t)(TIM1_OutputNState & TIM1_CCER1_CC1NE)) + | (uint8_t)( (uint8_t)(TIM1_OCPolarity & TIM1_CCER1_CC1P) + | (uint8_t)(TIM1_OCNPolarity & TIM1_CCER1_CC1NP))); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM1->CCMR1 = (uint8_t)((uint8_t)(TIM1->CCMR1 & (uint8_t)(~TIM1_CCMR_OCM)) | + (uint8_t)TIM1_OCMode); + + /* Reset the Output Idle state & the Output N Idle state bits */ + TIM1->OISR &= (uint8_t)(~(TIM1_OISR_OIS1 | TIM1_OISR_OIS1N)); + /* Set the Output Idle state & the Output N Idle state configuration */ + TIM1->OISR |= (uint8_t)((uint8_t)( TIM1_OCIdleState & TIM1_OISR_OIS1 ) | + (uint8_t)( TIM1_OCNIdleState & TIM1_OISR_OIS1N )); + + /* Set the Pulse value */ + TIM1->CCR1H = (uint8_t)(TIM1_Pulse >> 8); + TIM1->CCR1L = (uint8_t)(TIM1_Pulse); +} + +/** + * @brief Initializes the TIM1 Channel2 according to the specified parameters. + * @param TIM1_OCMode specifies the Output Compare mode from + * @ref TIM1_OCMode_TypeDef. + * @param TIM1_OutputState specifies the Output State from + * @ref TIM1_OutputState_TypeDef. + * @param TIM1_OutputNState specifies the Complementary Output State from + * @ref TIM1_OutputNState_TypeDef. + * @param TIM1_Pulse specifies the Pulse width value. + * @param TIM1_OCPolarity specifies the Output Compare Polarity from + * @ref TIM1_OCPolarity_TypeDef. + * @param TIM1_OCNPolarity specifies the Complementary Output Compare Polarity + * from @ref TIM1_OCNPolarity_TypeDef. + * @param TIM1_OCIdleState specifies the Output Compare Idle State from + * @ref TIM1_OCIdleState_TypeDef. + * @param TIM1_OCNIdleState specifies the Complementary Output Compare Idle + * State from @ref TIM1_OCIdleState_TypeDef. + * @retval None + */ +void TIM1_OC2Init(TIM1_OCMode_TypeDef TIM1_OCMode, + TIM1_OutputState_TypeDef TIM1_OutputState, + TIM1_OutputNState_TypeDef TIM1_OutputNState, + uint16_t TIM1_Pulse, + TIM1_OCPolarity_TypeDef TIM1_OCPolarity, + TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity, + TIM1_OCIdleState_TypeDef TIM1_OCIdleState, + TIM1_OCNIdleState_TypeDef TIM1_OCNIdleState) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OC_MODE_OK(TIM1_OCMode)); + assert_param(IS_TIM1_OUTPUT_STATE_OK(TIM1_OutputState)); + assert_param(IS_TIM1_OUTPUTN_STATE_OK(TIM1_OutputNState)); + assert_param(IS_TIM1_OC_POLARITY_OK(TIM1_OCPolarity)); + assert_param(IS_TIM1_OCN_POLARITY_OK(TIM1_OCNPolarity)); + assert_param(IS_TIM1_OCIDLE_STATE_OK(TIM1_OCIdleState)); + assert_param(IS_TIM1_OCNIDLE_STATE_OK(TIM1_OCNIdleState)); + + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , + the Output N State, the Output Polarity & the Output N Polarity*/ + TIM1->CCER1 &= (uint8_t)(~( TIM1_CCER1_CC2E | TIM1_CCER1_CC2NE | + TIM1_CCER1_CC2P | TIM1_CCER1_CC2NP)); + + /* Set the Output State & Set the Output N State & Set the Output Polarity & + Set the Output N Polarity */ + TIM1->CCER1 |= (uint8_t)((uint8_t)((uint8_t)(TIM1_OutputState & TIM1_CCER1_CC2E ) | + (uint8_t)(TIM1_OutputNState & TIM1_CCER1_CC2NE )) | + (uint8_t)((uint8_t)(TIM1_OCPolarity & TIM1_CCER1_CC2P ) | + (uint8_t)(TIM1_OCNPolarity & TIM1_CCER1_CC2NP ))); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM1->CCMR2 = (uint8_t)((uint8_t)(TIM1->CCMR2 & (uint8_t)(~TIM1_CCMR_OCM)) | + (uint8_t)TIM1_OCMode); + + /* Reset the Output Idle state & the Output N Idle state bits */ + TIM1->OISR &= (uint8_t)(~(TIM1_OISR_OIS2 | TIM1_OISR_OIS2N)); + /* Set the Output Idle state & the Output N Idle state configuration */ + TIM1->OISR |= (uint8_t)((uint8_t)(TIM1_OISR_OIS2 & TIM1_OCIdleState) | + (uint8_t)(TIM1_OISR_OIS2N & TIM1_OCNIdleState)); + + /* Set the Pulse value */ + TIM1->CCR2H = (uint8_t)(TIM1_Pulse >> 8); + TIM1->CCR2L = (uint8_t)(TIM1_Pulse); +} + +/** + * @brief Initializes the TIM1 Channel3 according to the specified parameters. + * @param TIM1_OCMode specifies the Output Compare mode from + * @ref TIM1_OCMode_TypeDef. + * @param TIM1_OutputState specifies the Output State + * from @ref TIM1_OutputState_TypeDef. + * @param TIM1_OutputNState specifies the Complementary Output State + * from @ref TIM1_OutputNState_TypeDef. + * @param TIM1_Pulse specifies the Pulse width value. + * @param TIM1_OCPolarity specifies the Output Compare Polarity from + * @ref TIM1_OCPolarity_TypeDef. + * @param TIM1_OCNPolarity specifies the Complementary Output Compare + * Polarity from @ref TIM1_OCNPolarity_TypeDef. + * @param TIM1_OCIdleState specifies the Output Compare Idle State + * from @ref TIM1_OCIdleState_TypeDef. + * @param TIM1_OCNIdleState specifies the Complementary Output Compare + * Idle State from @ref TIM1_OCIdleState_TypeDef. + * @retval None + */ +void TIM1_OC3Init(TIM1_OCMode_TypeDef TIM1_OCMode, + TIM1_OutputState_TypeDef TIM1_OutputState, + TIM1_OutputNState_TypeDef TIM1_OutputNState, + uint16_t TIM1_Pulse, + TIM1_OCPolarity_TypeDef TIM1_OCPolarity, + TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity, + TIM1_OCIdleState_TypeDef TIM1_OCIdleState, + TIM1_OCNIdleState_TypeDef TIM1_OCNIdleState) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OC_MODE_OK(TIM1_OCMode)); + assert_param(IS_TIM1_OUTPUT_STATE_OK(TIM1_OutputState)); + assert_param(IS_TIM1_OUTPUTN_STATE_OK(TIM1_OutputNState)); + assert_param(IS_TIM1_OC_POLARITY_OK(TIM1_OCPolarity)); + assert_param(IS_TIM1_OCN_POLARITY_OK(TIM1_OCNPolarity)); + assert_param(IS_TIM1_OCIDLE_STATE_OK(TIM1_OCIdleState)); + assert_param(IS_TIM1_OCNIDLE_STATE_OK(TIM1_OCNIdleState)); + + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , + the Output N State, the Output Polarity & the Output N Polarity*/ + TIM1->CCER2 &= (uint8_t)(~( TIM1_CCER2_CC3E | TIM1_CCER2_CC3NE | + TIM1_CCER2_CC3P | TIM1_CCER2_CC3NP)); + /* Set the Output State & Set the Output N State & Set the Output Polarity & + Set the Output N Polarity */ + TIM1->CCER2 |= (uint8_t)((uint8_t)((uint8_t)(TIM1_OutputState & TIM1_CCER2_CC3E ) | + (uint8_t)(TIM1_OutputNState & TIM1_CCER2_CC3NE )) | + (uint8_t)((uint8_t)(TIM1_OCPolarity & TIM1_CCER2_CC3P ) | + (uint8_t)(TIM1_OCNPolarity & TIM1_CCER2_CC3NP ))); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM1->CCMR3 = (uint8_t)((uint8_t)(TIM1->CCMR3 & (uint8_t)(~TIM1_CCMR_OCM)) | + (uint8_t)TIM1_OCMode); + + /* Reset the Output Idle state & the Output N Idle state bits */ + TIM1->OISR &= (uint8_t)(~(TIM1_OISR_OIS3 | TIM1_OISR_OIS3N)); + /* Set the Output Idle state & the Output N Idle state configuration */ + TIM1->OISR |= (uint8_t)((uint8_t)(TIM1_OISR_OIS3 & TIM1_OCIdleState) | + (uint8_t)(TIM1_OISR_OIS3N & TIM1_OCNIdleState)); + + /* Set the Pulse value */ + TIM1->CCR3H = (uint8_t)(TIM1_Pulse >> 8); + TIM1->CCR3L = (uint8_t)(TIM1_Pulse); +} + +/** + * @brief Initializes the TIM1 Channel4 according to the specified parameters. + * @param TIM1_OCMode specifies the Output Compare mode from + * @ref TIM1_OCMode_TypeDef. + * @param TIM1_OutputState specifies the Output State + * from @ref TIM1_OutputState_TypeDef. + * @param TIM1_Pulse specifies the Pulse width value. + * @param TIM1_OCPolarity specifies the Output Compare Polarity + * from @ref TIM1_OCPolarity_TypeDef. + * @param TIM1_OCIdleState specifies the Output Compare Idle State + * from @ref TIM1_OCIdleState_TypeDef. + * @retval None + */ +void TIM1_OC4Init(TIM1_OCMode_TypeDef TIM1_OCMode, + TIM1_OutputState_TypeDef TIM1_OutputState, + uint16_t TIM1_Pulse, + TIM1_OCPolarity_TypeDef TIM1_OCPolarity, + TIM1_OCIdleState_TypeDef TIM1_OCIdleState) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OC_MODE_OK(TIM1_OCMode)); + assert_param(IS_TIM1_OUTPUT_STATE_OK(TIM1_OutputState)); + assert_param(IS_TIM1_OC_POLARITY_OK(TIM1_OCPolarity)); + assert_param(IS_TIM1_OCIDLE_STATE_OK(TIM1_OCIdleState)); + + /* Disable the Channel 4: Reset the CCE Bit */ + TIM1->CCER2 &= (uint8_t)(~(TIM1_CCER2_CC4E | TIM1_CCER2_CC4P)); + /* Set the Output State & the Output Polarity */ + TIM1->CCER2 |= (uint8_t)((uint8_t)(TIM1_OutputState & TIM1_CCER2_CC4E ) | + (uint8_t)(TIM1_OCPolarity & TIM1_CCER2_CC4P )); + + /* Reset the Output Compare Bit and Set the Output Compare Mode */ + TIM1->CCMR4 = (uint8_t)((uint8_t)(TIM1->CCMR4 & (uint8_t)(~TIM1_CCMR_OCM)) | + TIM1_OCMode); + + /* Set the Output Idle state */ + if (TIM1_OCIdleState != TIM1_OCIDLESTATE_RESET) + { + TIM1->OISR |= (uint8_t)(~TIM1_CCER2_CC4P); + } + else + { + TIM1->OISR &= (uint8_t)(~TIM1_OISR_OIS4); + } + + /* Set the Pulse value */ + TIM1->CCR4H = (uint8_t)(TIM1_Pulse >> 8); + TIM1->CCR4L = (uint8_t)(TIM1_Pulse); +} + +/** + * @brief Configures the Break feature, dead time, Lock level, the OSSI, + * and the AOE(automatic output enable). + * @param TIM1_OSSIState specifies the OSSIS State from @ref TIM1_OSSIState_TypeDef. + * @param TIM1_LockLevel specifies the lock level from @ref TIM1_LockLevel_TypeDef. + * @param TIM1_DeadTime specifies the dead time value. + * @param TIM1_Break specifies the Break state @ref TIM1_BreakState_TypeDef. + * @param TIM1_BreakPolarity specifies the Break polarity from + * @ref TIM1_BreakPolarity_TypeDef. + * @param TIM1_AutomaticOutput specifies the Automatic Output configuration + * from @ref TIM1_AutomaticOutput_TypeDef. + * @retval None + */ +void TIM1_BDTRConfig(TIM1_OSSIState_TypeDef TIM1_OSSIState, + TIM1_LockLevel_TypeDef TIM1_LockLevel, + uint8_t TIM1_DeadTime, + TIM1_BreakState_TypeDef TIM1_Break, + TIM1_BreakPolarity_TypeDef TIM1_BreakPolarity, + TIM1_AutomaticOutput_TypeDef TIM1_AutomaticOutput) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OSSI_STATE_OK(TIM1_OSSIState)); + assert_param(IS_TIM1_LOCK_LEVEL_OK(TIM1_LockLevel)); + assert_param(IS_TIM1_BREAK_STATE_OK(TIM1_Break)); + assert_param(IS_TIM1_BREAK_POLARITY_OK(TIM1_BreakPolarity)); + assert_param(IS_TIM1_AUTOMATIC_OUTPUT_STATE_OK(TIM1_AutomaticOutput)); + + TIM1->DTR = (uint8_t)(TIM1_DeadTime); + /* Set the Lock level, the Break enable Bit and the Polarity, the OSSI State, + the dead time value and the Automatic Output Enable Bit */ + + TIM1->BKR = (uint8_t)((uint8_t)(TIM1_OSSIState | (uint8_t)TIM1_LockLevel) | + (uint8_t)((uint8_t)(TIM1_Break | (uint8_t)TIM1_BreakPolarity) | + (uint8_t)TIM1_AutomaticOutput)); +} + +/** + * @brief Initializes the TIM1 peripheral according to the specified parameters. + * @param TIM1_Channel specifies the input capture channel from TIM1_Channel_TypeDef. + * @param TIM1_ICPolarity specifies the Input capture polarity from + * TIM1_ICPolarity_TypeDef . + * @param TIM1_ICSelection specifies the Input capture source selection from + * TIM1_ICSelection_TypeDef. + * @param TIM1_ICPrescaler specifies the Input capture Prescaler from + * TIM1_ICPSC_TypeDef. + * @param TIM1_ICFilter specifies the Input capture filter value. + * @retval None + */ +void TIM1_ICInit(TIM1_Channel_TypeDef TIM1_Channel, + TIM1_ICPolarity_TypeDef TIM1_ICPolarity, + TIM1_ICSelection_TypeDef TIM1_ICSelection, + TIM1_ICPSC_TypeDef TIM1_ICPrescaler, + uint8_t TIM1_ICFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM1_CHANNEL_OK(TIM1_Channel)); + assert_param(IS_TIM1_IC_POLARITY_OK(TIM1_ICPolarity)); + assert_param(IS_TIM1_IC_SELECTION_OK(TIM1_ICSelection)); + assert_param(IS_TIM1_IC_PRESCALER_OK(TIM1_ICPrescaler)); + assert_param(IS_TIM1_IC_FILTER_OK(TIM1_ICFilter)); + + if (TIM1_Channel == TIM1_CHANNEL_1) + { + /* TI1 Configuration */ + TI1_Config((uint8_t)TIM1_ICPolarity, + (uint8_t)TIM1_ICSelection, + (uint8_t)TIM1_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM1_SetIC1Prescaler(TIM1_ICPrescaler); + } + else if (TIM1_Channel == TIM1_CHANNEL_2) + { + /* TI2 Configuration */ + TI2_Config((uint8_t)TIM1_ICPolarity, + (uint8_t)TIM1_ICSelection, + (uint8_t)TIM1_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM1_SetIC2Prescaler(TIM1_ICPrescaler); + } + else if (TIM1_Channel == TIM1_CHANNEL_3) + { + /* TI3 Configuration */ + TI3_Config((uint8_t)TIM1_ICPolarity, + (uint8_t)TIM1_ICSelection, + (uint8_t)TIM1_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM1_SetIC3Prescaler(TIM1_ICPrescaler); + } + else + { + /* TI4 Configuration */ + TI4_Config((uint8_t)TIM1_ICPolarity, + (uint8_t)TIM1_ICSelection, + (uint8_t)TIM1_ICFilter); + /* Set the Input Capture Prescaler value */ + TIM1_SetIC4Prescaler(TIM1_ICPrescaler); + } +} + +/** + * @brief Configures the TIM1 peripheral in PWM Input Mode according to the + * specified parameters. + * @param TIM1_Channel specifies the input capture channel from + * @ref TIM1_Channel_TypeDef. + * @param TIM1_ICPolarity specifies the Input capture polarity from + * @ref TIM1_ICPolarity_TypeDef . + * @param TIM1_ICSelection specifies the Input capture source selection from + * @ref TIM1_ICSelection_TypeDef. + * @param TIM1_ICPrescaler specifies the Input capture Prescaler from + * @ref TIM1_ICPSC_TypeDef. + * @param TIM1_ICFilter specifies the Input capture filter value. + * @retval None + */ +void TIM1_PWMIConfig(TIM1_Channel_TypeDef TIM1_Channel, + TIM1_ICPolarity_TypeDef TIM1_ICPolarity, + TIM1_ICSelection_TypeDef TIM1_ICSelection, + TIM1_ICPSC_TypeDef TIM1_ICPrescaler, + uint8_t TIM1_ICFilter) +{ + uint8_t icpolarity = TIM1_ICPOLARITY_RISING; + uint8_t icselection = TIM1_ICSELECTION_DIRECTTI; + + /* Check the parameters */ + assert_param(IS_TIM1_PWMI_CHANNEL_OK(TIM1_Channel)); + assert_param(IS_TIM1_IC_POLARITY_OK(TIM1_ICPolarity)); + assert_param(IS_TIM1_IC_SELECTION_OK(TIM1_ICSelection)); + assert_param(IS_TIM1_IC_PRESCALER_OK(TIM1_ICPrescaler)); + + /* Select the Opposite Input Polarity */ + if (TIM1_ICPolarity != TIM1_ICPOLARITY_FALLING) + { + icpolarity = TIM1_ICPOLARITY_FALLING; + } + else + { + icpolarity = TIM1_ICPOLARITY_RISING; + } + + /* Select the Opposite Input */ + if (TIM1_ICSelection == TIM1_ICSELECTION_DIRECTTI) + { + icselection = TIM1_ICSELECTION_INDIRECTTI; + } + else + { + icselection = TIM1_ICSELECTION_DIRECTTI; + } + + if (TIM1_Channel == TIM1_CHANNEL_1) + { + /* TI1 Configuration */ + TI1_Config((uint8_t)TIM1_ICPolarity, (uint8_t)TIM1_ICSelection, + (uint8_t)TIM1_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM1_SetIC1Prescaler(TIM1_ICPrescaler); + + /* TI2 Configuration */ + TI2_Config(icpolarity, icselection, TIM1_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM1_SetIC2Prescaler(TIM1_ICPrescaler); + } + else + { + /* TI2 Configuration */ + TI2_Config((uint8_t)TIM1_ICPolarity, (uint8_t)TIM1_ICSelection, + (uint8_t)TIM1_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM1_SetIC2Prescaler(TIM1_ICPrescaler); + + /* TI1 Configuration */ + TI1_Config(icpolarity, icselection, TIM1_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM1_SetIC1Prescaler(TIM1_ICPrescaler); + } +} + +/** + * @brief Enables or disables the TIM1 peripheral. + * @param NewState new state of the TIM1 peripheral. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* set or Reset the CEN Bit */ + if (NewState != DISABLE) + { + TIM1->CR1 |= TIM1_CR1_CEN; + } + else + { + TIM1->CR1 &= (uint8_t)(~TIM1_CR1_CEN); + } +} + +/** + * @brief Enables or disables the TIM1 peripheral Main Outputs. + * @param NewState new state of the TIM1 peripheral. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_CtrlPWMOutputs(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the MOE Bit */ + + if (NewState != DISABLE) + { + TIM1->BKR |= TIM1_BKR_MOE; + } + else + { + TIM1->BKR &= (uint8_t)(~TIM1_BKR_MOE); + } +} + +/** + * @brief Enables or disables the specified TIM1 interrupts. + * @param NewState new state of the TIM1 peripheral. + * This parameter can be: ENABLE or DISABLE. + * @param TIM1_IT specifies the TIM1 interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * - TIM1_IT_UPDATE: TIM1 update Interrupt source + * - TIM1_IT_CC1: TIM1 Capture Compare 1 Interrupt source + * - TIM1_IT_CC2: TIM1 Capture Compare 2 Interrupt source + * - TIM1_IT_CC3: TIM1 Capture Compare 3 Interrupt source + * - TIM1_IT_CC4: TIM1 Capture Compare 4 Interrupt source + * - TIM1_IT_CCUpdate: TIM1 Capture Compare Update Interrupt source + * - TIM1_IT_TRIGGER: TIM1 Trigger Interrupt source + * - TIM1_IT_BREAK: TIM1 Break Interrupt source + * @param NewState new state of the TIM1 peripheral. + * @retval None + */ +void TIM1_ITConfig(TIM1_IT_TypeDef TIM1_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM1_IT_OK(TIM1_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt sources */ + TIM1->IER |= (uint8_t)TIM1_IT; + } + else + { + /* Disable the Interrupt sources */ + TIM1->IER &= (uint8_t)(~(uint8_t)TIM1_IT); + } +} + +/** + * @brief Configures the TIM1 internal Clock. + * @param None + * @retval None + */ +void TIM1_InternalClockConfig(void) +{ + /* Disable slave mode to clock the prescaler directly with the internal clock */ + TIM1->SMCR &= (uint8_t)(~TIM1_SMCR_SMS); +} + +/** + * @brief Configures the TIM1 External clock Mode1. + * @param TIM1_ExtTRGPrescaler specifies the external Trigger Prescaler. + * This parameter can be one of the following values: + * - TIM1_EXTTRGPSC_OFF + * - TIM1_EXTTRGPSC_DIV2 + * - TIM1_EXTTRGPSC_DIV4 + * - TIM1_EXTTRGPSC_DIV8. + * @param TIM1_ExtTRGPolarity specifies the external Trigger Polarity. + * This parameter can be one of the following values: + * - TIM1_EXTTRGPOLARITY_INVERTED + * - TIM1_EXTTRGPOLARITY_NONINVERTED + * @param ExtTRGFilter specifies the External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM1_ETRClockMode1Config(TIM1_ExtTRGPSC_TypeDef TIM1_ExtTRGPrescaler, + TIM1_ExtTRGPolarity_TypeDef TIM1_ExtTRGPolarity, + uint8_t ExtTRGFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM1_EXT_PRESCALER_OK(TIM1_ExtTRGPrescaler)); + assert_param(IS_TIM1_EXT_POLARITY_OK(TIM1_ExtTRGPolarity)); + + /* Configure the ETR Clock source */ + TIM1_ETRConfig(TIM1_ExtTRGPrescaler, TIM1_ExtTRGPolarity, ExtTRGFilter); + + /* Select the External clock mode1 & Select the Trigger selection : ETRF */ + TIM1->SMCR = (uint8_t)((uint8_t)(TIM1->SMCR & (uint8_t)(~(uint8_t)(TIM1_SMCR_SMS | TIM1_SMCR_TS ))) + | (uint8_t)((uint8_t)TIM1_SLAVEMODE_EXTERNAL1 | TIM1_TS_ETRF )); +} + +/** + * @brief Configures the TIM1 External clock Mode2. + * @param TIM1_ExtTRGPrescaler specifies the external Trigger Prescaler. + * This parameter can be one of the following values: + * - TIM1_EXTTRGPSC_OFF + * - TIM1_EXTTRGPSC_DIV2 + * - TIM1_EXTTRGPSC_DIV4 + * - TIM1_EXTTRGPSC_DIV8. + * @param TIM1_ExtTRGPolarity specifies the external Trigger Polarity. + * This parameter can be one of the following values: + * - TIM1_EXTTRGPOLARITY_INVERTED + * - TIM1_EXTTRGPOLARITY_NONINVERTED + * @param ExtTRGFilter specifies the External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM1_ETRClockMode2Config(TIM1_ExtTRGPSC_TypeDef TIM1_ExtTRGPrescaler, + TIM1_ExtTRGPolarity_TypeDef TIM1_ExtTRGPolarity, + uint8_t ExtTRGFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM1_EXT_PRESCALER_OK(TIM1_ExtTRGPrescaler)); + assert_param(IS_TIM1_EXT_POLARITY_OK(TIM1_ExtTRGPolarity)); + + /* Configure the ETR Clock source */ + TIM1_ETRConfig(TIM1_ExtTRGPrescaler, TIM1_ExtTRGPolarity, ExtTRGFilter); + + /* Enable the External clock mode2 */ + TIM1->ETR |= TIM1_ETR_ECE; +} + +/** + * @brief Configures the TIM1 External Trigger. + * @param TIM1_ExtTRGPrescaler specifies the external Trigger Prescaler. + * This parameter can be one of the following values: + * - TIM1_EXTTRGPSC_OFF + * - TIM1_EXTTRGPSC_DIV2 + * - TIM1_EXTTRGPSC_DIV4 + * - TIM1_EXTTRGPSC_DIV8. + * @param TIM1_ExtTRGPolarity specifies the external Trigger Polarity. + * This parameter can be one of the following values: + * - TIM1_EXTTRGPOLARITY_INVERTED + * - TIM1_EXTTRGPOLARITY_NONINVERTED + * @param ExtTRGFilter specifies the External Trigger Filter. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM1_ETRConfig(TIM1_ExtTRGPSC_TypeDef TIM1_ExtTRGPrescaler, + TIM1_ExtTRGPolarity_TypeDef TIM1_ExtTRGPolarity, + uint8_t ExtTRGFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM1_EXT_TRG_FILTER_OK(ExtTRGFilter)); + /* Set the Prescaler, the Filter value and the Polarity */ + TIM1->ETR |= (uint8_t)((uint8_t)(TIM1_ExtTRGPrescaler | (uint8_t)TIM1_ExtTRGPolarity )| + (uint8_t)ExtTRGFilter ); +} + +/** + * @brief Configures the TIM1 Trigger as External Clock. + * @param TIM1_TIxExternalCLKSource specifies Trigger source. + * This parameter can be one of the following values: + * - TIM1_TIXEXTERNALCLK1SOURCE_TI1: TI1 Edge Detector + * - TIM1_TIXEXTERNALCLK1SOURCE_TI2: Filtered TIM1 Input 1 + * - TIM1_TIXEXTERNALCLK1SOURCE_TI1ED: Filtered TIM1 Input 2 + * @param TIM1_ICPolarity specifies the TIx Polarity. + * This parameter can be: + * - TIM1_ICPOLARITY_RISING + * - TIM1_ICPOLARITY_FALLING + * @param ICFilter specifies the filter value. + * This parameter must be a value between 0x00 and 0x0F + * @retval None + */ +void TIM1_TIxExternalClockConfig(TIM1_TIxExternalCLK1Source_TypeDef TIM1_TIxExternalCLKSource, + TIM1_ICPolarity_TypeDef TIM1_ICPolarity, + uint8_t ICFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM1_TIXCLK_SOURCE_OK(TIM1_TIxExternalCLKSource)); + assert_param(IS_TIM1_IC_POLARITY_OK(TIM1_ICPolarity)); + assert_param(IS_TIM1_IC_FILTER_OK(ICFilter)); + + /* Configure the TIM1 Input Clock Source */ + if (TIM1_TIxExternalCLKSource == TIM1_TIXEXTERNALCLK1SOURCE_TI2) + { + TI2_Config((uint8_t)TIM1_ICPolarity, (uint8_t)TIM1_ICSELECTION_DIRECTTI, (uint8_t)ICFilter); + } + else + { + TI1_Config((uint8_t)TIM1_ICPolarity, (uint8_t)TIM1_ICSELECTION_DIRECTTI, (uint8_t)ICFilter); + } + + /* Select the Trigger source */ + TIM1_SelectInputTrigger((TIM1_TS_TypeDef)TIM1_TIxExternalCLKSource); + + /* Select the External clock mode1 */ + TIM1->SMCR |= (uint8_t)(TIM1_SLAVEMODE_EXTERNAL1); +} + +/** + * @brief Selects the TIM1 Input Trigger source. + * @param TIM1_InputTriggerSource specifies Input Trigger source. + * This parameter can be one of the following values: + * - TIM1_TS_TI1F_ED: TI1 Edge Detector + * - TIM1_TS_TI1FP1: Filtered Timer Input 1 + * - TIM1_TS_TI2FP2: Filtered Timer Input 2 + * - TIM1_TS_ETRF: External Trigger input + * @retval None + */ +void TIM1_SelectInputTrigger(TIM1_TS_TypeDef TIM1_InputTriggerSource) +{ + /* Check the parameters */ + assert_param(IS_TIM1_TRIGGER_SELECTION_OK(TIM1_InputTriggerSource)); + + /* Select the Tgigger Source */ + TIM1->SMCR = (uint8_t)((uint8_t)(TIM1->SMCR & (uint8_t)(~TIM1_SMCR_TS)) | (uint8_t)TIM1_InputTriggerSource); +} + +/** + * @brief Enables or Disables the TIM1 Update event. + * @param NewState new state of the TIM1 peripheral Preload register. This parameter can + * be ENABLE or DISABLE. + * @retval None + */ + +void TIM1_UpdateDisableConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the UDIS Bit */ + if (NewState != DISABLE) + { + TIM1->CR1 |= TIM1_CR1_UDIS; + } + else + { + TIM1->CR1 &= (uint8_t)(~TIM1_CR1_UDIS); + } +} + +/** + * @brief Selects the TIM1 Update Request Interrupt source. + * @param TIM1_UpdateSource specifies the Update source. + * This parameter can be one of the following values + * - TIM1_UPDATESOURCE_REGULAR + * - TIM1_UPDATESOURCE_GLOBAL + * @retval None + */ +void TIM1_UpdateRequestConfig(TIM1_UpdateSource_TypeDef TIM1_UpdateSource) +{ + /* Check the parameters */ + assert_param(IS_TIM1_UPDATE_SOURCE_OK(TIM1_UpdateSource)); + + /* Set or Reset the URS Bit */ + if (TIM1_UpdateSource != TIM1_UPDATESOURCE_GLOBAL) + { + TIM1->CR1 |= TIM1_CR1_URS; + } + else + { + TIM1->CR1 &= (uint8_t)(~TIM1_CR1_URS); + } +} + +/** + * @brief Enables or Disables the TIM1’s Hall sensor interface. + * @param NewState new state of the TIM1 Hall sensor interface.This parameter can + * be ENABLE or DISABLE. + * @retval None + */ +void TIM1_SelectHallSensor(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the TI1S Bit */ + if (NewState != DISABLE) + { + TIM1->CR2 |= TIM1_CR2_TI1S; + } + else + { + TIM1->CR2 &= (uint8_t)(~TIM1_CR2_TI1S); + } +} + +/** + * @brief Selects the TIM1’s One Pulse Mode. + * @param TIM1_OPMode specifies the OPM Mode to be used. + * This parameter can be one of the following values + * - TIM1_OPMODE_SINGLE + * - TIM1_OPMODE_REPETITIVE + * @retval None + */ +void TIM1_SelectOnePulseMode(TIM1_OPMode_TypeDef TIM1_OPMode) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OPM_MODE_OK(TIM1_OPMode)); + + /* Set or Reset the OPM Bit */ + if (TIM1_OPMode != TIM1_OPMODE_REPETITIVE) + { + TIM1->CR1 |= TIM1_CR1_OPM; + } + else + { + TIM1->CR1 &= (uint8_t)(~TIM1_CR1_OPM); + } + +} + +/** + * @brief Selects the TIM1 Trigger Output Mode. + * @param TIM1_TRGOSource specifies the Trigger Output source. + * This parameter can be one of the following values + * - TIM1_TRGOSOURCE_RESET + * - TIM1_TRGOSOURCE_ENABLE + * - TIM1_TRGOSOURCE_UPDATE + * - TIM1_TRGOSource_OC1 + * - TIM1_TRGOSOURCE_OC1REF + * - TIM1_TRGOSOURCE_OC2REF + * - TIM1_TRGOSOURCE_OC3REF + * @retval None + */ +void TIM1_SelectOutputTrigger(TIM1_TRGOSource_TypeDef TIM1_TRGOSource) +{ + /* Check the parameters */ + assert_param(IS_TIM1_TRGO_SOURCE_OK(TIM1_TRGOSource)); + + /* Reset the MMS Bits & Select the TRGO source */ + TIM1->CR2 = (uint8_t)((uint8_t)(TIM1->CR2 & (uint8_t)(~TIM1_CR2_MMS)) | + (uint8_t) TIM1_TRGOSource); +} + +/** + * @brief Selects the TIM1 Slave Mode. + * @param TIM1_SlaveMode specifies the TIM1 Slave Mode. + * This parameter can be one of the following values + * - TIM1_SLAVEMODE_RESET + * - TIM1_SLAVEMODE_GATED + * - TIM1_SLAVEMODE_TRIGGER + * - TIM1_SLAVEMODE_EXTERNAL1 + * @retval None + */ +void TIM1_SelectSlaveMode(TIM1_SlaveMode_TypeDef TIM1_SlaveMode) +{ + /* Check the parameters */ + assert_param(IS_TIM1_SLAVE_MODE_OK(TIM1_SlaveMode)); + + /* Reset the SMS Bits */ /* Select the Slave Mode */ + TIM1->SMCR = (uint8_t)((uint8_t)(TIM1->SMCR & (uint8_t)(~TIM1_SMCR_SMS)) | + (uint8_t)TIM1_SlaveMode); +} + +/** + * @brief Sets or Resets the TIM1 Master/Slave Mode. + * @param NewState new state of the synchronization between TIM1 and its slaves + * (through TRGO). This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_SelectMasterSlaveMode(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the MSM Bit */ + if (NewState != DISABLE) + { + TIM1->SMCR |= TIM1_SMCR_MSM; + } + else + { + TIM1->SMCR &= (uint8_t)(~TIM1_SMCR_MSM); + } +} + +/** + * @brief Configures the TIM1 Encoder Interface. + * @param TIM1_EncoderMode specifies the TIM1 Encoder Mode. + * This parameter can be one of the following values + * - TIM1_ENCODERMODE_TI1: Counter counts on TI1FP1 edge + * depending on TI2FP2 level. + * - TIM1_ENCODERMODE_TI2: Counter counts on TI2FP2 edge + * depending on TI1FP1 level. + * - TIM1_ENCODERMODE_TI12: Counter counts on both TI1FP1 and + * TI2FP2 edges depending on the level of the other input. + * @param TIM1_IC1Polarity specifies the IC1 Polarity. + * This parameter can be one of the following values + * - TIM1_ICPOLARITY_FALLING + * - TIM1_ICPOLARITY_RISING + * @param TIM1_IC2Polarity specifies the IC2 Polarity. + * This parameter can be one of the following values + * - TIM1_ICPOLARITY_FALLING + * - TIM1_ICPOLARITY_RISING + * @retval None + */ +void TIM1_EncoderInterfaceConfig(TIM1_EncoderMode_TypeDef TIM1_EncoderMode, + TIM1_ICPolarity_TypeDef TIM1_IC1Polarity, + TIM1_ICPolarity_TypeDef TIM1_IC2Polarity) +{ + /* Check the parameters */ + assert_param(IS_TIM1_ENCODER_MODE_OK(TIM1_EncoderMode)); + assert_param(IS_TIM1_IC_POLARITY_OK(TIM1_IC1Polarity)); + assert_param(IS_TIM1_IC_POLARITY_OK(TIM1_IC2Polarity)); + + /* Set the TI1 and the TI2 Polarities */ + if (TIM1_IC1Polarity != TIM1_ICPOLARITY_RISING) + { + TIM1->CCER1 |= TIM1_CCER1_CC1P; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1P); + } + + if (TIM1_IC2Polarity != TIM1_ICPOLARITY_RISING) + { + TIM1->CCER1 |= TIM1_CCER1_CC2P; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC2P); + } + /* Set the encoder Mode */ + TIM1->SMCR = (uint8_t)((uint8_t)(TIM1->SMCR & (uint8_t)(TIM1_SMCR_MSM | TIM1_SMCR_TS)) + | (uint8_t) TIM1_EncoderMode); + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + TIM1->CCMR1 = (uint8_t)((uint8_t)(TIM1->CCMR1 & (uint8_t)(~TIM1_CCMR_CCxS)) + | (uint8_t) CCMR_TIxDirect_Set); + TIM1->CCMR2 = (uint8_t)((uint8_t)(TIM1->CCMR2 & (uint8_t)(~TIM1_CCMR_CCxS)) + | (uint8_t) CCMR_TIxDirect_Set); +} + +/** + * @brief Configures the TIM1 Prescaler. + * @param Prescaler specifies the Prescaler Register value + * This parameter must be a value between 0x0000 and 0xFFFF + * @param TIM1_PSCReloadMode specifies the TIM1 Prescaler Reload mode. + * This parameter can be one of the following values + * - TIM1_PSCRELOADMODE_IMMEDIATE: The Prescaler is loaded immediately. + * - TIM1_PSCRELOADMODE_UPDATE: The Prescaler is loaded at the update event. + * @retval None + */ +void TIM1_PrescalerConfig(uint16_t Prescaler, + TIM1_PSCReloadMode_TypeDef TIM1_PSCReloadMode) +{ + /* Check the parameters */ + assert_param(IS_TIM1_PRESCALER_RELOAD_OK(TIM1_PSCReloadMode)); + + /* Set the Prescaler value */ + TIM1->PSCRH = (uint8_t)(Prescaler >> 8); + TIM1->PSCRL = (uint8_t)(Prescaler); + + /* Set or reset the UG Bit */ + TIM1->EGR = (uint8_t)TIM1_PSCReloadMode; +} + +/** + * @brief Specifies the TIM1 Counter Mode to be used. + * @param TIM1_CounterMode specifies the Counter Mode to be used + * This parameter can be one of the following values: + * - TIM1_COUNTERMODE_UP: TIM1 Up Counting Mode + * - TIM1_COUNTERMODE_DOWN: TIM1 Down Counting Mode + * - TIM1_COUNTERMODE_CENTERALIGNED1: TIM1 Center Aligned Mode1 + * - TIM1_CounterMode_CenterAligned2: TIM1 Center Aligned Mode2 + * - TIM1_COUNTERMODE_CENTERALIGNED3: TIM1 Center Aligned Mode3 + * @retval None + */ +void TIM1_CounterModeConfig(TIM1_CounterMode_TypeDef TIM1_CounterMode) +{ + /* Check the parameters */ + assert_param(IS_TIM1_COUNTER_MODE_OK(TIM1_CounterMode)); + + + /* Reset the CMS and DIR Bits & Set the Counter Mode */ + TIM1->CR1 = (uint8_t)((uint8_t)(TIM1->CR1 & (uint8_t)((uint8_t)(~TIM1_CR1_CMS) & (uint8_t)(~TIM1_CR1_DIR))) + | (uint8_t)TIM1_CounterMode); +} + +/** + * @brief Forces the TIM1 Channel1 output waveform to active or inactive level. + * @param TIM1_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM1_FORCEDACTION_ACTIVE: Force active level on OC1REF + * - TIM1_FORCEDACTION_INACTIVE: Force inactive level on OC1REF. + * @retval None + */ +void TIM1_ForcedOC1Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM1_FORCED_ACTION_OK(TIM1_ForcedAction)); + + /* Reset the OCM Bits & Configure the Forced output Mode */ + TIM1->CCMR1 = (uint8_t)((uint8_t)(TIM1->CCMR1 & (uint8_t)(~TIM1_CCMR_OCM))| + (uint8_t)TIM1_ForcedAction); +} + +/** + * @brief Forces the TIM1 Channel2 output waveform to active or inactive level. + * @param TIM1_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM1_FORCEDACTION_ACTIVE: Force active level on OC2REF + * - TIM1_FORCEDACTION_INACTIVE: Force inactive level on OC2REF. + * @retval None + */ +void TIM1_ForcedOC2Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM1_FORCED_ACTION_OK(TIM1_ForcedAction)); + + /* Reset the OCM Bits & Configure the Forced output Mode */ + TIM1->CCMR2 = (uint8_t)((uint8_t)(TIM1->CCMR2 & (uint8_t)(~TIM1_CCMR_OCM)) + | (uint8_t)TIM1_ForcedAction); +} + +/** + * @brief Forces the TIM1 Channel3 output waveform to active or inactive level. + * @param TIM1_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM1_FORCEDACTION_ACTIVE: Force active level on OC3REF + * - TIM1_FORCEDACTION_INACTIVE: Force inactive level on + * OC3REF. + * @retval None + */ +void TIM1_ForcedOC3Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM1_FORCED_ACTION_OK(TIM1_ForcedAction)); + + /* Reset the OCM Bits */ /* Configure The Forced output Mode */ + TIM1->CCMR3 = (uint8_t)((uint8_t)(TIM1->CCMR3 & (uint8_t)(~TIM1_CCMR_OCM)) + | (uint8_t)TIM1_ForcedAction); +} + +/** + * @brief Forces the TIM1 Channel4 output waveform to active or inactive level. + * @param TIM1_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM1_FORCEDACTION_ACTIVE: Force active level on OC4REF + * - TIM1_FORCEDACTION_INACTIVE: Force inactive level on + * OC4REF. + * @retval None + */ +void TIM1_ForcedOC4Config(TIM1_ForcedAction_TypeDef TIM1_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM1_FORCED_ACTION_OK(TIM1_ForcedAction)); + + /* Reset the OCM Bits & Configure the Forced output Mode */ + TIM1->CCMR4 = (uint8_t)((uint8_t)(TIM1->CCMR4 & (uint8_t)(~TIM1_CCMR_OCM)) + | (uint8_t)TIM1_ForcedAction); +} + +/** + * @brief Enables or disables TIM1 peripheral Preload register on ARR. + * @param NewState new state of the TIM1 peripheral Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_ARRPreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the ARPE Bit */ + if (NewState != DISABLE) + { + TIM1->CR1 |= TIM1_CR1_ARPE; + } + else + { + TIM1->CR1 &= (uint8_t)(~TIM1_CR1_ARPE); + } +} + +/** + * @brief Selects the TIM1 peripheral Commutation event. + * @param NewState new state of the Commutation event. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_SelectCOM(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the COMS Bit */ + if (NewState != DISABLE) + { + TIM1->CR2 |= TIM1_CR2_COMS; + } + else + { + TIM1->CR2 &= (uint8_t)(~TIM1_CR2_COMS); + } +} + +/** + * @brief Sets or Resets the TIM1 peripheral Capture Compare Preload Control bit. + * @param NewState new state of the Capture Compare Preload Control bit. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_CCPreloadControl(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the CCPC Bit */ + if (NewState != DISABLE) + { + TIM1->CR2 |= TIM1_CR2_CCPC; + } + else + { + TIM1->CR2 &= (uint8_t)(~TIM1_CR2_CCPC); + } +} + +/** + * @brief Enables or disables the TIM1 peripheral Preload Register on CCR1. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_OC1PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC1PE Bit */ + if (NewState != DISABLE) + { + TIM1->CCMR1 |= TIM1_CCMR_OCxPE; + } + else + { + TIM1->CCMR1 &= (uint8_t)(~TIM1_CCMR_OCxPE); + } +} + +/** + * @brief Enables or disables the TIM1 peripheral Preload Register on CCR2. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_OC2PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC2PE Bit */ + if (NewState != DISABLE) + { + TIM1->CCMR2 |= TIM1_CCMR_OCxPE; + } + else + { + TIM1->CCMR2 &= (uint8_t)(~TIM1_CCMR_OCxPE); + } +} + +/** + * @brief Enables or disables the TIM1 peripheral Preload Register on CCR3. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_OC3PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC3PE Bit */ + if (NewState != DISABLE) + { + TIM1->CCMR3 |= TIM1_CCMR_OCxPE; + } + else + { + TIM1->CCMR3 &= (uint8_t)(~TIM1_CCMR_OCxPE); + } +} + +/** + * @brief Enables or disables the TIM1 peripheral Preload Register on CCR4. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_OC4PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC4PE Bit */ + if (NewState != DISABLE) + { + TIM1->CCMR4 |= TIM1_CCMR_OCxPE; + } + else + { + TIM1->CCMR4 &= (uint8_t)(~TIM1_CCMR_OCxPE); + } +} + +/** + * @brief Configures the TIM1 Capture Compare 1 Fast feature. + * @param NewState new state of the Output Compare Fast Enable bit. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_OC1FastConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC1FE Bit */ + if (NewState != DISABLE) + { + TIM1->CCMR1 |= TIM1_CCMR_OCxFE; + } + else + { + TIM1->CCMR1 &= (uint8_t)(~TIM1_CCMR_OCxFE); + } +} + +/** + * @brief Configures the TIM1 Capture Compare 2 Fast feature. + * @param NewState new state of the Output Compare Fast Enable bit. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_OC2FastConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC2FE Bit */ + if (NewState != DISABLE) + { + TIM1->CCMR2 |= TIM1_CCMR_OCxFE; + } + else + { + TIM1->CCMR2 &= (uint8_t)(~TIM1_CCMR_OCxFE); + } +} + +/** + * @brief Configures the TIM1 Capture Compare 3 Fast feature. + * @param NewState new state of the Output Compare Fast Enable bit. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_OC3FastConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC3FE Bit */ + if (NewState != DISABLE) + { + TIM1->CCMR3 |= TIM1_CCMR_OCxFE; + } + else + { + TIM1->CCMR3 &= (uint8_t)(~TIM1_CCMR_OCxFE); + } +} + +/** + * @brief Configures the TIM1 Capture Compare 4 Fast feature. + * @param NewState new state of the Output Compare Fast Enable bit. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM1_OC4FastConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC4FE Bit */ + if (NewState != DISABLE) + { + TIM1->CCMR4 |= TIM1_CCMR_OCxFE; + } + else + { + TIM1->CCMR4 &= (uint8_t)(~TIM1_CCMR_OCxFE); + } +} + +/** + * @brief Configures the TIM1 event to be generated by software. + * @param TIM1_EventSource specifies the event source. + * This parameter can be one of the following values: + * - TIM1_EVENTSOURCE_UPDATE: TIM1 update Event source + * - TIM1_EVENTSOURCE_CC1: TIM1 Capture Compare 1 Event source + * - TIM1_EVENTSOURCE_CC2: TIM1 Capture Compare 2 Event source + * - TIM1_EVENTSOURCE_CC3: TIM1 Capture Compare 3 Event source + * - TIM1_EVENTSOURCE_CC4: TIM1 Capture Compare 4 Event source + * - TIM1_EVENTSOURCE_COM: TIM1 COM Event source + * - TIM1_EVENTSOURCE_TRIGGER: TIM1 Trigger Event source + * - TIM1_EventSourceBreak: TIM1 Break Event source + * @retval None + */ +void TIM1_GenerateEvent(TIM1_EventSource_TypeDef TIM1_EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM1_EVENT_SOURCE_OK(TIM1_EventSource)); + + /* Set the event sources */ + TIM1->EGR = (uint8_t)TIM1_EventSource; +} + +/** + * @brief Configures the TIM1 Channel 1 polarity. + * @param TIM1_OCPolarity specifies the OC1 Polarity. + * This parameter can be one of the following values: + * - TIM1_OCPOLARITY_LOW: Output Compare active low + * - TIM1_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM1_OC1PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OC_POLARITY_OK(TIM1_OCPolarity)); + + /* Set or Reset the CC1P Bit */ + if (TIM1_OCPolarity != TIM1_OCPOLARITY_HIGH) + { + TIM1->CCER1 |= TIM1_CCER1_CC1P; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1P); + } +} + +/** + * @brief Configures the TIM1 Channel 1N polarity. + * @param TIM1_OCNPolarity specifies the OC1N Polarity. + * This parameter can be one of the following values: + * - TIM1_OCNPOLARITY_LOW: Output Compare active low + * - TIM1_OCNPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM1_OC1NPolarityConfig(TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OCN_POLARITY_OK(TIM1_OCNPolarity)); + + /* Set or Reset the CC3P Bit */ + if (TIM1_OCNPolarity != TIM1_OCNPOLARITY_HIGH) + { + TIM1->CCER1 |= TIM1_CCER1_CC1NP; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1NP); + } +} + +/** + * @brief Configures the TIM1 Channel 2 polarity. + * @param TIM1_OCPolarity specifies the OC2 Polarity. + * This parameter can be one of the following values: + * - TIM1_OCPOLARITY_LOW: Output Compare active low + * - TIM1_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM1_OC2PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OC_POLARITY_OK(TIM1_OCPolarity)); + + /* Set or Reset the CC2P Bit */ + if (TIM1_OCPolarity != TIM1_OCPOLARITY_HIGH) + { + TIM1->CCER1 |= TIM1_CCER1_CC2P; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC2P); + } +} + +/** + * @brief Configures the TIM1 Channel 2N polarity. + * @param TIM1_OCNPolarity specifies the OC2N Polarity. + * This parameter can be one of the following values: + * - TIM1_OCNPOLARITY_LOW: Output Compare active low + * - TIM1_OCNPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM1_OC2NPolarityConfig(TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OCN_POLARITY_OK(TIM1_OCNPolarity)); + + /* Set or Reset the CC3P Bit */ + if (TIM1_OCNPolarity != TIM1_OCNPOLARITY_HIGH) + { + TIM1->CCER1 |= TIM1_CCER1_CC2NP; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC2NP); + } +} + +/** + * @brief Configures the TIM1 Channel 3 polarity. + * @param TIM1_OCPolarity specifies the OC3 Polarity. + * This parameter can be one of the following values: + * - TIM1_OCPOLARITY_LOW: Output Compare active low + * - TIM1_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM1_OC3PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OC_POLARITY_OK(TIM1_OCPolarity)); + + /* Set or Reset the CC3P Bit */ + if (TIM1_OCPolarity != TIM1_OCPOLARITY_HIGH) + { + TIM1->CCER2 |= TIM1_CCER2_CC3P; + } + else + { + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC3P); + } +} + + +/** + * @brief Configures the TIM1 Channel 3N polarity. + * @param TIM1_OCNPolarity specifies the OC3N Polarity. + * This parameter can be one of the following values: + * - TIM1_OCNPOLARITY_LOW: Output Compare active low + * - TIM1_OCNPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM1_OC3NPolarityConfig(TIM1_OCNPolarity_TypeDef TIM1_OCNPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OCN_POLARITY_OK(TIM1_OCNPolarity)); + + /* Set or Reset the CC3P Bit */ + if (TIM1_OCNPolarity != TIM1_OCNPOLARITY_HIGH) + { + TIM1->CCER2 |= TIM1_CCER2_CC3NP; + } + else + { + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC3NP); + } +} + +/** + * @brief Configures the TIM1 Channel 4 polarity. + * @param TIM1_OCPolarity specifies the OC4 Polarity. + * This parameter can be one of the following values: + * - TIM1_OCPOLARITY_LOW: Output Compare active low + * - TIM1_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM1_OC4PolarityConfig(TIM1_OCPolarity_TypeDef TIM1_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM1_OC_POLARITY_OK(TIM1_OCPolarity)); + + /* Set or Reset the CC4P Bit */ + if (TIM1_OCPolarity != TIM1_OCPOLARITY_HIGH) + { + TIM1->CCER2 |= TIM1_CCER2_CC4P; + } + else + { + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC4P); + } +} + +/** + * @brief Enables or disables the TIM1 Capture Compare Channel x (x=1,..,4). + * @param TIM1_Channel specifies the TIM1 Channel. + * This parameter can be one of the following values: + * - TIM1_CHANNEL_1: TIM1 Channel1 + * - TIM1_CHANNEL_2: TIM1 Channel2 + * - TIM1_CHANNEL_3: TIM1 Channel3 + * - TIM1_CHANNEL_4: TIM1 Channel4 + * @param NewState specifies the TIM1 Channel CCxE bit new state. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM1_CCxCmd(TIM1_Channel_TypeDef TIM1_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM1_CHANNEL_OK(TIM1_Channel)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (TIM1_Channel == TIM1_CHANNEL_1) + { + /* Set or Reset the CC1E Bit */ + if (NewState != DISABLE) + { + TIM1->CCER1 |= TIM1_CCER1_CC1E; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1E); + } + + } + else if (TIM1_Channel == TIM1_CHANNEL_2) + { + /* Set or Reset the CC2E Bit */ + if (NewState != DISABLE) + { + TIM1->CCER1 |= TIM1_CCER1_CC2E; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC2E); + } + } + else if (TIM1_Channel == TIM1_CHANNEL_3) + { + /* Set or Reset the CC3E Bit */ + if (NewState != DISABLE) + { + TIM1->CCER2 |= TIM1_CCER2_CC3E; + } + else + { + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC3E); + } + } + else + { + /* Set or Reset the CC4E Bit */ + if (NewState != DISABLE) + { + TIM1->CCER2 |= TIM1_CCER2_CC4E; + } + else + { + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC4E); + } + } +} + +/** + * @brief Enables or disables the TIM1 Capture Compare Channel xN (xN=1,..,3). + * @param TIM1_Channel specifies the TIM1 Channel. + * This parameter can be one of the following values: + * - TIM1_CHANNEL_1: TIM1 Channel1 + * - TIM1_CHANNEL_2: TIM1 Channel2 + * - TIM1_CHANNEL_3: TIM1 Channel3 + * @param NewState specifies the TIM1 Channel CCxNE bit new state. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM1_CCxNCmd(TIM1_Channel_TypeDef TIM1_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM1_COMPLEMENTARY_CHANNEL_OK(TIM1_Channel)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (TIM1_Channel == TIM1_CHANNEL_1) + { + /* Set or Reset the CC1NE Bit */ + if (NewState != DISABLE) + { + TIM1->CCER1 |= TIM1_CCER1_CC1NE; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1NE); + } + } + else if (TIM1_Channel == TIM1_CHANNEL_2) + { + /* Set or Reset the CC2NE Bit */ + if (NewState != DISABLE) + { + TIM1->CCER1 |= TIM1_CCER1_CC2NE; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC2NE); + } + } + else + { + /* Set or Reset the CC3NE Bit */ + if (NewState != DISABLE) + { + TIM1->CCER2 |= TIM1_CCER2_CC3NE; + } + else + { + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC3NE); + } + } +} + +/** + * @brief Selects the TIM1 Output Compare Mode. This function disables the + * selected channel before changing the Output Compare Mode. User has to + * enable this channel using TIM1_CCxCmd and TIM1_CCxNCmd functions. + * @param TIM1_Channel specifies the TIM1 Channel. + * This parameter can be one of the following values: + * - TIM1_CHANNEL_1: TIM1 Channel1 + * - TIM1_CHANNEL_2: TIM1 Channel2 + * - TIM1_CHANNEL_3: TIM1 Channel3 + * - TIM1_CHANNEL_4: TIM1 Channel4 + * @param TIM1_OCMode specifies the TIM1 Output Compare Mode. + * This parameter can be one of the following values: + * - TIM1_OCMODE_TIMING + * - TIM1_OCMODE_ACTIVE + * - TIM1_OCMODE_TOGGLE + * - TIM1_OCMODE_PWM1 + * - TIM1_OCMODE_PWM2 + * - TIM1_FORCEDACTION_ACTIVE + * - TIM1_FORCEDACTION_INACTIVE + * @retval None + */ +void TIM1_SelectOCxM(TIM1_Channel_TypeDef TIM1_Channel, TIM1_OCMode_TypeDef TIM1_OCMode) +{ + /* Check the parameters */ + assert_param(IS_TIM1_CHANNEL_OK(TIM1_Channel)); + assert_param(IS_TIM1_OCM_OK(TIM1_OCMode)); + + if (TIM1_Channel == TIM1_CHANNEL_1) + { + /* Disable the Channel 1: Reset the CCE Bit */ + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1E); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM1->CCMR1 = (uint8_t)((uint8_t)(TIM1->CCMR1 & (uint8_t)(~TIM1_CCMR_OCM)) + | (uint8_t)TIM1_OCMode); + } + else if (TIM1_Channel == TIM1_CHANNEL_2) + { + /* Disable the Channel 2: Reset the CCE Bit */ + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC2E); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM1->CCMR2 = (uint8_t)((uint8_t)(TIM1->CCMR2 & (uint8_t)(~TIM1_CCMR_OCM)) + | (uint8_t)TIM1_OCMode); + } + else if (TIM1_Channel == TIM1_CHANNEL_3) + { + /* Disable the Channel 3: Reset the CCE Bit */ + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC3E); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM1->CCMR3 = (uint8_t)((uint8_t)(TIM1->CCMR3 & (uint8_t)(~TIM1_CCMR_OCM)) + | (uint8_t)TIM1_OCMode); + } + else + { + /* Disable the Channel 4: Reset the CCE Bit */ + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC4E); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM1->CCMR4 = (uint8_t)((uint8_t)(TIM1->CCMR4 & (uint8_t)(~TIM1_CCMR_OCM)) + | (uint8_t)TIM1_OCMode); + } +} + +/** + * @brief Sets the TIM1 Counter Register value. + * @param Counter specifies the Counter register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM1_SetCounter(uint16_t Counter) +{ + /* Set the Counter Register value */ + TIM1->CNTRH = (uint8_t)(Counter >> 8); + TIM1->CNTRL = (uint8_t)(Counter); +} + +/** + * @brief Sets the TIM1 Autoreload Register value. + * @param Autoreload specifies the Autoreload register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM1_SetAutoreload(uint16_t Autoreload) +{ + /* Set the Autoreload Register value */ + TIM1->ARRH = (uint8_t)(Autoreload >> 8); + TIM1->ARRL = (uint8_t)(Autoreload); + } + +/** + * @brief Sets the TIM1 Capture Compare1 Register value. + * @param Compare1 specifies the Capture Compare1 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM1_SetCompare1(uint16_t Compare1) +{ + /* Set the Capture Compare1 Register value */ + TIM1->CCR1H = (uint8_t)(Compare1 >> 8); + TIM1->CCR1L = (uint8_t)(Compare1); +} + +/** + * @brief Sets the TIM1 Capture Compare2 Register value. + * @param Compare2 specifies the Capture Compare2 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM1_SetCompare2(uint16_t Compare2) +{ + /* Set the Capture Compare2 Register value */ + TIM1->CCR2H = (uint8_t)(Compare2 >> 8); + TIM1->CCR2L = (uint8_t)(Compare2); +} + +/** + * @brief Sets the TIM1 Capture Compare3 Register value. + * @param Compare3 specifies the Capture Compare3 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM1_SetCompare3(uint16_t Compare3) +{ + /* Set the Capture Compare3 Register value */ + TIM1->CCR3H = (uint8_t)(Compare3 >> 8); + TIM1->CCR3L = (uint8_t)(Compare3); +} + +/** + * @brief Sets the TIM1 Capture Compare4 Register value. + * @param Compare4 specifies the Capture Compare4 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM1_SetCompare4(uint16_t Compare4) +{ + /* Set the Capture Compare4 Register value */ + TIM1->CCR4H = (uint8_t)(Compare4 >> 8); + TIM1->CCR4L = (uint8_t)(Compare4); +} + +/** + * @brief Sets the TIM1 Input Capture 1 prescaler. + * @param TIM1_IC1Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM1_ICPSC_DIV1: no prescaler + * - TIM1_ICPSC_DIV2: capture is done once every 2 events + * - TIM1_ICPSC_DIV4: capture is done once every 4 events + * - TIM1_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM1_SetIC1Prescaler(TIM1_ICPSC_TypeDef TIM1_IC1Prescaler) +{ + /* Check the parameters */ + assert_param(IS_TIM1_IC_PRESCALER_OK(TIM1_IC1Prescaler)); + + /* Reset the IC1PSC Bits */ /* Set the IC1PSC value */ + TIM1->CCMR1 = (uint8_t)((uint8_t)(TIM1->CCMR1 & (uint8_t)(~TIM1_CCMR_ICxPSC)) + | (uint8_t)TIM1_IC1Prescaler); +} + +/** + * @brief Sets the TIM1 Input Capture 2 prescaler. + * @param TIM1_IC2Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM1_ICPSC_DIV1: no prescaler + * - TIM1_ICPSC_DIV2: capture is done once every 2 events + * - TIM1_ICPSC_DIV4: capture is done once every 4 events + * - TIM1_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM1_SetIC2Prescaler(TIM1_ICPSC_TypeDef TIM1_IC2Prescaler) +{ + + /* Check the parameters */ + assert_param(IS_TIM1_IC_PRESCALER_OK(TIM1_IC2Prescaler)); + + /* Reset the IC1PSC Bits */ /* Set the IC1PSC value */ + TIM1->CCMR2 = (uint8_t)((uint8_t)(TIM1->CCMR2 & (uint8_t)(~TIM1_CCMR_ICxPSC)) + | (uint8_t)TIM1_IC2Prescaler); +} + +/** + * @brief Sets the TIM1 Input Capture 3 prescaler. + * @param TIM1_IC3Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM1_ICPSC_DIV1: no prescaler + * - TIM1_ICPSC_DIV2: capture is done once every 2 events + * - TIM1_ICPSC_DIV4: capture is done once every 4 events + * - TIM1_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM1_SetIC3Prescaler(TIM1_ICPSC_TypeDef TIM1_IC3Prescaler) +{ + + /* Check the parameters */ + assert_param(IS_TIM1_IC_PRESCALER_OK(TIM1_IC3Prescaler)); + + /* Reset the IC1PSC Bits & Set the IC1PSC value */ + TIM1->CCMR3 = (uint8_t)((uint8_t)(TIM1->CCMR3 & (uint8_t)(~TIM1_CCMR_ICxPSC)) | + (uint8_t)TIM1_IC3Prescaler); +} + +/** + * @brief Sets the TIM1 Input Capture 4 prescaler. + * @param TIM1_IC4Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM1_ICPSC_DIV1: no prescaler + * - TIM1_ICPSC_DIV2: capture is done once every 2 events + * - TIM1_ICPSC_DIV4: capture is done once every 4 events + * - TIM1_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM1_SetIC4Prescaler(TIM1_ICPSC_TypeDef TIM1_IC4Prescaler) +{ + + /* Check the parameters */ + assert_param(IS_TIM1_IC_PRESCALER_OK(TIM1_IC4Prescaler)); + + /* Reset the IC1PSC Bits & Set the IC1PSC value */ + TIM1->CCMR4 = (uint8_t)((uint8_t)(TIM1->CCMR4 & (uint8_t)(~TIM1_CCMR_ICxPSC)) | + (uint8_t)TIM1_IC4Prescaler); +} + +/** + * @brief Gets the TIM1 Input Capture 1 value. + * @param None + * @retval Capture Compare 1 Register value. + */ +uint16_t TIM1_GetCapture1(void) +{ + /* Get the Capture 1 Register value */ + + uint16_t tmpccr1 = 0; + uint8_t tmpccr1l=0, tmpccr1h=0; + + tmpccr1h = TIM1->CCR1H; + tmpccr1l = TIM1->CCR1L; + + tmpccr1 = (uint16_t)(tmpccr1l); + tmpccr1 |= (uint16_t)((uint16_t)tmpccr1h << 8); + /* Get the Capture 1 Register value */ + return (uint16_t)tmpccr1; +} + +/** + * @brief Gets the TIM1 Input Capture 2 value. + * @param None + * @retval Capture Compare 2 Register value. + */ +uint16_t TIM1_GetCapture2(void) +{ + /* Get the Capture 2 Register value */ + + uint16_t tmpccr2 = 0; + uint8_t tmpccr2l=0, tmpccr2h=0; + + tmpccr2h = TIM1->CCR2H; + tmpccr2l = TIM1->CCR2L; + + tmpccr2 = (uint16_t)(tmpccr2l); + tmpccr2 |= (uint16_t)((uint16_t)tmpccr2h << 8); + /* Get the Capture 2 Register value */ + return (uint16_t)tmpccr2; +} + +/** + * @brief Gets the TIM1 Input Capture 3 value. + * @param None + * @retval Capture Compare 3 Register value. + */ +uint16_t TIM1_GetCapture3(void) +{ + /* Get the Capture 3 Register value */ + uint16_t tmpccr3 = 0; + uint8_t tmpccr3l=0, tmpccr3h=0; + + tmpccr3h = TIM1->CCR3H; + tmpccr3l = TIM1->CCR3L; + + tmpccr3 = (uint16_t)(tmpccr3l); + tmpccr3 |= (uint16_t)((uint16_t)tmpccr3h << 8); + /* Get the Capture 3 Register value */ + return (uint16_t)tmpccr3; +} + +/** + * @brief Gets the TIM1 Input Capture 4 value. + * @param None + * @retval Capture Compare 4 Register value. + */ +uint16_t TIM1_GetCapture4(void) +{ + /* Get the Capture 4 Register value */ + uint16_t tmpccr4 = 0; + uint8_t tmpccr4l=0, tmpccr4h=0; + + tmpccr4h = TIM1->CCR4H; + tmpccr4l = TIM1->CCR4L; + + tmpccr4 = (uint16_t)(tmpccr4l); + tmpccr4 |= (uint16_t)((uint16_t)tmpccr4h << 8); + /* Get the Capture 4 Register value */ + return (uint16_t)tmpccr4; +} + +/** + * @brief Gets the TIM1 Counter value. + * @param None + * @retval Counter Register value. + */ +uint16_t TIM1_GetCounter(void) +{ + uint16_t tmpcntr = 0; + + tmpcntr = ((uint16_t)TIM1->CNTRH << 8); + + /* Get the Counter Register value */ + return (uint16_t)(tmpcntr | (uint16_t)(TIM1->CNTRL)); +} + +/** + * @brief Gets the TIM1 Prescaler value. + * @param None + * @retval Prescaler Register value. + */ +uint16_t TIM1_GetPrescaler(void) +{ + uint16_t temp = 0; + + temp = ((uint16_t)TIM1->PSCRH << 8); + + /* Get the Prescaler Register value */ + return (uint16_t)( temp | (uint16_t)(TIM1->PSCRL)); +} + +/** + * @brief Checks whether the specified TIM1 flag is set or not. + * @param TIM1_FLAG specifies the flag to check. + * This parameter can be one of the following values: + * - TIM1_FLAG_UPDATE: TIM1 update Flag + * - TIM1_FLAG_CC1: TIM1 Capture Compare 1 Flag + * - TIM1_FLAG_CC2: TIM1 Capture Compare 2 Flag + * - TIM1_FLAG_CC3: TIM1 Capture Compare 3 Flag + * - TIM1_FLAG_CC4: TIM1 Capture Compare 4 Flag + * - TIM1_FLAG_COM: TIM1 Commutation Flag + * - TIM1_FLAG_TRIGGER: TIM1 Trigger Flag + * - TIM1_FLAG_BREAK: TIM1 Break Flag + * - TIM1_FLAG_CC1OF: TIM1 Capture Compare 1 overcapture Flag + * - TIM1_FLAG_CC2OF: TIM1 Capture Compare 2 overcapture Flag + * - TIM1_FLAG_CC3OF: TIM1 Capture Compare 3 overcapture Flag + * - TIM1_FLAG_CC4OF: TIM1 Capture Compare 4 overcapture Flag + * @retval FlagStatus The new state of TIM1_FLAG (SET or RESET). + */ +FlagStatus TIM1_GetFlagStatus(TIM1_FLAG_TypeDef TIM1_FLAG) +{ + FlagStatus bitstatus = RESET; + uint8_t tim1_flag_l = 0, tim1_flag_h = 0; + + /* Check the parameters */ + assert_param(IS_TIM1_GET_FLAG_OK(TIM1_FLAG)); + + tim1_flag_l = (uint8_t)(TIM1->SR1 & (uint8_t)TIM1_FLAG); + tim1_flag_h = (uint8_t)((uint16_t)TIM1_FLAG >> 8); + + if ((tim1_flag_l | (uint8_t)(TIM1->SR2 & tim1_flag_h)) != 0) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return (FlagStatus)(bitstatus); +} + +/** + * @brief Clears the TIM1’s pending flags. + * @param TIM1_FLAG specifies the flag to clear. + * This parameter can be one of the following values: + * - TIM1_FLAG_UPDATE: TIM1 update Flag + * - TIM1_FLAG_CC1: TIM1 Capture Compare 1 Flag + * - TIM1_FLAG_CC2: TIM1 Capture Compare 2 Flag + * - TIM1_FLAG_CC3: TIM1 Capture Compare 3 Flag + * - TIM1_FLAG_CC4: TIM1 Capture Compare 4 Flag + * - TIM1_FLAG_COM: TIM1 Commutation Flag + * - TIM1_FLAG_TRIGGER: TIM1 Trigger Flag + * - TIM1_FLAG_BREAK: TIM1 Break Flag + * - TIM1_FLAG_CC1OF: TIM1 Capture Compare 1 overcapture Flag + * - TIM1_FLAG_CC2OF: TIM1 Capture Compare 2 overcapture Flag + * - TIM1_FLAG_CC3OF: TIM1 Capture Compare 3 overcapture Flag + * - TIM1_FLAG_CC4OF: TIM1 Capture Compare 4 overcapture Flag + * @retval None. + */ +void TIM1_ClearFlag(TIM1_FLAG_TypeDef TIM1_FLAG) +{ + /* Check the parameters */ + assert_param(IS_TIM1_CLEAR_FLAG_OK(TIM1_FLAG)); + + /* Clear the flags (rc_w0) clear this bit by writing 0. Writing ‘1’ has no effect*/ + TIM1->SR1 = (uint8_t)(~(uint8_t)(TIM1_FLAG)); + TIM1->SR2 = (uint8_t)((uint8_t)(~((uint8_t)((uint16_t)TIM1_FLAG >> 8))) & + (uint8_t)0x1E); +} + +/** + * @brief Checks whether the TIM1 interrupt has occurred or not. + * @param TIM1_IT specifies the TIM1 interrupt source to check. + * This parameter can be one of the following values: + * - TIM1_IT_UPDATE: TIM1 update Interrupt source + * - TIM1_IT_CC1: TIM1 Capture Compare 1 Interrupt source + * - TIM1_IT_CC2: TIM1 Capture Compare 2 Interrupt source + * - TIM1_IT_CC3: TIM1 Capture Compare 3 Interrupt source + * - TIM1_IT_CC4: TIM1 Capture Compare 4 Interrupt source + * - TIM1_IT_COM: TIM1 Commutation Interrupt source + * - TIM1_IT_TRIGGER: TIM1 Trigger Interrupt source + * - TIM1_IT_BREAK: TIM1 Break Interrupt source + * @retval ITStatus The new state of the TIM1_IT(SET or RESET). + */ +ITStatus TIM1_GetITStatus(TIM1_IT_TypeDef TIM1_IT) +{ + ITStatus bitstatus = RESET; + uint8_t TIM1_itStatus = 0, TIM1_itEnable = 0; + + /* Check the parameters */ + assert_param(IS_TIM1_GET_IT_OK(TIM1_IT)); + + TIM1_itStatus = (uint8_t)(TIM1->SR1 & (uint8_t)TIM1_IT); + + TIM1_itEnable = (uint8_t)(TIM1->IER & (uint8_t)TIM1_IT); + + if ((TIM1_itStatus != (uint8_t)RESET ) && (TIM1_itEnable != (uint8_t)RESET )) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return (ITStatus)(bitstatus); +} + +/** + * @brief Clears the TIM1's interrupt pending bits. + * @param TIM1_IT specifies the pending bit to clear. + * This parameter can be one of the following values: + * - TIM1_IT_UPDATE: TIM1 update Interrupt source + * - TIM1_IT_CC1: TIM1 Capture Compare 1 Interrupt source + * - TIM1_IT_CC2: TIM1 Capture Compare 2 Interrupt source + * - TIM1_IT_CC3: TIM1 Capture Compare 3 Interrupt source + * - TIM1_IT_CC4: TIM1 Capture Compare 4 Interrupt source + * - TIM1_IT_COM: TIM1 Commutation Interrupt source + * - TIM1_IT_TRIGGER: TIM1 Trigger Interrupt source + * - TIM1_IT_BREAK: TIM1 Break Interrupt source + * @retval None. + */ +void TIM1_ClearITPendingBit(TIM1_IT_TypeDef TIM1_IT) +{ + /* Check the parameters */ + assert_param(IS_TIM1_IT_OK(TIM1_IT)); + + /* Clear the IT pending Bit */ + TIM1->SR1 = (uint8_t)(~(uint8_t)TIM1_IT); +} + +/** + * @brief Configure the TI1 as Input. + * @param TIM1_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM1_ICPOLARITY_FALLING + * - TIM1_ICPOLARITY_RISING + * @param TIM1_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM1_ICSELECTION_DIRECTTI: TIM1 Input 1 is selected to + * be connected to IC1. + * - TIM1_ICSELECTION_INDIRECTTI: TIM1 Input 1 is selected to + * be connected to IC2. + * @param TIM1_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI1_Config(uint8_t TIM1_ICPolarity, + uint8_t TIM1_ICSelection, + uint8_t TIM1_ICFilter) +{ + /* Disable the Channel 1: Reset the CCE Bit */ + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1E); + + /* Select the Input and set the filter */ + TIM1->CCMR1 = (uint8_t)((uint8_t)(TIM1->CCMR1 & (uint8_t)(~(uint8_t)( TIM1_CCMR_CCxS | TIM1_CCMR_ICxF ))) | + (uint8_t)(( (TIM1_ICSelection)) | ((uint8_t)( TIM1_ICFilter << 4)))); + + /* Select the Polarity */ + if (TIM1_ICPolarity != TIM1_ICPOLARITY_RISING) + { + TIM1->CCER1 |= TIM1_CCER1_CC1P; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC1P); + } + + /* Set the CCE Bit */ + TIM1->CCER1 |= TIM1_CCER1_CC1E; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIM1_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM1_ICPOLARITY_FALLING + * - TIM1_ICPOLARITY_RISING + * @param TIM1_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM1_ICSELECTION_DIRECTTI: TIM1 Input 2 is selected to + * be connected to IC2. + * - TIM1_ICSELECTION_INDIRECTTI: TIM1 Input 2 is selected to + * be connected to IC1. + * @param TIM1_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI2_Config(uint8_t TIM1_ICPolarity, + uint8_t TIM1_ICSelection, + uint8_t TIM1_ICFilter) +{ + /* Disable the Channel 2: Reset the CCE Bit */ + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC2E); + + /* Select the Input and set the filter */ + TIM1->CCMR2 = (uint8_t)((uint8_t)(TIM1->CCMR2 & (uint8_t)(~(uint8_t)( TIM1_CCMR_CCxS | TIM1_CCMR_ICxF ))) + | (uint8_t)(( (TIM1_ICSelection)) | ((uint8_t)( TIM1_ICFilter << 4)))); + /* Select the Polarity */ + if (TIM1_ICPolarity != TIM1_ICPOLARITY_RISING) + { + TIM1->CCER1 |= TIM1_CCER1_CC2P; + } + else + { + TIM1->CCER1 &= (uint8_t)(~TIM1_CCER1_CC2P); + } + /* Set the CCE Bit */ + TIM1->CCER1 |= TIM1_CCER1_CC2E; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIM1_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM1_ICPOLARITY_FALLING + * - TIM1_ICPOLARITY_RISING + * @param TIM1_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM1_ICSELECTION_DIRECTTI: TIM1 Input 3 is selected to + * be connected to IC3. + * - TIM1_ICSELECTION_INDIRECTTI: TIM1 Input 3 is selected to + * be connected to IC4. + * @param TIM1_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI3_Config(uint8_t TIM1_ICPolarity, + uint8_t TIM1_ICSelection, + uint8_t TIM1_ICFilter) +{ + /* Disable the Channel 3: Reset the CCE Bit */ + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC3E); + + /* Select the Input and set the filter */ + TIM1->CCMR3 = (uint8_t)((uint8_t)(TIM1->CCMR3 & (uint8_t)(~(uint8_t)( TIM1_CCMR_CCxS | TIM1_CCMR_ICxF))) + | (uint8_t)(( (TIM1_ICSelection)) | ((uint8_t)( TIM1_ICFilter << 4)))); + + /* Select the Polarity */ + if (TIM1_ICPolarity != TIM1_ICPOLARITY_RISING) + { + TIM1->CCER2 |= TIM1_CCER2_CC3P; + } + else + { + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC3P); + } + /* Set the CCE Bit */ + TIM1->CCER2 |= TIM1_CCER2_CC3E; +} + +/** + * @brief Configure the TI4 as Input. + * @param TIM1_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM1_ICPOLARITY_FALLING + * - TIM1_ICPOLARITY_RISING + * @param TIM1_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM1_ICSELECTION_DIRECTTI: TIM1 Input 4 is selected to + * be connected to IC4. + * - TIM1_ICSELECTION_INDIRECTTI: TIM1 Input 4 is selected to + * be connected to IC3. + * @param TIM1_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI4_Config(uint8_t TIM1_ICPolarity, + uint8_t TIM1_ICSelection, + uint8_t TIM1_ICFilter) +{ + /* Disable the Channel 4: Reset the CCE Bit */ + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC4E); + + /* Select the Input and set the filter */ + TIM1->CCMR4 = (uint8_t)((uint8_t)(TIM1->CCMR4 & (uint8_t)(~(uint8_t)( TIM1_CCMR_CCxS | TIM1_CCMR_ICxF ))) + | (uint8_t)(( (TIM1_ICSelection)) | ((uint8_t)( TIM1_ICFilter << 4)))); + + /* Select the Polarity */ + if (TIM1_ICPolarity != TIM1_ICPOLARITY_RISING) + { + TIM1->CCER2 |= TIM1_CCER2_CC4P; + } + else + { + TIM1->CCER2 &= (uint8_t)(~TIM1_CCER2_CC4P); + } + + /* Set the CCE Bit */ + TIM1->CCER2 |= TIM1_CCER2_CC4E; +} + + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_tim2.c b/4_EXT_INT_1PORT/lib/src/stm8s_tim2.c new file mode 100644 index 0000000..707bca0 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_tim2.c @@ -0,0 +1,1294 @@ +/** + ****************************************************************************** + * @file stm8s_tim2.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the TIM2 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_tim2.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TI1_Config(uint8_t TIM2_ICPolarity, uint8_t TIM2_ICSelection, uint8_t TIM2_ICFilter); +static void TI2_Config(uint8_t TIM2_ICPolarity, uint8_t TIM2_ICSelection, uint8_t TIM2_ICFilter); +static void TI3_Config(uint8_t TIM2_ICPolarity, uint8_t TIM2_ICSelection, uint8_t TIM2_ICFilter); +/** + * @addtogroup TIM2_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the TIM2 peripheral registers to their default reset values. + * @param None + * @retval None + */ +void TIM2_DeInit(void) +{ + TIM2->CR1 = (uint8_t)TIM2_CR1_RESET_VALUE; + TIM2->IER = (uint8_t)TIM2_IER_RESET_VALUE; + TIM2->SR2 = (uint8_t)TIM2_SR2_RESET_VALUE; + + /* Disable channels */ + TIM2->CCER1 = (uint8_t)TIM2_CCER1_RESET_VALUE; + TIM2->CCER2 = (uint8_t)TIM2_CCER2_RESET_VALUE; + + + /* Then reset channel registers: it also works if lock level is equal to 2 or 3 */ + TIM2->CCER1 = (uint8_t)TIM2_CCER1_RESET_VALUE; + TIM2->CCER2 = (uint8_t)TIM2_CCER2_RESET_VALUE; + TIM2->CCMR1 = (uint8_t)TIM2_CCMR1_RESET_VALUE; + TIM2->CCMR2 = (uint8_t)TIM2_CCMR2_RESET_VALUE; + TIM2->CCMR3 = (uint8_t)TIM2_CCMR3_RESET_VALUE; + TIM2->CNTRH = (uint8_t)TIM2_CNTRH_RESET_VALUE; + TIM2->CNTRL = (uint8_t)TIM2_CNTRL_RESET_VALUE; + TIM2->PSCR = (uint8_t)TIM2_PSCR_RESET_VALUE; + TIM2->ARRH = (uint8_t)TIM2_ARRH_RESET_VALUE; + TIM2->ARRL = (uint8_t)TIM2_ARRL_RESET_VALUE; + TIM2->CCR1H = (uint8_t)TIM2_CCR1H_RESET_VALUE; + TIM2->CCR1L = (uint8_t)TIM2_CCR1L_RESET_VALUE; + TIM2->CCR2H = (uint8_t)TIM2_CCR2H_RESET_VALUE; + TIM2->CCR2L = (uint8_t)TIM2_CCR2L_RESET_VALUE; + TIM2->CCR3H = (uint8_t)TIM2_CCR3H_RESET_VALUE; + TIM2->CCR3L = (uint8_t)TIM2_CCR3L_RESET_VALUE; + TIM2->SR1 = (uint8_t)TIM2_SR1_RESET_VALUE; +} + +/** + * @brief Initializes the TIM2 Time Base Unit according to the specified parameters. + * @param TIM2_Prescaler specifies the Prescaler from TIM2_Prescaler_TypeDef. + * @param TIM2_Period specifies the Period value. + * @retval None + */ +void TIM2_TimeBaseInit( TIM2_Prescaler_TypeDef TIM2_Prescaler, + uint16_t TIM2_Period) +{ + /* Set the Prescaler value */ + TIM2->PSCR = (uint8_t)(TIM2_Prescaler); + /* Set the Autoreload value */ + TIM2->ARRH = (uint8_t)(TIM2_Period >> 8); + TIM2->ARRL = (uint8_t)(TIM2_Period); +} + + +/** + * @brief Initializes the TIM2 Channel1 according to the specified parameters. + * @param TIM2_OCMode specifies the Output Compare mode from @ref TIM2_OCMode_TypeDef. + * @param TIM2_OutputState specifies the Output State from @ref TIM2_OutputState_TypeDef. + * @param TIM2_Pulse specifies the Pulse width value. + * @param TIM2_OCPolarity specifies the Output Compare Polarity from @ref TIM2_OCPolarity_TypeDef. + * @retval None + */ +void TIM2_OC1Init(TIM2_OCMode_TypeDef TIM2_OCMode, + TIM2_OutputState_TypeDef TIM2_OutputState, + uint16_t TIM2_Pulse, + TIM2_OCPolarity_TypeDef TIM2_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM2_OC_MODE_OK(TIM2_OCMode)); + assert_param(IS_TIM2_OUTPUT_STATE_OK(TIM2_OutputState)); + assert_param(IS_TIM2_OC_POLARITY_OK(TIM2_OCPolarity)); + + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , the Output Polarity */ + TIM2->CCER1 &= (uint8_t)(~( TIM2_CCER1_CC1E | TIM2_CCER1_CC1P)); + /* Set the Output State & Set the Output Polarity */ + TIM2->CCER1 |= (uint8_t)((uint8_t)(TIM2_OutputState & TIM2_CCER1_CC1E ) | + (uint8_t)(TIM2_OCPolarity & TIM2_CCER1_CC1P)); + + /* Reset the Output Compare Bits & Set the Ouput Compare Mode */ + TIM2->CCMR1 = (uint8_t)((uint8_t)(TIM2->CCMR1 & (uint8_t)(~TIM2_CCMR_OCM)) | + (uint8_t)TIM2_OCMode); + + /* Set the Pulse value */ + TIM2->CCR1H = (uint8_t)(TIM2_Pulse >> 8); + TIM2->CCR1L = (uint8_t)(TIM2_Pulse); +} + + +/** + * @brief Initializes the TIM2 Channel2 according to the specified parameters. + * @param TIM2_OCMode specifies the Output Compare mode from @ref TIM2_OCMode_TypeDef. + * @param TIM2_OutputState specifies the Output State from @ref TIM2_OutputState_TypeDef. + * @param TIM2_Pulse specifies the Pulse width value. + * @param TIM2_OCPolarity specifies the Output Compare Polarity from @ref TIM2_OCPolarity_TypeDef. + * @retval None + */ +void TIM2_OC2Init(TIM2_OCMode_TypeDef TIM2_OCMode, + TIM2_OutputState_TypeDef TIM2_OutputState, + uint16_t TIM2_Pulse, + TIM2_OCPolarity_TypeDef TIM2_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM2_OC_MODE_OK(TIM2_OCMode)); + assert_param(IS_TIM2_OUTPUT_STATE_OK(TIM2_OutputState)); + assert_param(IS_TIM2_OC_POLARITY_OK(TIM2_OCPolarity)); + + + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State, the Output Polarity */ + TIM2->CCER1 &= (uint8_t)(~( TIM2_CCER1_CC2E | TIM2_CCER1_CC2P )); + /* Set the Output State & Set the Output Polarity */ + TIM2->CCER1 |= (uint8_t)((uint8_t)(TIM2_OutputState & TIM2_CCER1_CC2E ) | + (uint8_t)(TIM2_OCPolarity & TIM2_CCER1_CC2P)); + + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM2->CCMR2 = (uint8_t)((uint8_t)(TIM2->CCMR2 & (uint8_t)(~TIM2_CCMR_OCM)) | + (uint8_t)TIM2_OCMode); + + + /* Set the Pulse value */ + TIM2->CCR2H = (uint8_t)(TIM2_Pulse >> 8); + TIM2->CCR2L = (uint8_t)(TIM2_Pulse); +} + + +/** + * @brief Initializes the TIM2 Channel3 according to the specified parameters. + * @param TIM2_OCMode specifies the Output Compare mode from @ref TIM2_OCMode_TypeDef. + * @param TIM2_OutputState specifies the Output State from @ref TIM2_OutputState_TypeDef. + * @param TIM2_Pulse specifies the Pulse width value. + * @param TIM2_OCPolarity specifies the Output Compare Polarity from @ref TIM2_OCPolarity_TypeDef. + * @retval None + */ +void TIM2_OC3Init(TIM2_OCMode_TypeDef TIM2_OCMode, + TIM2_OutputState_TypeDef TIM2_OutputState, + uint16_t TIM2_Pulse, + TIM2_OCPolarity_TypeDef TIM2_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM2_OC_MODE_OK(TIM2_OCMode)); + assert_param(IS_TIM2_OUTPUT_STATE_OK(TIM2_OutputState)); + assert_param(IS_TIM2_OC_POLARITY_OK(TIM2_OCPolarity)); + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State, the Output Polarity */ + TIM2->CCER2 &= (uint8_t)(~( TIM2_CCER2_CC3E | TIM2_CCER2_CC3P)); + /* Set the Output State & Set the Output Polarity */ + TIM2->CCER2 |= (uint8_t)((uint8_t)(TIM2_OutputState & TIM2_CCER2_CC3E) | + (uint8_t)(TIM2_OCPolarity & TIM2_CCER2_CC3P)); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM2->CCMR3 = (uint8_t)((uint8_t)(TIM2->CCMR3 & (uint8_t)(~TIM2_CCMR_OCM)) | + (uint8_t)TIM2_OCMode); + + /* Set the Pulse value */ + TIM2->CCR3H = (uint8_t)(TIM2_Pulse >> 8); + TIM2->CCR3L = (uint8_t)(TIM2_Pulse); +} + +/** + * @brief Initializes the TIM2 peripheral according to the specified parameters. + * @param TIM2_Channel specifies the Input Capture Channel from @ref TIM2_Channel_TypeDef. + * @param TIM2_ICPolarity specifies the Input Capture Polarity from @ref TIM2_ICPolarity_TypeDef. + * @param TIM2_ICSelection specifies the Input Capture Selection from @ref TIM2_ICSelection_TypeDef. + * @param TIM2_ICPrescaler specifies the Input Capture Prescaler from @ref TIM2_ICPSC_TypeDef. + * @param TIM2_ICFilter specifies the Input Capture Filter value (value can be an integer from 0x00 to 0x0F). + * @retval None + */ +void TIM2_ICInit(TIM2_Channel_TypeDef TIM2_Channel, + TIM2_ICPolarity_TypeDef TIM2_ICPolarity, + TIM2_ICSelection_TypeDef TIM2_ICSelection, + TIM2_ICPSC_TypeDef TIM2_ICPrescaler, + uint8_t TIM2_ICFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM2_CHANNEL_OK(TIM2_Channel)); + assert_param(IS_TIM2_IC_POLARITY_OK(TIM2_ICPolarity)); + assert_param(IS_TIM2_IC_SELECTION_OK(TIM2_ICSelection)); + assert_param(IS_TIM2_IC_PRESCALER_OK(TIM2_ICPrescaler)); + assert_param(IS_TIM2_IC_FILTER_OK(TIM2_ICFilter)); + + if (TIM2_Channel == TIM2_CHANNEL_1) + { + /* TI1 Configuration */ + TI1_Config((uint8_t)TIM2_ICPolarity, + (uint8_t)TIM2_ICSelection, + (uint8_t)TIM2_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM2_SetIC1Prescaler(TIM2_ICPrescaler); + } + else if (TIM2_Channel == TIM2_CHANNEL_2) + { + /* TI2 Configuration */ + TI2_Config((uint8_t)TIM2_ICPolarity, + (uint8_t)TIM2_ICSelection, + (uint8_t)TIM2_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM2_SetIC2Prescaler(TIM2_ICPrescaler); + } + else + { + /* TI3 Configuration */ + TI3_Config((uint8_t)TIM2_ICPolarity, + (uint8_t)TIM2_ICSelection, + (uint8_t)TIM2_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM2_SetIC3Prescaler(TIM2_ICPrescaler); + } +} + +/** + * @brief Configures the TIM2 peripheral in PWM Input Mode according to the specified parameters. + * @param TIM2_Channel specifies the Input Capture Channel from @ref TIM2_Channel_TypeDef. + * @param TIM2_ICPolarity specifies the Input Capture Polarity from @ref TIM2_ICPolarity_TypeDef. + * @param TIM2_ICSelection specifies the Input Capture Selection from @ref TIM2_ICSelection_TypeDef. + * @param TIM2_ICPrescaler specifies the Input Capture Prescaler from @ref TIM2_ICPSC_TypeDef. + * @param TIM2_ICFilter specifies the Input Capture Filter value (value can be an integer from 0x00 to 0x0F). + * @retval None + */ +void TIM2_PWMIConfig(TIM2_Channel_TypeDef TIM2_Channel, + TIM2_ICPolarity_TypeDef TIM2_ICPolarity, + TIM2_ICSelection_TypeDef TIM2_ICSelection, + TIM2_ICPSC_TypeDef TIM2_ICPrescaler, + uint8_t TIM2_ICFilter) +{ + uint8_t icpolarity = (uint8_t)TIM2_ICPOLARITY_RISING; + uint8_t icselection = (uint8_t)TIM2_ICSELECTION_DIRECTTI; + + /* Check the parameters */ + assert_param(IS_TIM2_PWMI_CHANNEL_OK(TIM2_Channel)); + assert_param(IS_TIM2_IC_POLARITY_OK(TIM2_ICPolarity)); + assert_param(IS_TIM2_IC_SELECTION_OK(TIM2_ICSelection)); + assert_param(IS_TIM2_IC_PRESCALER_OK(TIM2_ICPrescaler)); + + /* Select the Opposite Input Polarity */ + if (TIM2_ICPolarity != TIM2_ICPOLARITY_FALLING) + { + icpolarity = (uint8_t)TIM2_ICPOLARITY_FALLING; + } + else + { + icpolarity = (uint8_t)TIM2_ICPOLARITY_RISING; + } + + /* Select the Opposite Input */ + if (TIM2_ICSelection == TIM2_ICSELECTION_DIRECTTI) + { + icselection = (uint8_t)TIM2_ICSELECTION_INDIRECTTI; + } + else + { + icselection = (uint8_t)TIM2_ICSELECTION_DIRECTTI; + } + + if (TIM2_Channel == TIM2_CHANNEL_1) + { + /* TI1 Configuration */ + TI1_Config((uint8_t)TIM2_ICPolarity, (uint8_t)TIM2_ICSelection, + (uint8_t)TIM2_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM2_SetIC1Prescaler(TIM2_ICPrescaler); + + /* TI2 Configuration */ + TI2_Config(icpolarity, icselection, TIM2_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM2_SetIC2Prescaler(TIM2_ICPrescaler); + } + else + { + /* TI2 Configuration */ + TI2_Config((uint8_t)TIM2_ICPolarity, (uint8_t)TIM2_ICSelection, + (uint8_t)TIM2_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM2_SetIC2Prescaler(TIM2_ICPrescaler); + + /* TI1 Configuration */ + TI1_Config((uint8_t)icpolarity, icselection, (uint8_t)TIM2_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM2_SetIC1Prescaler(TIM2_ICPrescaler); + } +} + +/** + * @brief Enables or disables the TIM2 peripheral. + * @param NewState new state of the TIM2 peripheral. This parameter can + * be ENABLE or DISABLE. + * @retval None + */ +void TIM2_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* set or Reset the CEN Bit */ + if (NewState != DISABLE) + { + TIM2->CR1 |= (uint8_t)TIM2_CR1_CEN; + } + else + { + TIM2->CR1 &= (uint8_t)(~TIM2_CR1_CEN); + } +} + +/** + * @brief Enables or disables the specified TIM2 interrupts. + * @param NewState new state of the TIM2 peripheral. + * This parameter can be: ENABLE or DISABLE. + * @param TIM2_IT specifies the TIM2 interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * - TIM2_IT_UPDATE: TIM2 update Interrupt source + * - TIM2_IT_CC1: TIM2 Capture Compare 1 Interrupt source + * - TIM2_IT_CC2: TIM2 Capture Compare 2 Interrupt source + * - TIM2_IT_CC3: TIM2 Capture Compare 3 Interrupt source + * @param NewState new state of the TIM2 peripheral. + * @retval None + */ +void TIM2_ITConfig(TIM2_IT_TypeDef TIM2_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM2_IT_OK(TIM2_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt sources */ + TIM2->IER |= (uint8_t)TIM2_IT; + } + else + { + /* Disable the Interrupt sources */ + TIM2->IER &= (uint8_t)(~TIM2_IT); + } +} + +/** + * @brief Enables or Disables the TIM2 Update event. + * @param NewState new state of the TIM2 peripheral Preload register. This parameter can + * be ENABLE or DISABLE. + * @retval None + */ +void TIM2_UpdateDisableConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the UDIS Bit */ + if (NewState != DISABLE) + { + TIM2->CR1 |= (uint8_t)TIM2_CR1_UDIS; + } + else + { + TIM2->CR1 &= (uint8_t)(~TIM2_CR1_UDIS); + } +} + +/** + * @brief Selects the TIM2 Update Request Interrupt source. + * @param TIM2_UpdateSource specifies the Update source. + * This parameter can be one of the following values + * - TIM2_UPDATESOURCE_REGULAR + * - TIM2_UPDATESOURCE_GLOBAL + * @retval None + */ +void TIM2_UpdateRequestConfig(TIM2_UpdateSource_TypeDef TIM2_UpdateSource) +{ + /* Check the parameters */ + assert_param(IS_TIM2_UPDATE_SOURCE_OK(TIM2_UpdateSource)); + + /* Set or Reset the URS Bit */ + if (TIM2_UpdateSource != TIM2_UPDATESOURCE_GLOBAL) + { + TIM2->CR1 |= (uint8_t)TIM2_CR1_URS; + } + else + { + TIM2->CR1 &= (uint8_t)(~TIM2_CR1_URS); + } +} + +/** + * @brief Selects the TIM2’s One Pulse Mode. + * @param TIM2_OPMode specifies the OPM Mode to be used. + * This parameter can be one of the following values + * - TIM2_OPMODE_SINGLE + * - TIM2_OPMODE_REPETITIVE + * @retval None + */ +void TIM2_SelectOnePulseMode(TIM2_OPMode_TypeDef TIM2_OPMode) +{ + /* Check the parameters */ + assert_param(IS_TIM2_OPM_MODE_OK(TIM2_OPMode)); + + /* Set or Reset the OPM Bit */ + if (TIM2_OPMode != TIM2_OPMODE_REPETITIVE) + { + TIM2->CR1 |= (uint8_t)TIM2_CR1_OPM; + } + else + { + TIM2->CR1 &= (uint8_t)(~TIM2_CR1_OPM); + } +} + +/** + * @brief Configures the TIM2 Prescaler. + * @param Prescaler specifies the Prescaler Register value + * This parameter can be one of the following values + * - TIM2_PRESCALER_1 + * - TIM2_PRESCALER_2 + * - TIM2_PRESCALER_4 + * - TIM2_PRESCALER_8 + * - TIM2_PRESCALER_16 + * - TIM2_PRESCALER_32 + * - TIM2_PRESCALER_64 + * - TIM2_PRESCALER_128 + * - TIM2_PRESCALER_256 + * - TIM2_PRESCALER_512 + * - TIM2_PRESCALER_1024 + * - TIM2_PRESCALER_2048 + * - TIM2_PRESCALER_4096 + * - TIM2_PRESCALER_8192 + * - TIM2_PRESCALER_16384 + * - TIM2_PRESCALER_32768 + * @param TIM2_PSCReloadMode specifies the TIM2 Prescaler Reload mode. + * This parameter can be one of the following values + * - TIM2_PSCRELOADMODE_IMMEDIATE: The Prescaler is loaded + * immediately. + * - TIM2_PSCRELOADMODE_UPDATE: The Prescaler is loaded at + * the update event. + * @retval None + */ +void TIM2_PrescalerConfig(TIM2_Prescaler_TypeDef Prescaler, + TIM2_PSCReloadMode_TypeDef TIM2_PSCReloadMode) +{ + /* Check the parameters */ + assert_param(IS_TIM2_PRESCALER_RELOAD_OK(TIM2_PSCReloadMode)); + assert_param(IS_TIM2_PRESCALER_OK(Prescaler)); + + /* Set the Prescaler value */ + TIM2->PSCR = (uint8_t)Prescaler; + + /* Set or reset the UG Bit */ + TIM2->EGR = (uint8_t)TIM2_PSCReloadMode; +} + +/** + * @brief Forces the TIM2 Channel1 output waveform to active or inactive level. + * @param TIM2_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM2_FORCEDACTION_ACTIVE: Force active level on OC1REF + * - TIM2_FORCEDACTION_INACTIVE: Force inactive level on + * OC1REF. + * @retval None + */ +void TIM2_ForcedOC1Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM2_FORCED_ACTION_OK(TIM2_ForcedAction)); + + /* Reset the OCM Bits & Configure the Forced output Mode */ + TIM2->CCMR1 = (uint8_t)((uint8_t)(TIM2->CCMR1 & (uint8_t)(~TIM2_CCMR_OCM)) + | (uint8_t)TIM2_ForcedAction); +} + +/** + * @brief Forces the TIM2 Channel2 output waveform to active or inactive level. + * @param TIM2_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM2_FORCEDACTION_ACTIVE: Force active level on OC2REF + * - TIM2_FORCEDACTION_INACTIVE: Force inactive level on + * OC2REF. + * @retval None + */ +void TIM2_ForcedOC2Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM2_FORCED_ACTION_OK(TIM2_ForcedAction)); + + /* Reset the OCM Bits & Configure the Forced output Mode */ + TIM2->CCMR2 = (uint8_t)((uint8_t)(TIM2->CCMR2 & (uint8_t)(~TIM2_CCMR_OCM)) + | (uint8_t)TIM2_ForcedAction); +} + +/** + * @brief Forces the TIM2 Channel3 output waveform to active or inactive level. + * @param TIM2_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM2_FORCEDACTION_ACTIVE: Force active level on OC3REF + * - TIM2_FORCEDACTION_INACTIVE: Force inactive level on + * OC3REF. + * @retval None + */ +void TIM2_ForcedOC3Config(TIM2_ForcedAction_TypeDef TIM2_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM2_FORCED_ACTION_OK(TIM2_ForcedAction)); + + /* Reset the OCM Bits & Configure the Forced output Mode */ + TIM2->CCMR3 = (uint8_t)((uint8_t)(TIM2->CCMR3 & (uint8_t)(~TIM2_CCMR_OCM)) + | (uint8_t)TIM2_ForcedAction); +} + +/** + * @brief Enables or disables TIM2 peripheral Preload register on ARR. + * @param NewState new state of the TIM2 peripheral Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM2_ARRPreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the ARPE Bit */ + if (NewState != DISABLE) + { + TIM2->CR1 |= (uint8_t)TIM2_CR1_ARPE; + } + else + { + TIM2->CR1 &= (uint8_t)(~TIM2_CR1_ARPE); + } +} + +/** + * @brief Enables or disables the TIM2 peripheral Preload Register on CCR1. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM2_OC1PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC1PE Bit */ + if (NewState != DISABLE) + { + TIM2->CCMR1 |= (uint8_t)TIM2_CCMR_OCxPE; + } + else + { + TIM2->CCMR1 &= (uint8_t)(~TIM2_CCMR_OCxPE); + } +} + +/** + * @brief Enables or disables the TIM2 peripheral Preload Register on CCR2. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM2_OC2PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC2PE Bit */ + if (NewState != DISABLE) + { + TIM2->CCMR2 |= (uint8_t)TIM2_CCMR_OCxPE; + } + else + { + TIM2->CCMR2 &= (uint8_t)(~TIM2_CCMR_OCxPE); + } +} + +/** + * @brief Enables or disables the TIM2 peripheral Preload Register on CCR3. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM2_OC3PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC3PE Bit */ + if (NewState != DISABLE) + { + TIM2->CCMR3 |= (uint8_t)TIM2_CCMR_OCxPE; + } + else + { + TIM2->CCMR3 &= (uint8_t)(~TIM2_CCMR_OCxPE); + } +} + +/** + * @brief Configures the TIM2 event to be generated by software. + * @param TIM2_EventSource specifies the event source. + * This parameter can be one of the following values: + * - TIM2_EVENTSOURCE_UPDATE: TIM2 update Event source + * - TIM2_EVENTSOURCE_CC1: TIM2 Capture Compare 1 Event source + * - TIM2_EVENTSOURCE_CC2: TIM2 Capture Compare 2 Event source + * - TIM2_EVENTSOURCE_CC3: TIM2 Capture Compare 3 Event source + * @retval None + */ +void TIM2_GenerateEvent(TIM2_EventSource_TypeDef TIM2_EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM2_EVENT_SOURCE_OK(TIM2_EventSource)); + + /* Set the event sources */ + TIM2->EGR = (uint8_t)TIM2_EventSource; +} + +/** + * @brief Configures the TIM2 Channel 1 polarity. + * @param TIM2_OCPolarity specifies the OC1 Polarity. + * This parameter can be one of the following values: + * - TIM2_OCPOLARITY_LOW: Output Compare active low + * - TIM2_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM2_OC1PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM2_OC_POLARITY_OK(TIM2_OCPolarity)); + + /* Set or Reset the CC1P Bit */ + if (TIM2_OCPolarity != TIM2_OCPOLARITY_HIGH) + { + TIM2->CCER1 |= (uint8_t)TIM2_CCER1_CC1P; + } + else + { + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC1P); + } +} + +/** + * @brief Configures the TIM2 Channel 2 polarity. + * @param TIM2_OCPolarity specifies the OC2 Polarity. + * This parameter can be one of the following values: + * - TIM2_OCPOLARITY_LOW: Output Compare active low + * - TIM2_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM2_OC2PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM2_OC_POLARITY_OK(TIM2_OCPolarity)); + + /* Set or Reset the CC2P Bit */ + if (TIM2_OCPolarity != TIM2_OCPOLARITY_HIGH) + { + TIM2->CCER1 |= TIM2_CCER1_CC2P; + } + else + { + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC2P); + } +} + +/** + * @brief Configures the TIM2 Channel 3 polarity. + * @param TIM2_OCPolarity specifies the OC3 Polarity. + * This parameter can be one of the following values: + * - TIM2_OCPOLARITY_LOW: Output Compare active low + * - TIM2_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM2_OC3PolarityConfig(TIM2_OCPolarity_TypeDef TIM2_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM2_OC_POLARITY_OK(TIM2_OCPolarity)); + + /* Set or Reset the CC3P Bit */ + if (TIM2_OCPolarity != TIM2_OCPOLARITY_HIGH) + { + TIM2->CCER2 |= (uint8_t)TIM2_CCER2_CC3P; + } + else + { + TIM2->CCER2 &= (uint8_t)(~TIM2_CCER2_CC3P); + } +} + +/** + * @brief Enables or disables the TIM2 Capture Compare Channel x. + * @param TIM2_Channel specifies the TIM2 Channel. + * This parameter can be one of the following values: + * - TIM2_CHANNEL_1: TIM2 Channel1 + * - TIM2_CHANNEL_2: TIM2 Channel2 + * - TIM2_CHANNEL_3: TIM2 Channel3 + * @param NewState specifies the TIM2 Channel CCxE bit new state. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM2_CCxCmd(TIM2_Channel_TypeDef TIM2_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM2_CHANNEL_OK(TIM2_Channel)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (TIM2_Channel == TIM2_CHANNEL_1) + { + /* Set or Reset the CC1E Bit */ + if (NewState != DISABLE) + { + TIM2->CCER1 |= (uint8_t)TIM2_CCER1_CC1E; + } + else + { + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC1E); + } + + } + else if (TIM2_Channel == TIM2_CHANNEL_2) + { + /* Set or Reset the CC2E Bit */ + if (NewState != DISABLE) + { + TIM2->CCER1 |= (uint8_t)TIM2_CCER1_CC2E; + } + else + { + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC2E); + } + } + else + { + /* Set or Reset the CC3E Bit */ + if (NewState != DISABLE) + { + TIM2->CCER2 |= (uint8_t)TIM2_CCER2_CC3E; + } + else + { + TIM2->CCER2 &= (uint8_t)(~TIM2_CCER2_CC3E); + } + } +} + +/** + * @brief Selects the TIM2 Output Compare Mode. This function disables the + * selected channel before changing the Output Compare Mode. User has to + * enable this channel using TIM2_CCxCmd and TIM2_CCxNCmd functions. + * @param TIM2_Channel specifies the TIM2 Channel. + * This parameter can be one of the following values: + * - TIM2_CHANNEL_1: TIM2 Channel1 + * - TIM2_CHANNEL_2: TIM2 Channel2 + * - TIM2_CHANNEL_3: TIM2 Channel3 + * @param TIM2_OCMode specifies the TIM2 Output Compare Mode. + * This parameter can be one of the following values: + * - TIM2_OCMODE_TIMING + * - TIM2_OCMODE_ACTIVE + * - TIM2_OCMODE_TOGGLE + * - TIM2_OCMODE_PWM1 + * - TIM2_OCMODE_PWM2 + * - TIM2_FORCEDACTION_ACTIVE + * - TIM2_FORCEDACTION_INACTIVE + * @retval None + */ +void TIM2_SelectOCxM(TIM2_Channel_TypeDef TIM2_Channel, TIM2_OCMode_TypeDef TIM2_OCMode) +{ + /* Check the parameters */ + assert_param(IS_TIM2_CHANNEL_OK(TIM2_Channel)); + assert_param(IS_TIM2_OCM_OK(TIM2_OCMode)); + + if (TIM2_Channel == TIM2_CHANNEL_1) + { + /* Disable the Channel 1: Reset the CCE Bit */ + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC1E); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM2->CCMR1 = (uint8_t)((uint8_t)(TIM2->CCMR1 & (uint8_t)(~TIM2_CCMR_OCM)) + | (uint8_t)TIM2_OCMode); + } + else if (TIM2_Channel == TIM2_CHANNEL_2) + { + /* Disable the Channel 2: Reset the CCE Bit */ + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC2E); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM2->CCMR2 = (uint8_t)((uint8_t)(TIM2->CCMR2 & (uint8_t)(~TIM2_CCMR_OCM)) + | (uint8_t)TIM2_OCMode); + } + else + { + /* Disable the Channel 3: Reset the CCE Bit */ + TIM2->CCER2 &= (uint8_t)(~TIM2_CCER2_CC3E); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM2->CCMR3 = (uint8_t)((uint8_t)(TIM2->CCMR3 & (uint8_t)(~TIM2_CCMR_OCM)) + | (uint8_t)TIM2_OCMode); + } +} + +/** + * @brief Sets the TIM2 Counter Register value. + * @param Counter specifies the Counter register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM2_SetCounter(uint16_t Counter) +{ + /* Set the Counter Register value */ + TIM2->CNTRH = (uint8_t)(Counter >> 8); + TIM2->CNTRL = (uint8_t)(Counter); +} + +/** + * @brief Sets the TIM2 Autoreload Register value. + * @param Autoreload specifies the Autoreload register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM2_SetAutoreload(uint16_t Autoreload) +{ + /* Set the Autoreload Register value */ + TIM2->ARRH = (uint8_t)(Autoreload >> 8); + TIM2->ARRL = (uint8_t)(Autoreload); +} + +/** + * @brief Sets the TIM2 Capture Compare1 Register value. + * @param Compare1 specifies the Capture Compare1 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM2_SetCompare1(uint16_t Compare1) +{ + /* Set the Capture Compare1 Register value */ + TIM2->CCR1H = (uint8_t)(Compare1 >> 8); + TIM2->CCR1L = (uint8_t)(Compare1); +} + +/** + * @brief Sets the TIM2 Capture Compare2 Register value. + * @param Compare2 specifies the Capture Compare2 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM2_SetCompare2(uint16_t Compare2) +{ + /* Set the Capture Compare2 Register value */ + TIM2->CCR2H = (uint8_t)(Compare2 >> 8); + TIM2->CCR2L = (uint8_t)(Compare2); +} + +/** + * @brief Sets the TIM2 Capture Compare3 Register value. + * @param Compare3 specifies the Capture Compare3 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM2_SetCompare3(uint16_t Compare3) +{ + /* Set the Capture Compare3 Register value */ + TIM2->CCR3H = (uint8_t)(Compare3 >> 8); + TIM2->CCR3L = (uint8_t)(Compare3); +} + +/** + * @brief Sets the TIM2 Input Capture 1 Prescaler. + * @param TIM2_IC1Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM2_ICPSC_DIV1: no prescaler + * - TIM2_ICPSC_DIV2: capture is done once every 2 events + * - TIM2_ICPSC_DIV4: capture is done once every 4 events + * - TIM2_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM2_SetIC1Prescaler(TIM2_ICPSC_TypeDef TIM2_IC1Prescaler) +{ + /* Check the parameters */ + assert_param(IS_TIM2_IC_PRESCALER_OK(TIM2_IC1Prescaler)); + + /* Reset the IC1PSC Bits &Set the IC1PSC value */ + TIM2->CCMR1 = (uint8_t)((uint8_t)(TIM2->CCMR1 & (uint8_t)(~TIM2_CCMR_ICxPSC)) + | (uint8_t)TIM2_IC1Prescaler); +} + +/** + * @brief Sets the TIM2 Input Capture 2 prescaler. + * @param TIM2_IC2Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM2_ICPSC_DIV1: no prescaler + * - TIM2_ICPSC_DIV2: capture is done once every 2 events + * - TIM2_ICPSC_DIV4: capture is done once every 4 events + * - TIM2_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM2_SetIC2Prescaler(TIM2_ICPSC_TypeDef TIM2_IC2Prescaler) +{ + /* Check the parameters */ + assert_param(IS_TIM2_IC_PRESCALER_OK(TIM2_IC2Prescaler)); + + /* Reset the IC1PSC Bits &Set the IC1PSC value */ + TIM2->CCMR2 = (uint8_t)((uint8_t)(TIM2->CCMR2 & (uint8_t)(~TIM2_CCMR_ICxPSC)) + | (uint8_t)TIM2_IC2Prescaler); +} + +/** + * @brief Sets the TIM2 Input Capture 3 prescaler. + * @param TIM2_IC3Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM2_ICPSC_DIV1: no prescaler + * - TIM2_ICPSC_DIV2: capture is done once every 2 events + * - TIM2_ICPSC_DIV4: capture is done once every 4 events + * - TIM2_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM2_SetIC3Prescaler(TIM2_ICPSC_TypeDef TIM2_IC3Prescaler) +{ + + /* Check the parameters */ + assert_param(IS_TIM2_IC_PRESCALER_OK(TIM2_IC3Prescaler)); + /* Reset the IC1PSC Bits &Set the IC1PSC value */ + TIM2->CCMR3 = (uint8_t)((uint8_t)(TIM2->CCMR3 & (uint8_t)(~TIM2_CCMR_ICxPSC)) + | (uint8_t)TIM2_IC3Prescaler); +} + +/** + * @brief Gets the TIM2 Input Capture 1 value. + * @param None + * @retval Capture Compare 1 Register value. + */ +uint16_t TIM2_GetCapture1(void) +{ + /* Get the Capture 1 Register value */ + uint16_t tmpccr1 = 0; + uint8_t tmpccr1l=0, tmpccr1h=0; + + tmpccr1h = TIM2->CCR1H; + tmpccr1l = TIM2->CCR1L; + + tmpccr1 = (uint16_t)(tmpccr1l); + tmpccr1 |= (uint16_t)((uint16_t)tmpccr1h << 8); + /* Get the Capture 1 Register value */ + return (uint16_t)tmpccr1; +} + +/** + * @brief Gets the TIM2 Input Capture 2 value. + * @param None + * @retval Capture Compare 2 Register value. + */ +uint16_t TIM2_GetCapture2(void) +{ + /* Get the Capture 2 Register value */ + uint16_t tmpccr2 = 0; + uint8_t tmpccr2l=0, tmpccr2h=0; + + tmpccr2h = TIM2->CCR2H; + tmpccr2l = TIM2->CCR2L; + + tmpccr2 = (uint16_t)(tmpccr2l); + tmpccr2 |= (uint16_t)((uint16_t)tmpccr2h << 8); + /* Get the Capture 2 Register value */ + return (uint16_t)tmpccr2; +} + +/** + * @brief Gets the TIM2 Input Capture 3 value. + * @param None + * @retval Capture Compare 3 Register value. + */ +uint16_t TIM2_GetCapture3(void) +{ + /* Get the Capture 3 Register value */ + uint16_t tmpccr3 = 0; + uint8_t tmpccr3l=0, tmpccr3h=0; + + tmpccr3h = TIM2->CCR3H; + tmpccr3l = TIM2->CCR3L; + + tmpccr3 = (uint16_t)(tmpccr3l); + tmpccr3 |= (uint16_t)((uint16_t)tmpccr3h << 8); + /* Get the Capture 3 Register value */ + return (uint16_t)tmpccr3; +} + +/** + * @brief Gets the TIM2 Counter value. + * @param None + * @retval Counter Register value. + */ +uint16_t TIM2_GetCounter(void) +{ + uint16_t tmpcntr = 0; + + tmpcntr = ((uint16_t)TIM2->CNTRH << 8); + /* Get the Counter Register value */ + return (uint16_t)( tmpcntr| (uint16_t)(TIM2->CNTRL)); +} + +/** + * @brief Gets the TIM2 Prescaler value. + * @param None + * @retval Prescaler Register configuration value @ref TIM2_Prescaler_TypeDef. + */ +TIM2_Prescaler_TypeDef TIM2_GetPrescaler(void) +{ + /* Get the Prescaler Register value */ + return (TIM2_Prescaler_TypeDef)(TIM2->PSCR); +} + +/** + * @brief Checks whether the specified TIM2 flag is set or not. + * @param TIM2_FLAG specifies the flag to check. + * This parameter can be one of the following values: + * - TIM2_FLAG_UPDATE: TIM2 update Flag + * - TIM2_FLAG_CC1: TIM2 Capture Compare 1 Flag + * - TIM2_FLAG_CC2: TIM2 Capture Compare 2 Flag + * - TIM2_FLAG_CC3: TIM2 Capture Compare 3 Flag + * - TIM2_FLAG_CC1OF: TIM2 Capture Compare 1 over capture Flag + * - TIM2_FLAG_CC2OF: TIM2 Capture Compare 2 over capture Flag + * - TIM2_FLAG_CC3OF: TIM2 Capture Compare 3 over capture Flag + * @retval FlagStatus The new state of TIM2_FLAG (SET or RESET). + */ +FlagStatus TIM2_GetFlagStatus(TIM2_FLAG_TypeDef TIM2_FLAG) +{ + FlagStatus bitstatus = RESET; + uint8_t tim2_flag_l = 0, tim2_flag_h = 0; + + /* Check the parameters */ + assert_param(IS_TIM2_GET_FLAG_OK(TIM2_FLAG)); + + tim2_flag_l = (uint8_t)(TIM2->SR1 & (uint8_t)TIM2_FLAG); + tim2_flag_h = (uint8_t)((uint16_t)TIM2_FLAG >> 8); + + if ((tim2_flag_l | (uint8_t)(TIM2->SR2 & tim2_flag_h)) != (uint8_t)RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return (FlagStatus)bitstatus; +} + +/** + * @brief Clears the TIM2’s pending flags. + * @param TIM2_FLAG specifies the flag to clear. + * This parameter can be one of the following values: + * - TIM2_FLAG_UPDATE: TIM2 update Flag + * - TIM2_FLAG_CC1: TIM2 Capture Compare 1 Flag + * - TIM2_FLAG_CC2: TIM2 Capture Compare 2 Flag + * - TIM2_FLAG_CC3: TIM2 Capture Compare 3 Flag + * - TIM2_FLAG_CC1OF: TIM2 Capture Compare 1 over capture Flag + * - TIM2_FLAG_CC2OF: TIM2 Capture Compare 2 over capture Flag + * - TIM2_FLAG_CC3OF: TIM2 Capture Compare 3 over capture Flag + * @retval None. + */ +void TIM2_ClearFlag(TIM2_FLAG_TypeDef TIM2_FLAG) +{ + /* Check the parameters */ + assert_param(IS_TIM2_CLEAR_FLAG_OK(TIM2_FLAG)); + + /* Clear the flags (rc_w0) clear this bit by writing 0. Writing ‘1’ has no effect*/ + TIM2->SR1 = (uint8_t)(~((uint8_t)(TIM2_FLAG))); + TIM2->SR2 = (uint8_t)(~((uint8_t)((uint8_t)TIM2_FLAG >> 8))); +} + +/** + * @brief Checks whether the TIM2 interrupt has occurred or not. + * @param TIM2_IT specifies the TIM2 interrupt source to check. + * This parameter can be one of the following values: + * - TIM2_IT_UPDATE: TIM2 update Interrupt source + * - TIM2_IT_CC1: TIM2 Capture Compare 1 Interrupt source + * - TIM2_IT_CC2: TIM2 Capture Compare 2 Interrupt source + * - TIM2_IT_CC3: TIM2 Capture Compare 3 Interrupt source + * @retval ITStatus The new state of the TIM2_IT(SET or RESET). + */ +ITStatus TIM2_GetITStatus(TIM2_IT_TypeDef TIM2_IT) +{ + ITStatus bitstatus = RESET; + uint8_t TIM2_itStatus = 0, TIM2_itEnable = 0; + + /* Check the parameters */ + assert_param(IS_TIM2_GET_IT_OK(TIM2_IT)); + + TIM2_itStatus = (uint8_t)(TIM2->SR1 & TIM2_IT); + + TIM2_itEnable = (uint8_t)(TIM2->IER & TIM2_IT); + + if ((TIM2_itStatus != (uint8_t)RESET ) && (TIM2_itEnable != (uint8_t)RESET )) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return (ITStatus)(bitstatus); +} + +/** + * @brief Clears the TIM2's interrupt pending bits. + * @param TIM2_IT specifies the pending bit to clear. + * This parameter can be one of the following values: + * - TIM2_IT_UPDATE: TIM2 update Interrupt source + * - TIM2_IT_CC1: TIM2 Capture Compare 1 Interrupt source + * - TIM2_IT_CC2: TIM2 Capture Compare 2 Interrupt source + * - TIM2_IT_CC3: TIM2 Capture Compare 3 Interrupt source + * @retval None. + */ +void TIM2_ClearITPendingBit(TIM2_IT_TypeDef TIM2_IT) +{ + /* Check the parameters */ + assert_param(IS_TIM2_IT_OK(TIM2_IT)); + + /* Clear the IT pending Bit */ + TIM2->SR1 = (uint8_t)(~TIM2_IT); +} + +/** + * @brief Configure the TI1 as Input. + * @param TIM2_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM2_ICPOLARITY_FALLING + * - TIM2_ICPOLARITY_RISING + * @param TIM2_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM2_ICSELECTION_DIRECTTI: TIM2 Input 1 is selected to + * be connected to IC1. + * - TIM2_ICSELECTION_INDIRECTTI: TIM2 Input 1 is selected to + * be connected to IC2. + * @param TIM2_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI1_Config(uint8_t TIM2_ICPolarity, + uint8_t TIM2_ICSelection, + uint8_t TIM2_ICFilter) +{ + /* Disable the Channel 1: Reset the CCE Bit */ + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC1E); + + /* Select the Input and set the filter */ + TIM2->CCMR1 = (uint8_t)((uint8_t)(TIM2->CCMR1 & (uint8_t)(~(uint8_t)( TIM2_CCMR_CCxS | TIM2_CCMR_ICxF ))) + | (uint8_t)(((TIM2_ICSelection)) | ((uint8_t)( TIM2_ICFilter << 4)))); + + /* Select the Polarity */ + if (TIM2_ICPolarity != TIM2_ICPOLARITY_RISING) + { + TIM2->CCER1 |= TIM2_CCER1_CC1P; + } + else + { + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC1P); + } + /* Set the CCE Bit */ + TIM2->CCER1 |= TIM2_CCER1_CC1E; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIM2_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM2_ICPOLARITY_FALLING + * - TIM2_ICPOLARITY_RISING + * @param TIM2_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM2_ICSELECTION_DIRECTTI: TIM2 Input 2 is selected to + * be connected to IC2. + * - TIM2_ICSELECTION_INDIRECTTI: TIM2 Input 2 is selected to + * be connected to IC1. + * @param TIM2_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI2_Config(uint8_t TIM2_ICPolarity, + uint8_t TIM2_ICSelection, + uint8_t TIM2_ICFilter) +{ + /* Disable the Channel 2: Reset the CCE Bit */ + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC2E); + + /* Select the Input and set the filter */ + TIM2->CCMR2 = (uint8_t)((uint8_t)(TIM2->CCMR2 & (uint8_t)(~(uint8_t)( TIM2_CCMR_CCxS | TIM2_CCMR_ICxF ))) + | (uint8_t)(( (TIM2_ICSelection)) | ((uint8_t)( TIM2_ICFilter << 4)))); + + + /* Select the Polarity */ + if (TIM2_ICPolarity != TIM2_ICPOLARITY_RISING) + { + TIM2->CCER1 |= TIM2_CCER1_CC2P; + } + else + { + TIM2->CCER1 &= (uint8_t)(~TIM2_CCER1_CC2P); + } + + /* Set the CCE Bit */ + TIM2->CCER1 |= TIM2_CCER1_CC2E; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIM2_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM2_ICPOLARITY_FALLING + * - TIM2_ICPOLARITY_RISING + * @param TIM2_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM2_ICSELECTION_DIRECTTI: TIM2 Input 3 is selected to + * be connected to IC3. + * @param TIM2_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI3_Config(uint8_t TIM2_ICPolarity, uint8_t TIM2_ICSelection, + uint8_t TIM2_ICFilter) +{ + /* Disable the Channel 3: Reset the CCE Bit */ + TIM2->CCER2 &= (uint8_t)(~TIM2_CCER2_CC3E); + + /* Select the Input and set the filter */ + TIM2->CCMR3 = (uint8_t)((uint8_t)(TIM2->CCMR3 & (uint8_t)(~( TIM2_CCMR_CCxS | TIM2_CCMR_ICxF))) + | (uint8_t)(( (TIM2_ICSelection)) | ((uint8_t)( TIM2_ICFilter << 4)))); + + + /* Select the Polarity */ + if (TIM2_ICPolarity != TIM2_ICPOLARITY_RISING) + { + TIM2->CCER2 |= TIM2_CCER2_CC3P; + } + else + { + TIM2->CCER2 &= (uint8_t)(~TIM2_CCER2_CC3P); + } + /* Set the CCE Bit */ + TIM2->CCER2 |= TIM2_CCER2_CC3E; +} + +/** + * @} + */ + + /** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_tim3.c b/4_EXT_INT_1PORT/lib/src/stm8s_tim3.c new file mode 100644 index 0000000..e69700c --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_tim3.c @@ -0,0 +1,1044 @@ +/** + ****************************************************************************** + * @file stm8s_tim3.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the TIM3 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_tim3.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TI1_Config(uint8_t TIM3_ICPolarity, uint8_t TIM3_ICSelection, uint8_t TIM3_ICFilter); +static void TI2_Config(uint8_t TIM3_ICPolarity, uint8_t TIM3_ICSelection, uint8_t TIM3_ICFilter); +/** + * @addtogroup TIM3_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the TIM3 peripheral registers to their default reset values. + * @param None + * @retval None + */ +void TIM3_DeInit(void) +{ + TIM3->CR1 = (uint8_t)TIM3_CR1_RESET_VALUE; + TIM3->IER = (uint8_t)TIM3_IER_RESET_VALUE; + TIM3->SR2 = (uint8_t)TIM3_SR2_RESET_VALUE; + + /* Disable channels */ + TIM3->CCER1 = (uint8_t)TIM3_CCER1_RESET_VALUE; + + /* Then reset channel registers: it also works if lock level is equal to 2 or 3 */ + TIM3->CCER1 = (uint8_t)TIM3_CCER1_RESET_VALUE; + TIM3->CCMR1 = (uint8_t)TIM3_CCMR1_RESET_VALUE; + TIM3->CCMR2 = (uint8_t)TIM3_CCMR2_RESET_VALUE; + TIM3->CNTRH = (uint8_t)TIM3_CNTRH_RESET_VALUE; + TIM3->CNTRL = (uint8_t)TIM3_CNTRL_RESET_VALUE; + TIM3->PSCR = (uint8_t)TIM3_PSCR_RESET_VALUE; + TIM3->ARRH = (uint8_t)TIM3_ARRH_RESET_VALUE; + TIM3->ARRL = (uint8_t)TIM3_ARRL_RESET_VALUE; + TIM3->CCR1H = (uint8_t)TIM3_CCR1H_RESET_VALUE; + TIM3->CCR1L = (uint8_t)TIM3_CCR1L_RESET_VALUE; + TIM3->CCR2H = (uint8_t)TIM3_CCR2H_RESET_VALUE; + TIM3->CCR2L = (uint8_t)TIM3_CCR2L_RESET_VALUE; + TIM3->SR1 = (uint8_t)TIM3_SR1_RESET_VALUE; +} + +/** + * @brief Initializes the TIM3 Time Base Unit according to the specified parameters. + * @param TIM3_Prescaler specifies the Prescaler from TIM3_Prescaler_TypeDef. + * @param TIM3_Period specifies the Period value. + * @retval None + */ +void TIM3_TimeBaseInit( TIM3_Prescaler_TypeDef TIM3_Prescaler, + uint16_t TIM3_Period) +{ + /* Set the Prescaler value */ + TIM3->PSCR = (uint8_t)(TIM3_Prescaler); + /* Set the Autoreload value */ + TIM3->ARRH = (uint8_t)(TIM3_Period >> 8); + TIM3->ARRL = (uint8_t)(TIM3_Period); +} + +/** + * @brief Initializes the TIM3 Channel1 according to the specified parameters. + * @param TIM3_OCMode specifies the Output Compare mode from @ref TIM3_OCMode_TypeDef. + * @param TIM3_OutputState specifies the Output State from @ref TIM3_OutputState_TypeDef. + * @param TIM3_Pulse specifies the Pulse width value. + * @param TIM3_OCPolarity specifies the Output Compare Polarity from @ref TIM3_OCPolarity_TypeDef. + * @retval None + */ +void TIM3_OC1Init(TIM3_OCMode_TypeDef TIM3_OCMode, + TIM3_OutputState_TypeDef TIM3_OutputState, + uint16_t TIM3_Pulse, + TIM3_OCPolarity_TypeDef TIM3_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM3_OC_MODE_OK(TIM3_OCMode)); + assert_param(IS_TIM3_OUTPUT_STATE_OK(TIM3_OutputState)); + assert_param(IS_TIM3_OC_POLARITY_OK(TIM3_OCPolarity)); + + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , the Output Polarity */ + TIM3->CCER1 &= (uint8_t)(~( TIM3_CCER1_CC1E | TIM3_CCER1_CC1P)); + /* Set the Output State & Set the Output Polarity */ + TIM3->CCER1 |= (uint8_t)((uint8_t)(TIM3_OutputState & TIM3_CCER1_CC1E ) | (uint8_t)(TIM3_OCPolarity & TIM3_CCER1_CC1P )); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM3->CCMR1 = (uint8_t)((uint8_t)(TIM3->CCMR1 & (uint8_t)(~TIM3_CCMR_OCM)) | (uint8_t)TIM3_OCMode); + + /* Set the Pulse value */ + TIM3->CCR1H = (uint8_t)(TIM3_Pulse >> 8); + TIM3->CCR1L = (uint8_t)(TIM3_Pulse); +} + +/** + * @brief Initializes the TIM3 Channel2 according to the specified parameters. + * @param TIM3_OCMode specifies the Output Compare mode from @ref TIM3_OCMode_TypeDef. + * @param TIM3_OutputState specifies the Output State from @ref TIM3_OutputState_TypeDef. + * @param TIM3_Pulse specifies the Pulse width value. + * @param TIM3_OCPolarity specifies the Output Compare Polarity from @ref TIM3_OCPolarity_TypeDef. + * @retval None + */ +void TIM3_OC2Init(TIM3_OCMode_TypeDef TIM3_OCMode, + TIM3_OutputState_TypeDef TIM3_OutputState, + uint16_t TIM3_Pulse, + TIM3_OCPolarity_TypeDef TIM3_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM3_OC_MODE_OK(TIM3_OCMode)); + assert_param(IS_TIM3_OUTPUT_STATE_OK(TIM3_OutputState)); + assert_param(IS_TIM3_OC_POLARITY_OK(TIM3_OCPolarity)); + + + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State, the Output Polarity */ + TIM3->CCER1 &= (uint8_t)(~( TIM3_CCER1_CC2E | TIM3_CCER1_CC2P )); + /* Set the Output State & Set the Output Polarity */ + TIM3->CCER1 |= (uint8_t)((uint8_t)(TIM3_OutputState & TIM3_CCER1_CC2E ) | (uint8_t)(TIM3_OCPolarity & TIM3_CCER1_CC2P )); + + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM3->CCMR2 = (uint8_t)((uint8_t)(TIM3->CCMR2 & (uint8_t)(~TIM3_CCMR_OCM)) | (uint8_t)TIM3_OCMode); + + + /* Set the Pulse value */ + TIM3->CCR2H = (uint8_t)(TIM3_Pulse >> 8); + TIM3->CCR2L = (uint8_t)(TIM3_Pulse); +} + +/** + * @brief Initializes the TIM3 peripheral according to the specified parameters. + * @param TIM3_Channel specifies the Input Capture Channel from @ref TIM3_Channel_TypeDef. + * @param TIM3_ICPolarity specifies the Input Capture Polarity from @ref TIM3_ICPolarity_TypeDef. + * @param TIM3_ICSelection specifies the Input Capture Selection from @ref TIM3_ICSelection_TypeDef. + * @param TIM3_ICPrescaler specifies the Input Capture Prescaler from @ref TIM3_ICPSC_TypeDef. + * @param TIM3_ICFilter specifies the Input Capture Filter value (value can be an integer from 0x00 to 0x0F). + * @retval None + */ +void TIM3_ICInit(TIM3_Channel_TypeDef TIM3_Channel, + TIM3_ICPolarity_TypeDef TIM3_ICPolarity, + TIM3_ICSelection_TypeDef TIM3_ICSelection, + TIM3_ICPSC_TypeDef TIM3_ICPrescaler, + uint8_t TIM3_ICFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM3_CHANNEL_OK(TIM3_Channel)); + assert_param(IS_TIM3_IC_POLARITY_OK(TIM3_ICPolarity)); + assert_param(IS_TIM3_IC_SELECTION_OK(TIM3_ICSelection)); + assert_param(IS_TIM3_IC_PRESCALER_OK(TIM3_ICPrescaler)); + assert_param(IS_TIM3_IC_FILTER_OK(TIM3_ICFilter)); + + if (TIM3_Channel != TIM3_CHANNEL_2) + { + /* TI1 Configuration */ + TI1_Config((uint8_t)TIM3_ICPolarity, + (uint8_t)TIM3_ICSelection, + (uint8_t)TIM3_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM3_SetIC1Prescaler(TIM3_ICPrescaler); + } + else + { + /* TI2 Configuration */ + TI2_Config((uint8_t)TIM3_ICPolarity, + (uint8_t)TIM3_ICSelection, + (uint8_t)TIM3_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM3_SetIC2Prescaler(TIM3_ICPrescaler); + } +} + +/** + * @brief Configures the TIM3 peripheral in PWM Input Mode according to the specified parameters. + * @param TIM3_Channel specifies the Input Capture Channel from @ref TIM3_Channel_TypeDef. + * @param TIM3_ICPolarity specifies the Input Capture Polarity from @ref TIM3_ICPolarity_TypeDef. + * @param TIM3_ICSelection specifies the Input Capture Selection from @ref TIM3_ICSelection_TypeDef. + * @param TIM3_ICPrescaler specifies the Input Capture Prescaler from @ref TIM3_ICPSC_TypeDef. + * @param TIM3_ICFilter specifies the Input Capture Filter value (value can be an integer from 0x00 to 0x0F). + * @retval None + */ +void TIM3_PWMIConfig(TIM3_Channel_TypeDef TIM3_Channel, + TIM3_ICPolarity_TypeDef TIM3_ICPolarity, + TIM3_ICSelection_TypeDef TIM3_ICSelection, + TIM3_ICPSC_TypeDef TIM3_ICPrescaler, + uint8_t TIM3_ICFilter) +{ + uint8_t icpolarity = (uint8_t)TIM3_ICPOLARITY_RISING; + uint8_t icselection = (uint8_t)TIM3_ICSELECTION_DIRECTTI; + + /* Check the parameters */ + assert_param(IS_TIM3_PWMI_CHANNEL_OK(TIM3_Channel)); + assert_param(IS_TIM3_IC_POLARITY_OK(TIM3_ICPolarity)); + assert_param(IS_TIM3_IC_SELECTION_OK(TIM3_ICSelection)); + assert_param(IS_TIM3_IC_PRESCALER_OK(TIM3_ICPrescaler)); + + /* Select the Opposite Input Polarity */ + if (TIM3_ICPolarity != TIM3_ICPOLARITY_FALLING) + { + icpolarity = (uint8_t)TIM3_ICPOLARITY_FALLING; + } + else + { + icpolarity = (uint8_t)TIM3_ICPOLARITY_RISING; + } + + /* Select the Opposite Input */ + if (TIM3_ICSelection == TIM3_ICSELECTION_DIRECTTI) + { + icselection = (uint8_t)TIM3_ICSELECTION_INDIRECTTI; + } + else + { + icselection = (uint8_t)TIM3_ICSELECTION_DIRECTTI; + } + + if (TIM3_Channel != TIM3_CHANNEL_2) + { + /* TI1 Configuration */ + TI1_Config((uint8_t)TIM3_ICPolarity, (uint8_t)TIM3_ICSelection, + (uint8_t)TIM3_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM3_SetIC1Prescaler(TIM3_ICPrescaler); + + /* TI2 Configuration */ + TI2_Config(icpolarity, icselection, TIM3_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM3_SetIC2Prescaler(TIM3_ICPrescaler); + } + else + { + /* TI2 Configuration */ + TI2_Config((uint8_t)TIM3_ICPolarity, (uint8_t)TIM3_ICSelection, + (uint8_t)TIM3_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM3_SetIC2Prescaler(TIM3_ICPrescaler); + + /* TI1 Configuration */ + TI1_Config(icpolarity, icselection, TIM3_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM3_SetIC1Prescaler(TIM3_ICPrescaler); + } +} + +/** + * @brief Enables or disables the TIM3 peripheral. + * @param NewState new state of the TIM3 peripheral. This parameter can + * be ENABLE or DISABLE. + * @retval None + */ +void TIM3_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* set or Reset the CEN Bit */ + if (NewState != DISABLE) + { + TIM3->CR1 |= (uint8_t)TIM3_CR1_CEN; + } + else + { + TIM3->CR1 &= (uint8_t)(~TIM3_CR1_CEN); + } +} + +/** + * @brief Enables or disables the specified TIM3 interrupts. + * @param NewState new state of the TIM3 peripheral. + * This parameter can be: ENABLE or DISABLE. + * @param TIM3_IT specifies the TIM3 interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * - TIM3_IT_UPDATE: TIM3 update Interrupt source + * - TIM3_IT_CC1: TIM3 Capture Compare 1 Interrupt source + * - TIM3_IT_CC2: TIM3 Capture Compare 2 Interrupt source + * - TIM3_IT_CC3: TIM3 Capture Compare 3 Interrupt source + * @param NewState new state of the TIM3 peripheral. * @retval None + */ +void TIM3_ITConfig(TIM3_IT_TypeDef TIM3_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM3_IT_OK(TIM3_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt sources */ + TIM3->IER |= (uint8_t)TIM3_IT; + } + else + { + /* Disable the Interrupt sources */ + TIM3->IER &= (uint8_t)(~TIM3_IT); + } +} + +/** + * @brief Enables or Disables the TIM3 Update event. + * @param NewState new state of the TIM3 peripheral Preload register. This parameter can + * be ENABLE or DISABLE. + * @retval None + */ +void TIM3_UpdateDisableConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the UDIS Bit */ + if (NewState != DISABLE) + { + TIM3->CR1 |= TIM3_CR1_UDIS; + } + else + { + TIM3->CR1 &= (uint8_t)(~TIM3_CR1_UDIS); + } +} + +/** + * @brief Selects the TIM3 Update Request Interrupt source. + * @param TIM3_UpdateSource specifies the Update source. + * This parameter can be one of the following values + * - TIM3_UPDATESOURCE_REGULAR + * - TIM3_UPDATESOURCE_GLOBAL + * @retval None + */ +void TIM3_UpdateRequestConfig(TIM3_UpdateSource_TypeDef TIM3_UpdateSource) +{ + /* Check the parameters */ + assert_param(IS_TIM3_UPDATE_SOURCE_OK(TIM3_UpdateSource)); + + /* Set or Reset the URS Bit */ + if (TIM3_UpdateSource != TIM3_UPDATESOURCE_GLOBAL) + { + TIM3->CR1 |= TIM3_CR1_URS; + } + else + { + TIM3->CR1 &= (uint8_t)(~TIM3_CR1_URS); + } +} + +/** + * @brief Selects the TIM3’s One Pulse Mode. + * @param TIM3_OPMode specifies the OPM Mode to be used. + * This parameter can be one of the following values + * - TIM3_OPMODE_SINGLE + * - TIM3_OPMODE_REPETITIVE + * @retval None + */ +void TIM3_SelectOnePulseMode(TIM3_OPMode_TypeDef TIM3_OPMode) +{ + /* Check the parameters */ + assert_param(IS_TIM3_OPM_MODE_OK(TIM3_OPMode)); + + /* Set or Reset the OPM Bit */ + if (TIM3_OPMode != TIM3_OPMODE_REPETITIVE) + { + TIM3->CR1 |= TIM3_CR1_OPM; + } + else + { + TIM3->CR1 &= (uint8_t)(~TIM3_CR1_OPM); + } +} + +/** + * @brief Configures the TIM3 Prescaler. + * @param Prescaler specifies the Prescaler Register value + * This parameter can be one of the following values + * - TIM3_PRESCALER_1 + * - TIM3_PRESCALER_2 + * - TIM3_PRESCALER_4 + * - TIM3_PRESCALER_8 + * - TIM3_PRESCALER_16 + * - TIM3_PRESCALER_32 + * - TIM3_PRESCALER_64 + * - TIM3_PRESCALER_128 + * - TIM3_PRESCALER_256 + * - TIM3_PRESCALER_512 + * - TIM3_PRESCALER_1024 + * - TIM3_PRESCALER_2048 + * - TIM3_PRESCALER_4096 + * - TIM3_PRESCALER_8192 + * - TIM3_PRESCALER_16384 + * - TIM3_PRESCALER_32768 + * @param TIM3_PSCReloadMode specifies the TIM3 Prescaler Reload mode. + * This parameter can be one of the following values + * - TIM3_PSCRELOADMODE_IMMEDIATE: The Prescaler is loaded + * immediately. + * - TIM3_PSCRELOADMODE_UPDATE: The Prescaler is loaded at + * the update event. + * @retval None + */ +void TIM3_PrescalerConfig(TIM3_Prescaler_TypeDef Prescaler, + TIM3_PSCReloadMode_TypeDef TIM3_PSCReloadMode) +{ + /* Check the parameters */ + assert_param(IS_TIM3_PRESCALER_RELOAD_OK(TIM3_PSCReloadMode)); + assert_param(IS_TIM3_PRESCALER_OK(Prescaler)); + + /* Set the Prescaler value */ + TIM3->PSCR = (uint8_t)Prescaler; + + /* Set or reset the UG Bit */ + TIM3->EGR = (uint8_t)TIM3_PSCReloadMode; +} + +/** + * @brief Forces the TIM3 Channel1 output waveform to active or inactive level. + * @param TIM3_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM3_FORCEDACTION_ACTIVE: Force active level on OC1REF + * - TIM3_FORCEDACTION_INACTIVE: Force inactive level on + * OC1REF. + * @retval None + */ +void TIM3_ForcedOC1Config(TIM3_ForcedAction_TypeDef TIM3_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM3_FORCED_ACTION_OK(TIM3_ForcedAction)); + + /* Reset the OCM Bits & Configure the Forced output Mode */ + TIM3->CCMR1 = (uint8_t)((uint8_t)(TIM3->CCMR1 & (uint8_t)(~TIM3_CCMR_OCM)) | (uint8_t)TIM3_ForcedAction); +} + +/** + * @brief Forces the TIM3 Channel2 output waveform to active or inactive level. + * @param TIM3_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM3_FORCEDACTION_ACTIVE: Force active level on OC2REF + * - TIM3_FORCEDACTION_INACTIVE: Force inactive level on + * OC2REF. + * @retval None + */ +void TIM3_ForcedOC2Config(TIM3_ForcedAction_TypeDef TIM3_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM3_FORCED_ACTION_OK(TIM3_ForcedAction)); + + /* Reset the OCM Bits & Configure the Forced output Mode */ + TIM3->CCMR2 = (uint8_t)((uint8_t)(TIM3->CCMR2 & (uint8_t)(~TIM3_CCMR_OCM)) | (uint8_t)TIM3_ForcedAction); +} + +/** + * @brief Enables or disables TIM3 peripheral Preload register on ARR. + * @param NewState new state of the TIM3 peripheral Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM3_ARRPreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the ARPE Bit */ + if (NewState != DISABLE) + { + TIM3->CR1 |= TIM3_CR1_ARPE; + } + else + { + TIM3->CR1 &= (uint8_t)(~TIM3_CR1_ARPE); + } +} + +/** + * @brief Enables or disables the TIM3 peripheral Preload Register on CCR1. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM3_OC1PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC1PE Bit */ + if (NewState != DISABLE) + { + TIM3->CCMR1 |= TIM3_CCMR_OCxPE; + } + else + { + TIM3->CCMR1 &= (uint8_t)(~TIM3_CCMR_OCxPE); + } +} + +/** + * @brief Enables or disables the TIM3 peripheral Preload Register on CCR2. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM3_OC2PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC2PE Bit */ + if (NewState != DISABLE) + { + TIM3->CCMR2 |= TIM3_CCMR_OCxPE; + } + else + { + TIM3->CCMR2 &= (uint8_t)(~TIM3_CCMR_OCxPE); + } +} + +/** + * @brief Configures the TIM3 event to be generated by software. + * @param TIM3_EventSource specifies the event source. + * This parameter can be one of the following values: + * - TIM3_EVENTSOURCE_UPDATE: TIM3 update Event source + * - TIM3_EVENTSOURCE_CC1: TIM3 Capture Compare 1 Event source + * - TIM3_EVENTSOURCE_CC2: TIM3 Capture Compare 2 Event source + * @retval None + */ +void TIM3_GenerateEvent(TIM3_EventSource_TypeDef TIM3_EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM3_EVENT_SOURCE_OK(TIM3_EventSource)); + + /* Set the event sources */ + TIM3->EGR = (uint8_t)TIM3_EventSource; +} + +/** + * @brief Configures the TIM3 Channel 1 polarity. + * @param TIM3_OCPolarity specifies the OC1 Polarity. + * This parameter can be one of the following values: + * - TIM3_OCPOLARITY_LOW: Output Compare active low + * - TIM3_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM3_OC1PolarityConfig(TIM3_OCPolarity_TypeDef TIM3_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM3_OC_POLARITY_OK(TIM3_OCPolarity)); + + /* Set or Reset the CC1P Bit */ + if (TIM3_OCPolarity != TIM3_OCPOLARITY_HIGH) + { + TIM3->CCER1 |= TIM3_CCER1_CC1P; + } + else + { + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC1P); + } +} + +/** + * @brief Configures the TIM3 Channel 2 polarity. + * @param TIM3_OCPolarity specifies the OC2 Polarity. + * This parameter can be one of the following values: + * - TIM3_OCPOLARITY_LOW: Output Compare active low + * - TIM3_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM3_OC2PolarityConfig(TIM3_OCPolarity_TypeDef TIM3_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM3_OC_POLARITY_OK(TIM3_OCPolarity)); + + /* Set or Reset the CC2P Bit */ + if (TIM3_OCPolarity != TIM3_OCPOLARITY_HIGH) + { + TIM3->CCER1 |= TIM3_CCER1_CC2P; + } + else + { + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC2P); + } +} + +/** + * @brief Enables or disables the TIM3 Capture Compare Channel x. + * @param TIM3_Channel specifies the TIM3 Channel. + * This parameter can be one of the following values: + * - TIM3_CHANNEL_1: TIM3 Channel1 + * - TIM3_CHANNEL_2: TIM3 Channel2 + * @param NewState specifies the TIM3 Channel CCxE bit new state. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM3_CCxCmd(TIM3_Channel_TypeDef TIM3_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM3_CHANNEL_OK(TIM3_Channel)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (TIM3_Channel == TIM3_CHANNEL_1) + { + /* Set or Reset the CC1E Bit */ + if (NewState != DISABLE) + { + TIM3->CCER1 |= TIM3_CCER1_CC1E; + } + else + { + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC1E); + } + + } + else + { + /* Set or Reset the CC2E Bit */ + if (NewState != DISABLE) + { + TIM3->CCER1 |= TIM3_CCER1_CC2E; + } + else + { + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC2E); + } + } +} + +/** + * @brief Selects the TIM3 Output Compare Mode. This function disables the + * selected channel before changing the Output Compare Mode. User has to + * enable this channel using TIM3_CCxCmd and TIM3_CCxNCmd functions. + * @param TIM3_Channel specifies the TIM3 Channel. + * This parameter can be one of the following values: + * - TIM3_CHANNEL_1: TIM3 Channel1 + * - TIM3_CHANNEL_2: TIM3 Channel2 + * @param TIM3_OCMode specifies the TIM3 Output Compare Mode. + * This parameter can be one of the following values: + * - TIM3_OCMODE_TIMING + * - TIM3_OCMODE_ACTIVE + * - TIM3_OCMODE_TOGGLE + * - TIM3_OCMODE_PWM1 + * - TIM3_OCMODE_PWM2 + * - TIM3_FORCEDACTION_ACTIVE + * - TIM3_FORCEDACTION_INACTIVE + * @retval None + */ +void TIM3_SelectOCxM(TIM3_Channel_TypeDef TIM3_Channel, TIM3_OCMode_TypeDef TIM3_OCMode) +{ + /* Check the parameters */ + assert_param(IS_TIM3_CHANNEL_OK(TIM3_Channel)); + assert_param(IS_TIM3_OCM_OK(TIM3_OCMode)); + + if (TIM3_Channel == TIM3_CHANNEL_1) + { + /* Disable the Channel 1: Reset the CCE Bit */ + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC1E); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM3->CCMR1 = (uint8_t)((uint8_t)(TIM3->CCMR1 & (uint8_t)(~TIM3_CCMR_OCM)) | (uint8_t)TIM3_OCMode); + } + else + { + /* Disable the Channel 2: Reset the CCE Bit */ + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC2E); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM3->CCMR2 = (uint8_t)((uint8_t)(TIM3->CCMR2 & (uint8_t)(~TIM3_CCMR_OCM)) | (uint8_t)TIM3_OCMode); + } +} + +/** + * @brief Sets the TIM3 Counter Register value. + * @param Counter specifies the Counter register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM3_SetCounter(uint16_t Counter) +{ + /* Set the Counter Register value */ + TIM3->CNTRH = (uint8_t)(Counter >> 8); + TIM3->CNTRL = (uint8_t)(Counter); +} + +/** + * @brief Sets the TIM3 Autoreload Register value. + * @param Autoreload specifies the Autoreload register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM3_SetAutoreload(uint16_t Autoreload) +{ + /* Set the Autoreload Register value */ + TIM3->ARRH = (uint8_t)(Autoreload >> 8); + TIM3->ARRL = (uint8_t)(Autoreload); +} + +/** + * @brief Sets the TIM3 Capture Compare1 Register value. + * @param Compare1 specifies the Capture Compare1 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM3_SetCompare1(uint16_t Compare1) +{ + /* Set the Capture Compare1 Register value */ + TIM3->CCR1H = (uint8_t)(Compare1 >> 8); + TIM3->CCR1L = (uint8_t)(Compare1); +} + +/** + * @brief Sets the TIM3 Capture Compare2 Register value. + * @param Compare2 specifies the Capture Compare2 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM3_SetCompare2(uint16_t Compare2) +{ + /* Set the Capture Compare2 Register value */ + TIM3->CCR2H = (uint8_t)(Compare2 >> 8); + TIM3->CCR2L = (uint8_t)(Compare2); +} + +/** + * @brief Sets the TIM3 Input Capture 1 prescaler. + * @param TIM3_IC1Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM3_ICPSC_DIV1: no prescaler + * - TIM3_ICPSC_DIV2: capture is done once every 2 events + * - TIM3_ICPSC_DIV4: capture is done once every 4 events + * - TIM3_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM3_SetIC1Prescaler(TIM3_ICPSC_TypeDef TIM3_IC1Prescaler) +{ + /* Check the parameters */ + assert_param(IS_TIM3_IC_PRESCALER_OK(TIM3_IC1Prescaler)); + + /* Reset the IC1PSC Bits & Set the IC1PSC value */ + TIM3->CCMR1 = (uint8_t)((uint8_t)(TIM3->CCMR1 & (uint8_t)(~TIM3_CCMR_ICxPSC)) | (uint8_t)TIM3_IC1Prescaler); +} + +/** + * @brief Sets the TIM3 Input Capture 2 prescaler. + * @param TIM3_IC2Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM3_ICPSC_DIV1: no prescaler + * - TIM3_ICPSC_DIV2: capture is done once every 2 events + * - TIM3_ICPSC_DIV4: capture is done once every 4 events + * - TIM3_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM3_SetIC2Prescaler(TIM3_ICPSC_TypeDef TIM3_IC2Prescaler) +{ + /* Check the parameters */ + assert_param(IS_TIM3_IC_PRESCALER_OK(TIM3_IC2Prescaler)); + + /* Reset the IC1PSC Bits & Set the IC1PSC value */ + TIM3->CCMR2 = (uint8_t)((uint8_t)(TIM3->CCMR2 & (uint8_t)(~TIM3_CCMR_ICxPSC)) | (uint8_t)TIM3_IC2Prescaler); +} + +/** + * @brief Gets the TIM3 Input Capture 1 value. + * @param None + * @retval Capture Compare 1 Register value. + */ +uint16_t TIM3_GetCapture1(void) +{ + /* Get the Capture 1 Register value */ + uint16_t tmpccr1 = 0; + uint8_t tmpccr1l=0, tmpccr1h=0; + + tmpccr1h = TIM3->CCR1H; + tmpccr1l = TIM3->CCR1L; + + tmpccr1 = (uint16_t)(tmpccr1l); + tmpccr1 |= (uint16_t)((uint16_t)tmpccr1h << 8); + /* Get the Capture 1 Register value */ + return (uint16_t)tmpccr1; +} + +/** + * @brief Gets the TIM3 Input Capture 2 value. + * @param None + * @retval Capture Compare 2 Register value. + */ +uint16_t TIM3_GetCapture2(void) +{ + /* Get the Capture 2 Register value */ + uint16_t tmpccr2 = 0; + uint8_t tmpccr2l=0, tmpccr2h=0; + + tmpccr2h = TIM3->CCR2H; + tmpccr2l = TIM3->CCR2L; + + tmpccr2 = (uint16_t)(tmpccr2l); + tmpccr2 |= (uint16_t)((uint16_t)tmpccr2h << 8); + /* Get the Capture 2 Register value */ + return (uint16_t)tmpccr2; +} + +/** + * @brief Gets the TIM3 Counter value. + * @param None + * @retval Counter Register value. + */ +uint16_t TIM3_GetCounter(void) +{ + uint16_t tmpcntr = 0; + + tmpcntr = ((uint16_t)TIM3->CNTRH << 8); + /* Get the Counter Register value */ + return (uint16_t)( tmpcntr| (uint16_t)(TIM3->CNTRL)); +} + +/** + * @brief Gets the TIM3 Prescaler value. + * @param None + * @retval Prescaler Register configuration value @ref TIM3_Prescaler_TypeDef. + */ +TIM3_Prescaler_TypeDef TIM3_GetPrescaler(void) +{ + /* Get the Prescaler Register value */ + return (TIM3_Prescaler_TypeDef)(TIM3->PSCR); +} + +/** + * @brief Checks whether the specified TIM3 flag is set or not. + * @param TIM3_FLAG specifies the flag to check. + * This parameter can be one of the following values: + * - TIM3_FLAG_UPDATE: TIM3 update Flag + * - TIM3_FLAG_CC1: TIM3 Capture Compare 1 Flag + * - TIM3_FLAG_CC2: TIM3 Capture Compare 2 Flag + * - TIM3_FLAG_CC1OF: TIM3 Capture Compare 1 over capture Flag + * - TIM3_FLAG_CC2OF: TIM3 Capture Compare 2 over capture Flag + * @retval FlagStatus The new state of TIM3_FLAG (SET or RESET). + */ +FlagStatus TIM3_GetFlagStatus(TIM3_FLAG_TypeDef TIM3_FLAG) +{ + FlagStatus bitstatus = RESET; + uint8_t tim3_flag_l = 0, tim3_flag_h = 0; + + /* Check the parameters */ + assert_param(IS_TIM3_GET_FLAG_OK(TIM3_FLAG)); + + tim3_flag_l = (uint8_t)(TIM3->SR1 & (uint8_t)TIM3_FLAG); + tim3_flag_h = (uint8_t)((uint16_t)TIM3_FLAG >> 8); + + if (((tim3_flag_l) | (uint8_t)(TIM3->SR2 & tim3_flag_h)) != (uint8_t)RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return (FlagStatus)bitstatus; +} + +/** + * @brief Clears the TIM3’s pending flags. + * @param TIM3_FLAG specifies the flag to clear. + * This parameter can be one of the following values: + * - TIM3_FLAG_UPDATE: TIM3 update Flag + * - TIM3_FLAG_CC1: TIM3 Capture Compare 1 Flag + * - TIM3_FLAG_CC2: TIM3 Capture Compare 2 Flag + * - TIM3_FLAG_CC1OF: TIM3 Capture Compare 1 over capture Flag + * - TIM3_FLAG_CC2OF: TIM3 Capture Compare 2 over capture Flag + * @retval None. + */ +void TIM3_ClearFlag(TIM3_FLAG_TypeDef TIM3_FLAG) +{ + /* Check the parameters */ + assert_param(IS_TIM3_CLEAR_FLAG_OK(TIM3_FLAG)); + + /* Clear the flags (rc_w0) clear this bit by writing 0. Writing ‘1’ has no effect*/ + TIM3->SR1 = (uint8_t)(~((uint8_t)(TIM3_FLAG))); + TIM3->SR2 = (uint8_t)(~((uint8_t)((uint16_t)TIM3_FLAG >> 8))); +} + +/** + * @brief Checks whether the TIM3 interrupt has occurred or not. + * @param TIM3_IT specifies the TIM3 interrupt source to check. + * This parameter can be one of the following values: + * - TIM3_IT_UPDATE: TIM3 update Interrupt source + * - TIM3_IT_CC1: TIM3 Capture Compare 1 Interrupt source + * - TIM3_IT_CC2: TIM3 Capture Compare 2 Interrupt source + * @retval ITStatus The new state of the TIM3_IT(SET or RESET). + */ +ITStatus TIM3_GetITStatus(TIM3_IT_TypeDef TIM3_IT) +{ + ITStatus bitstatus = RESET; + uint8_t TIM3_itStatus = 0, TIM3_itEnable = 0; + + /* Check the parameters */ + assert_param(IS_TIM3_GET_IT_OK(TIM3_IT)); + + TIM3_itStatus = (uint8_t)(TIM3->SR1 & TIM3_IT); + + TIM3_itEnable = (uint8_t)(TIM3->IER & TIM3_IT); + + if ((TIM3_itStatus != (uint8_t)RESET ) && (TIM3_itEnable != (uint8_t)RESET )) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return (ITStatus)(bitstatus); +} + +/** + * @brief Clears the TIM3's interrupt pending bits. + * @param TIM3_IT specifies the pending bit to clear. + * This parameter can be one of the following values: + * - TIM3_IT_UPDATE: TIM3 update Interrupt source + * - TIM3_IT_CC1: TIM3 Capture Compare 1 Interrupt source + * - TIM3_IT_CC2: TIM3 Capture Compare 2 Interrupt source + * @retval None. + */ +void TIM3_ClearITPendingBit(TIM3_IT_TypeDef TIM3_IT) +{ + /* Check the parameters */ + assert_param(IS_TIM3_IT_OK(TIM3_IT)); + + /* Clear the IT pending Bit */ + TIM3->SR1 = (uint8_t)(~TIM3_IT); +} + +/** + * @brief Configure the TI1 as Input. + * @param TIM3_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM3_ICPOLARITY_FALLING + * - TIM3_ICPOLARITY_RISING + * @param TIM3_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM3_ICSELECTION_DIRECTTI: TIM3 Input 1 is selected to + * be connected to IC1. + * - TIM3_ICSELECTION_INDIRECTTI: TIM3 Input 1 is selected to + * be connected to IC2. + * @param TIM3_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI1_Config(uint8_t TIM3_ICPolarity, + uint8_t TIM3_ICSelection, + uint8_t TIM3_ICFilter) +{ + /* Disable the Channel 1: Reset the CCE Bit */ + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC1E); + + /* Select the Input and set the filter */ + TIM3->CCMR1 = (uint8_t)((uint8_t)(TIM3->CCMR1 & (uint8_t)(~( TIM3_CCMR_CCxS | TIM3_CCMR_ICxF))) | (uint8_t)(( (TIM3_ICSelection)) | ((uint8_t)( TIM3_ICFilter << 4)))); + + /* Select the Polarity */ + if (TIM3_ICPolarity != TIM3_ICPOLARITY_RISING) + { + TIM3->CCER1 |= TIM3_CCER1_CC1P; + } + else + { + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC1P); + } + /* Set the CCE Bit */ + TIM3->CCER1 |= TIM3_CCER1_CC1E; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIM3_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM3_ICPOLARITY_FALLING + * - TIM3_ICPOLARITY_RISING + * @param TIM3_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM3_ICSELECTION_DIRECTTI: TIM3 Input 2 is selected to + * be connected to IC2. + * - TIM3_ICSELECTION_INDIRECTTI: TIM3 Input 2 is selected to + * be connected to IC1. + * @param TIM3_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI2_Config(uint8_t TIM3_ICPolarity, + uint8_t TIM3_ICSelection, + uint8_t TIM3_ICFilter) +{ + /* Disable the Channel 2: Reset the CCE Bit */ + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC2E); + + /* Select the Input and set the filter */ + TIM3->CCMR2 = (uint8_t)((uint8_t)(TIM3->CCMR2 & (uint8_t)(~( TIM3_CCMR_CCxS | + TIM3_CCMR_ICxF ))) | (uint8_t)(( (TIM3_ICSelection)) | + ((uint8_t)( TIM3_ICFilter << 4)))); + + /* Select the Polarity */ + if (TIM3_ICPolarity != TIM3_ICPOLARITY_RISING) + { + TIM3->CCER1 |= TIM3_CCER1_CC2P; + } + else + { + TIM3->CCER1 &= (uint8_t)(~TIM3_CCER1_CC2P); + } + + /* Set the CCE Bit */ + TIM3->CCER1 |= TIM3_CCER1_CC2E; +} + +/** + * @} + */ + + /** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_tim4.c b/4_EXT_INT_1PORT/lib/src/stm8s_tim4.c new file mode 100644 index 0000000..3742f04 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_tim4.c @@ -0,0 +1,409 @@ +/** + ****************************************************************************** + * @file stm8s_tim4.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the TIM4 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_tim4.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** + * @addtogroup TIM4_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the TIM4 peripheral registers to their default reset values. + * @param None + * @retval None + */ +void TIM4_DeInit(void) +{ + TIM4->CR1 = TIM4_CR1_RESET_VALUE; + TIM4->IER = TIM4_IER_RESET_VALUE; + TIM4->CNTR = TIM4_CNTR_RESET_VALUE; + TIM4->PSCR = TIM4_PSCR_RESET_VALUE; + TIM4->ARR = TIM4_ARR_RESET_VALUE; + TIM4->SR1 = TIM4_SR1_RESET_VALUE; +} + +/** + * @brief Initializes the TIM4 Time Base Unit according to the specified parameters. + * @param TIM4_Prescaler specifies the Prescaler from TIM4_Prescaler_TypeDef. + * @param TIM4_Period specifies the Period value. + * @retval None + */ +void TIM4_TimeBaseInit(TIM4_Prescaler_TypeDef TIM4_Prescaler, uint8_t TIM4_Period) +{ + /* Check TIM4 prescaler value */ + assert_param(IS_TIM4_PRESCALER_OK(TIM4_Prescaler)); + /* Set the Prescaler value */ + TIM4->PSCR = (uint8_t)(TIM4_Prescaler); + /* Set the Autoreload value */ + TIM4->ARR = (uint8_t)(TIM4_Period); +} + +/** + * @brief Enables or disables the TIM4 peripheral. + * @param NewState new state of the TIM4 peripheral. This parameter can + * be ENABLE or DISABLE. + * @retval None + */ +void TIM4_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* set or Reset the CEN Bit */ + if (NewState != DISABLE) + { + TIM4->CR1 |= TIM4_CR1_CEN; + } + else + { + TIM4->CR1 &= (uint8_t)(~TIM4_CR1_CEN); + } +} + +/** + * @brief Enables or disables the specified TIM4 interrupts. + * @param NewState new state of the TIM4 peripheral. + * This parameter can be: ENABLE or DISABLE. + * @param TIM4_IT specifies the TIM4 interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * - TIM4_IT_UPDATE: TIM4 update Interrupt source + * @param NewState new state of the TIM4 peripheral. + * @retval None + */ +void TIM4_ITConfig(TIM4_IT_TypeDef TIM4_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM4_IT_OK(TIM4_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt sources */ + TIM4->IER |= (uint8_t)TIM4_IT; + } + else + { + /* Disable the Interrupt sources */ + TIM4->IER &= (uint8_t)(~TIM4_IT); + } +} + +/** + * @brief Enables or Disables the TIM4 Update event. + * @param NewState new state of the TIM4 peripheral Preload register. This parameter can + * be ENABLE or DISABLE. + * @retval None + */ +void TIM4_UpdateDisableConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the UDIS Bit */ + if (NewState != DISABLE) + { + TIM4->CR1 |= TIM4_CR1_UDIS; + } + else + { + TIM4->CR1 &= (uint8_t)(~TIM4_CR1_UDIS); + } +} + +/** + * @brief Selects the TIM4 Update Request Interrupt source. + * @param TIM4_UpdateSource specifies the Update source. + * This parameter can be one of the following values + * - TIM4_UPDATESOURCE_REGULAR + * - TIM4_UPDATESOURCE_GLOBAL + * @retval None + */ +void TIM4_UpdateRequestConfig(TIM4_UpdateSource_TypeDef TIM4_UpdateSource) +{ + /* Check the parameters */ + assert_param(IS_TIM4_UPDATE_SOURCE_OK(TIM4_UpdateSource)); + + /* Set or Reset the URS Bit */ + if (TIM4_UpdateSource != TIM4_UPDATESOURCE_GLOBAL) + { + TIM4->CR1 |= TIM4_CR1_URS; + } + else + { + TIM4->CR1 &= (uint8_t)(~TIM4_CR1_URS); + } +} + +/** + * @brief Selects the TIM4’s One Pulse Mode. + * @param TIM4_OPMode specifies the OPM Mode to be used. + * This parameter can be one of the following values + * - TIM4_OPMODE_SINGLE + * - TIM4_OPMODE_REPETITIVE + * @retval None + */ +void TIM4_SelectOnePulseMode(TIM4_OPMode_TypeDef TIM4_OPMode) +{ + /* Check the parameters */ + assert_param(IS_TIM4_OPM_MODE_OK(TIM4_OPMode)); + + /* Set or Reset the OPM Bit */ + if (TIM4_OPMode != TIM4_OPMODE_REPETITIVE) + { + TIM4->CR1 |= TIM4_CR1_OPM; + } + else + { + TIM4->CR1 &= (uint8_t)(~TIM4_CR1_OPM); + } +} + +/** + * @brief Configures the TIM4 Prescaler. + * @param Prescaler specifies the Prescaler Register value + * This parameter can be one of the following values + * - TIM4_PRESCALER_1 + * - TIM4_PRESCALER_2 + * - TIM4_PRESCALER_4 + * - TIM4_PRESCALER_8 + * - TIM4_PRESCALER_16 + * - TIM4_PRESCALER_32 + * - TIM4_PRESCALER_64 + * - TIM4_PRESCALER_128 + * @param TIM4_PSCReloadMode specifies the TIM4 Prescaler Reload mode. + * This parameter can be one of the following values + * - TIM4_PSCRELOADMODE_IMMEDIATE: The Prescaler is loaded + * immediately. + * - TIM4_PSCRELOADMODE_UPDATE: The Prescaler is loaded at + * the update event. + * @retval None + */ +void TIM4_PrescalerConfig(TIM4_Prescaler_TypeDef Prescaler, TIM4_PSCReloadMode_TypeDef TIM4_PSCReloadMode) +{ + /* Check the parameters */ + assert_param(IS_TIM4_PRESCALER_RELOAD_OK(TIM4_PSCReloadMode)); + assert_param(IS_TIM4_PRESCALER_OK(Prescaler)); + + /* Set the Prescaler value */ + TIM4->PSCR = (uint8_t)Prescaler; + + /* Set or reset the UG Bit */ + TIM4->EGR = (uint8_t)TIM4_PSCReloadMode; +} + +/** + * @brief Enables or disables TIM4 peripheral Preload register on ARR. + * @param NewState new state of the TIM4 peripheral Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM4_ARRPreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the ARPE Bit */ + if (NewState != DISABLE) + { + TIM4->CR1 |= TIM4_CR1_ARPE; + } + else + { + TIM4->CR1 &= (uint8_t)(~TIM4_CR1_ARPE); + } +} + +/** + * @brief Configures the TIM4 event to be generated by software. + * @param TIM4_EventSource specifies the event source. + * This parameter can be one of the following values: + * - TIM4_EVENTSOURCE_UPDATE: TIM4 update Event source + * @retval None + */ +void TIM4_GenerateEvent(TIM4_EventSource_TypeDef TIM4_EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM4_EVENT_SOURCE_OK(TIM4_EventSource)); + + /* Set the event sources */ + TIM4->EGR = (uint8_t)(TIM4_EventSource); +} + +/** + * @brief Sets the TIM4 Counter Register value. + * @param Counter specifies the Counter register new value. + * This parameter is between 0x00 and 0xFF. + * @retval None + */ +void TIM4_SetCounter(uint8_t Counter) +{ + /* Set the Counter Register value */ + TIM4->CNTR = (uint8_t)(Counter); +} + +/** + * @brief Sets the TIM4 Autoreload Register value. + * @param Autoreload specifies the Autoreload register new value. + * This parameter is between 0x00 and 0xFF. + * @retval None + */ +void TIM4_SetAutoreload(uint8_t Autoreload) +{ + /* Set the Autoreload Register value */ + TIM4->ARR = (uint8_t)(Autoreload); +} + +/** + * @brief Gets the TIM4 Counter value. + * @param None + * @retval Counter Register value. + */ +uint8_t TIM4_GetCounter(void) +{ + /* Get the Counter Register value */ + return (uint8_t)(TIM4->CNTR); +} + +/** + * @brief Gets the TIM4 Prescaler value. + * @param None + * @retval Prescaler Register configuration value. + */ +TIM4_Prescaler_TypeDef TIM4_GetPrescaler(void) +{ + /* Get the Prescaler Register value */ + return (TIM4_Prescaler_TypeDef)(TIM4->PSCR); +} + +/** + * @brief Checks whether the specified TIM4 flag is set or not. + * @param TIM4_FLAG specifies the flag to check. + * This parameter can be one of the following values: + * - TIM4_FLAG_UPDATE: TIM4 update Flag + * @retval FlagStatus The new state of TIM4_FLAG (SET or RESET). + */ +FlagStatus TIM4_GetFlagStatus(TIM4_FLAG_TypeDef TIM4_FLAG) +{ + FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_TIM4_GET_FLAG_OK(TIM4_FLAG)); + + if ((TIM4->SR1 & (uint8_t)TIM4_FLAG) != 0) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return ((FlagStatus)bitstatus); +} + +/** + * @brief Clears the TIM4’s pending flags. + * @param TIM4_FLAG specifies the flag to clear. + * This parameter can be one of the following values: + * - TIM4_FLAG_UPDATE: TIM4 update Flag + * @retval None. + */ +void TIM4_ClearFlag(TIM4_FLAG_TypeDef TIM4_FLAG) +{ + /* Check the parameters */ + assert_param(IS_TIM4_GET_FLAG_OK(TIM4_FLAG)); + + /* Clear the flags (rc_w0) clear this bit by writing 0. Writing ‘1’ has no effect*/ + TIM4->SR1 = (uint8_t)(~TIM4_FLAG); +} + +/** + * @brief Checks whether the TIM4 interrupt has occurred or not. + * @param TIM4_IT specifies the TIM4 interrupt source to check. + * This parameter can be one of the following values: + * - TIM4_IT_UPDATE: TIM4 update Interrupt source + * @retval ITStatus The new state of the TIM4_IT (SET or RESET). + */ +ITStatus TIM4_GetITStatus(TIM4_IT_TypeDef TIM4_IT) +{ + ITStatus bitstatus = RESET; + + uint8_t itstatus = 0x0, itenable = 0x0; + + /* Check the parameters */ + assert_param(IS_TIM4_IT_OK(TIM4_IT)); + + itstatus = (uint8_t)(TIM4->SR1 & (uint8_t)TIM4_IT); + + itenable = (uint8_t)(TIM4->IER & (uint8_t)TIM4_IT); + + if ((itstatus != (uint8_t)RESET ) && (itenable != (uint8_t)RESET )) + { + bitstatus = (ITStatus)SET; + } + else + { + bitstatus = (ITStatus)RESET; + } + return ((ITStatus)bitstatus); +} + +/** + * @brief Clears the TIM4's interrupt pending bits. + * @param TIM4_IT specifies the pending bit to clear. + * This parameter can be one of the following values: + * - TIM4_IT_UPDATE: TIM4 update Interrupt source + * @retval None. + */ +void TIM4_ClearITPendingBit(TIM4_IT_TypeDef TIM4_IT) +{ + /* Check the parameters */ + assert_param(IS_TIM4_IT_OK(TIM4_IT)); + + /* Clear the IT pending Bit */ + TIM4->SR1 = (uint8_t)(~TIM4_IT); +} + +/** + * @} + */ + + /** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_tim5.c b/4_EXT_INT_1PORT/lib/src/stm8s_tim5.c new file mode 100644 index 0000000..71a4e09 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_tim5.c @@ -0,0 +1,1417 @@ +/** + ****************************************************************************** + * @file stm8s_tim5.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the TIM5 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_tim5.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +static void TI1_Config(uint8_t TIM5_ICPolarity, uint8_t TIM5_ICSelection, uint8_t TIM5_ICFilter); +static void TI2_Config(uint8_t TIM5_ICPolarity, uint8_t TIM5_ICSelection, uint8_t TIM5_ICFilter); +static void TI3_Config(uint8_t TIM5_ICPolarity, uint8_t TIM5_ICSelection, uint8_t TIM5_ICFilter); +/** + * @addtogroup TIM5_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the TIM5 peripheral registers to their default reset values. + * @param None + * @retval None + */ +void TIM5_DeInit(void) +{ + TIM5->CR1 = (uint8_t)TIM5_CR1_RESET_VALUE; + TIM5->CR2 = TIM5_CR2_RESET_VALUE; + TIM5->SMCR = TIM5_SMCR_RESET_VALUE; + TIM5->IER = (uint8_t)TIM5_IER_RESET_VALUE; + TIM5->SR2 = (uint8_t)TIM5_SR2_RESET_VALUE; + + /* Disable channels */ + TIM5->CCER1 = (uint8_t)TIM5_CCER1_RESET_VALUE; + TIM5->CCER2 = (uint8_t)TIM5_CCER2_RESET_VALUE; + + /* Then reset channel registers: it also works if lock level is equal to 2 or 3 */ + TIM5->CCER1 = (uint8_t)TIM5_CCER1_RESET_VALUE; + TIM5->CCER2 = (uint8_t)TIM5_CCER2_RESET_VALUE; + TIM5->CCMR1 = (uint8_t)TIM5_CCMR1_RESET_VALUE; + TIM5->CCMR2 = (uint8_t)TIM5_CCMR2_RESET_VALUE; + TIM5->CCMR3 = (uint8_t)TIM5_CCMR3_RESET_VALUE; + TIM5->CNTRH = (uint8_t)TIM5_CNTRH_RESET_VALUE; + TIM5->CNTRL = (uint8_t)TIM5_CNTRL_RESET_VALUE; + TIM5->PSCR = (uint8_t)TIM5_PSCR_RESET_VALUE; + TIM5->ARRH = (uint8_t)TIM5_ARRH_RESET_VALUE; + TIM5->ARRL = (uint8_t)TIM5_ARRL_RESET_VALUE; + TIM5->CCR1H = (uint8_t)TIM5_CCR1H_RESET_VALUE; + TIM5->CCR1L = (uint8_t)TIM5_CCR1L_RESET_VALUE; + TIM5->CCR2H = (uint8_t)TIM5_CCR2H_RESET_VALUE; + TIM5->CCR2L = (uint8_t)TIM5_CCR2L_RESET_VALUE; + TIM5->CCR3H = (uint8_t)TIM5_CCR3H_RESET_VALUE; + TIM5->CCR3L = (uint8_t)TIM5_CCR3L_RESET_VALUE; + TIM5->SR1 = (uint8_t)TIM5_SR1_RESET_VALUE; +} + +/** + * @brief Initializes the TIM5 Time Base Unit according to the specified parameters. + * @param TIM5_Prescaler specifies the Prescaler from TIM5_Prescaler_TypeDef. + * @param TIM5_Period specifies the Period value. + * @retval None + */ +void TIM5_TimeBaseInit( TIM5_Prescaler_TypeDef TIM5_Prescaler, + uint16_t TIM5_Period) +{ + /* Set the Prescaler value */ + TIM5->PSCR = (uint8_t)(TIM5_Prescaler); + /* Set the Autoreload value */ + TIM5->ARRH = (uint8_t)(TIM5_Period >> 8) ; + TIM5->ARRL = (uint8_t)(TIM5_Period); +} + +/** + * @brief Initializes the TIM5 Channel1 according to the specified parameters. + * @param TIM5_OCMode specifies the Output Compare mode from @ref TIM5_OCMode_TypeDef. + * @param TIM5_OutputState specifies the Output State from @ref TIM5_OutputState_TypeDef. + * @param TIM5_Pulse specifies the Pulse width value. + * @param TIM5_OCPolarity specifies the Output Compare Polarity from @ref TIM5_OCPolarity_TypeDef. + * @retval None + */ +void TIM5_OC1Init(TIM5_OCMode_TypeDef TIM5_OCMode, + TIM5_OutputState_TypeDef TIM5_OutputState, + uint16_t TIM5_Pulse, + TIM5_OCPolarity_TypeDef TIM5_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM5_OC_MODE_OK(TIM5_OCMode)); + assert_param(IS_TIM5_OUTPUT_STATE_OK(TIM5_OutputState)); + assert_param(IS_TIM5_OC_POLARITY_OK(TIM5_OCPolarity)); + + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , the Output Polarity */ + TIM5->CCER1 &= (uint8_t)(~( TIM5_CCER1_CC1E | TIM5_CCER1_CC1P)); + /* Set the Output State & Set the Output Polarity */ + TIM5->CCER1 |= (uint8_t)((uint8_t)(TIM5_OutputState & TIM5_CCER1_CC1E )| + (uint8_t)(TIM5_OCPolarity & TIM5_CCER1_CC1P)); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM5->CCMR1 = (uint8_t)((uint8_t)(TIM5->CCMR1 & (uint8_t)(~TIM5_CCMR_OCM)) | + (uint8_t)TIM5_OCMode); + + /* Set the Pulse value */ + TIM5->CCR1H = (uint8_t)(TIM5_Pulse >> 8); + TIM5->CCR1L = (uint8_t)(TIM5_Pulse); +} + +/** + * @brief Initializes the TIM5 Channel2 according to the specified parameters. + * @param TIM5_OCMode specifies the Output Compare mode from @ref TIM5_OCMode_TypeDef. + * @param TIM5_OutputState specifies the Output State from @ref TIM5_OutputState_TypeDef. + * @param TIM5_Pulse specifies the Pulse width value. + * @param TIM5_OCPolarity specifies the Output Compare Polarity from @ref TIM5_OCPolarity_TypeDef. + * @retval None + */ +void TIM5_OC2Init(TIM5_OCMode_TypeDef TIM5_OCMode, + TIM5_OutputState_TypeDef TIM5_OutputState, + uint16_t TIM5_Pulse, + TIM5_OCPolarity_TypeDef TIM5_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM5_OC_MODE_OK(TIM5_OCMode)); + assert_param(IS_TIM5_OUTPUT_STATE_OK(TIM5_OutputState)); + assert_param(IS_TIM5_OC_POLARITY_OK(TIM5_OCPolarity)); + + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State , the Output Polarity */ + TIM5->CCER1 &= (uint8_t)(~( TIM5_CCER1_CC2E | TIM5_CCER1_CC2P )); + /* Set the Output State & Set the Output Polarity */ + TIM5->CCER1 |= (uint8_t)((uint8_t)(TIM5_OutputState & TIM5_CCER1_CC2E )| \ + (uint8_t)(TIM5_OCPolarity & TIM5_CCER1_CC2P)); + + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM5->CCMR2 = (uint8_t)((uint8_t)(TIM5->CCMR2 & (uint8_t)(~TIM5_CCMR_OCM)) | + (uint8_t)TIM5_OCMode); + + /* Set the Pulse value */ + TIM5->CCR2H = (uint8_t)(TIM5_Pulse >> 8); + TIM5->CCR2L = (uint8_t)(TIM5_Pulse); +} + +/** + * @brief Initializes the TIM5 Channel3 according to the specified parameters. + * @param TIM5_OCMode specifies the Output Compare mode from @ref TIM5_OCMode_TypeDef. + * @param TIM5_OutputState specifies the Output State from @ref TIM5_OutputState_TypeDef. + * @param TIM5_Pulse specifies the Pulse width value. + * @param TIM5_OCPolarity specifies the Output Compare Polarity from @ref TIM5_OCPolarity_TypeDef. + * @retval None + */ +void TIM5_OC3Init(TIM5_OCMode_TypeDef TIM5_OCMode, + TIM5_OutputState_TypeDef TIM5_OutputState, + uint16_t TIM5_Pulse, + TIM5_OCPolarity_TypeDef TIM5_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM5_OC_MODE_OK(TIM5_OCMode)); + assert_param(IS_TIM5_OUTPUT_STATE_OK(TIM5_OutputState)); + assert_param(IS_TIM5_OC_POLARITY_OK(TIM5_OCPolarity)); + /* Disable the Channel 1: Reset the CCE Bit, Set the Output State, the Output Polarity */ + TIM5->CCER2 &= (uint8_t)(~( TIM5_CCER2_CC3E | TIM5_CCER2_CC3P)); + /* Set the Output State & Set the Output Polarity */ + TIM5->CCER2 |= (uint8_t)((uint8_t)(TIM5_OutputState & TIM5_CCER2_CC3E )| + (uint8_t)(TIM5_OCPolarity & TIM5_CCER2_CC3P )); + + /* Reset the Output Compare Bits & Set the Output Compare Mode */ + TIM5->CCMR3 = (uint8_t)((uint8_t)(TIM5->CCMR3 & (uint8_t)(~TIM5_CCMR_OCM)) | (uint8_t)TIM5_OCMode); + + /* Set the Pulse value */ + TIM5->CCR3H = (uint8_t)(TIM5_Pulse >> 8); + TIM5->CCR3L = (uint8_t)(TIM5_Pulse); +} + +/** + * @brief Initializes the TIM5 peripheral according to the specified parameters. + * @param TIM5_Channel specifies the Input Capture Channel from @ref TIM5_Channel_TypeDef. + * @param TIM5_ICPolarity specifies the Input Capture Polarity from @ref TIM5_ICPolarity_TypeDef. + * @param TIM5_ICSelection specifies theInput Capture Selection from @ref TIM5_ICSelection_TypeDef. + * @param TIM5_ICPrescaler specifies the Input Capture Prescaler from @ref TIM5_ICPSC_TypeDef. + * @param TIM5_ICFilter specifies the Input Capture Filter value (value can be an integer from 0x00 to 0x0F). + * @retval None + */ +void TIM5_ICInit(TIM5_Channel_TypeDef TIM5_Channel, + TIM5_ICPolarity_TypeDef TIM5_ICPolarity, + TIM5_ICSelection_TypeDef TIM5_ICSelection, + TIM5_ICPSC_TypeDef TIM5_ICPrescaler, + uint8_t TIM5_ICFilter) +{ + /* Check the parameters */ + assert_param(IS_TIM5_CHANNEL_OK(TIM5_Channel)); + assert_param(IS_TIM5_IC_POLARITY_OK(TIM5_ICPolarity)); + assert_param(IS_TIM5_IC_SELECTION_OK(TIM5_ICSelection)); + assert_param(IS_TIM5_IC_PRESCALER_OK(TIM5_ICPrescaler)); + assert_param(IS_TIM5_IC_FILTER_OK(TIM5_ICFilter)); + + if (TIM5_Channel == TIM5_CHANNEL_1) + { + /* TI1 Configuration */ + TI1_Config((uint8_t)TIM5_ICPolarity, + (uint8_t)TIM5_ICSelection, + (uint8_t)TIM5_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM5_SetIC1Prescaler(TIM5_ICPrescaler); + } + else if (TIM5_Channel == TIM5_CHANNEL_2) + { + /* TI2 Configuration */ + TI2_Config((uint8_t)TIM5_ICPolarity, + (uint8_t)TIM5_ICSelection, + (uint8_t)TIM5_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM5_SetIC2Prescaler(TIM5_ICPrescaler); + } + else + { + /* TI3 Configuration */ + TI3_Config((uint8_t)TIM5_ICPolarity, + (uint8_t)TIM5_ICSelection, + (uint8_t)TIM5_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM5_SetIC3Prescaler(TIM5_ICPrescaler); + } +} + +/** + * @brief Configures the TIM5 peripheral in PWM Input Mode according to the specified parameters. + * @param TIM5_Channel specifies the Input Capture Channel from @ref TIM5_Channel_TypeDef. + * @param TIM5_ICPolarity specifies the Input Capture Polarity from @ref TIM5_ICPolarity_TypeDef. + * @param TIM5_ICSelection specifies theInput Capture Selection from @ref TIM5_ICSelection_TypeDef. + * @param TIM5_ICPrescaler specifies the Input Capture Prescaler from @ref TIM5_ICPSC_TypeDef. + * @param TIM5_ICFilter specifies the Input Capture Filter value (value can be an integer from 0x00 to 0x0F). + * @retval None + */ +void TIM5_PWMIConfig(TIM5_Channel_TypeDef TIM5_Channel, + TIM5_ICPolarity_TypeDef TIM5_ICPolarity, + TIM5_ICSelection_TypeDef TIM5_ICSelection, + TIM5_ICPSC_TypeDef TIM5_ICPrescaler, + uint8_t TIM5_ICFilter) +{ + uint8_t icpolarity = (uint8_t)TIM5_ICPOLARITY_RISING; + uint8_t icselection = (uint8_t)TIM5_ICSELECTION_DIRECTTI; + + /* Check the parameters */ + assert_param(IS_TIM5_PWMI_CHANNEL_OK(TIM5_Channel)); + assert_param(IS_TIM5_IC_POLARITY_OK(TIM5_ICPolarity)); + assert_param(IS_TIM5_IC_SELECTION_OK(TIM5_ICSelection)); + assert_param(IS_TIM5_IC_PRESCALER_OK(TIM5_ICPrescaler)); + + /* Select the Opposite Input Polarity */ + if (TIM5_ICPolarity != TIM5_ICPOLARITY_FALLING) + { + icpolarity = (uint8_t)TIM5_ICPOLARITY_FALLING; + } + else + { + icpolarity = (uint8_t)TIM5_ICPOLARITY_RISING; + } + + /* Select the Opposite Input */ + if (TIM5_ICSelection == TIM5_ICSELECTION_DIRECTTI) + { + icselection = (uint8_t)TIM5_ICSELECTION_INDIRECTTI; + } + else + { + icselection = (uint8_t)TIM5_ICSELECTION_DIRECTTI; + } + + if (TIM5_Channel == TIM5_CHANNEL_1) + { + /* TI1 Configuration */ + TI1_Config((uint8_t)TIM5_ICPolarity, (uint8_t)TIM5_ICSelection, + (uint8_t)TIM5_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM5_SetIC1Prescaler(TIM5_ICPrescaler); + + /* TI2 Configuration */ + TI2_Config((uint8_t)icpolarity, (uint8_t)icselection, (uint8_t)TIM5_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM5_SetIC2Prescaler(TIM5_ICPrescaler); + } + else + { + /* TI2 Configuration */ + TI2_Config((uint8_t)TIM5_ICPolarity, (uint8_t)TIM5_ICSelection, + (uint8_t)TIM5_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM5_SetIC2Prescaler(TIM5_ICPrescaler); + + /* TI1 Configuration */ + TI1_Config((uint8_t)icpolarity, (uint8_t)icselection, (uint8_t)TIM5_ICFilter); + + /* Set the Input Capture Prescaler value */ + TIM5_SetIC1Prescaler(TIM5_ICPrescaler); + } +} + +/** + * @brief Enables or disables the TIM5 peripheral. + * @param NewState new state of the TIM5 peripheral.This parameter can + * be ENABLE or DISABLE. + * @retval None + */ +void TIM5_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* set or Reset the CEN Bit */ + if (NewState != DISABLE) + { + TIM5->CR1 |= TIM5_CR1_CEN ; + } + else + { + TIM5->CR1 &= (uint8_t)(~TIM5_CR1_CEN) ; + } +} + +/** + * @brief Enables or disables the specified TIM5 interrupts. + * @param NewState new state of the TIM5 peripheral. + * This parameter can be: ENABLE or DISABLE. + * @param TIM5_IT specifies the TIM5 interrupts sources to be enabled or disabled. + * This parameter can be any combination of the following values: + * - TIM5_IT_UPDATE: TIM5 update Interrupt source + * - TIM5_IT_CC1: TIM5 Capture Compare 1 Interrupt source + * - TIM5_IT_CC2: TIM5 Capture Compare 2 Interrupt source + * - TIM5_IT_CC3: TIM5 Capture Compare 3 Interrupt source + * @param NewState new state of the TIM5 peripheral. + * @retval None + */ +void TIM5_ITConfig(TIM5_IT_TypeDef TIM5_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM5_IT_OK(TIM5_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt sources */ + TIM5->IER |= (uint8_t)TIM5_IT; + } + else + { + /* Disable the Interrupt sources */ + TIM5->IER &= (uint8_t)(~TIM5_IT); + } +} + +/** + * @brief Enables or Disables the TIM5 Update event. + * @param NewState new state of the TIM5 peripheral Preload register.This parameter can + * be ENABLE or DISABLE. + * @retval None + */ +void TIM5_UpdateDisableConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the UDIS Bit */ + if (NewState != DISABLE) + { + TIM5->CR1 |= TIM5_CR1_UDIS ; + } + else + { + TIM5->CR1 &= (uint8_t)(~TIM5_CR1_UDIS) ; + } +} + +/** + * @brief Selects the TIM5 Update Request Interrupt source. + * @param TIM5_UpdateSource specifies the Update source. + * This parameter can be one of the following values + * - TIM5_UPDATESOURCE_REGULAR + * - TIM5_UPDATESOURCE_GLOBAL + * @retval None + */ +void TIM5_UpdateRequestConfig(TIM5_UpdateSource_TypeDef TIM5_UpdateSource) +{ + /* Check the parameters */ + assert_param(IS_TIM5_UPDATE_SOURCE_OK(TIM5_UpdateSource)); + + /* Set or Reset the URS Bit */ + if (TIM5_UpdateSource != TIM5_UPDATESOURCE_GLOBAL) + { + TIM5->CR1 |= TIM5_CR1_URS ; + } + else + { + TIM5->CR1 &= (uint8_t)(~TIM5_CR1_URS) ; + } +} + +/** + * @brief Selects the TIM5’s One Pulse Mode. + * @param TIM5_OPMode specifies the OPM Mode to be used. + * This parameter can be one of the following values + * - TIM5_OPMODE_SINGLE + * - TIM5_OPMODE_REPETITIVE + * @retval None + */ +void TIM5_SelectOnePulseMode(TIM5_OPMode_TypeDef TIM5_OPMode) +{ + /* Check the parameters */ + assert_param(IS_TIM5_OPM_MODE_OK(TIM5_OPMode)); + + /* Set or Reset the OPM Bit */ + if (TIM5_OPMode != TIM5_OPMODE_REPETITIVE) + { + TIM5->CR1 |= TIM5_CR1_OPM ; + } + else + { + TIM5->CR1 &= (uint8_t)(~TIM5_CR1_OPM) ; + } +} + +/** + * @brief Configures the TIM5 Prescaler. + * @param Prescaler specifies the Prescaler Register value + * This parameter can be one of the following values + * - TIM5_PRESCALER_1 + * - TIM5_PRESCALER_2 + * - TIM5_PRESCALER_4 + * - TIM5_PRESCALER_8 + * - TIM5_PRESCALER_16 + * - TIM5_PRESCALER_32 + * - TIM5_PRESCALER_64 + * - TIM5_PRESCALER_128 + * - TIM5_PRESCALER_256 + * - TIM5_PRESCALER_512 + * - TIM5_PRESCALER_1024 + * - TIM5_PRESCALER_2048 + * - TIM5_PRESCALER_4096 + * - TIM5_PRESCALER_8192 + * - TIM5_PRESCALER_16384 + * - TIM5_PRESCALER_32768 + * @param TIM5_PSCReloadMode specifies the TIM5 Prescaler Reload mode. + * This parameter can be one of the following values + * - TIM5_PSCRELOADMODE_IMMEDIATE: The Prescaler is loaded + * immediately. + * - TIM5_PSCRELOADMODE_UPDATE: The Prescaler is loaded at + * the update event. + * @retval None + */ +void TIM5_PrescalerConfig(TIM5_Prescaler_TypeDef Prescaler, + TIM5_PSCReloadMode_TypeDef TIM5_PSCReloadMode) +{ + /* Check the parameters */ + assert_param(IS_TIM5_PRESCALER_RELOAD_OK(TIM5_PSCReloadMode)); + assert_param(IS_TIM5_PRESCALER_OK(Prescaler)); + + /* Set the Prescaler value */ + TIM5->PSCR = (uint8_t)Prescaler; + + /* Set or reset the UG Bit */ + TIM5->EGR = (uint8_t)TIM5_PSCReloadMode ; +} + +/** + * @brief Forces the TIM5 Channel1 output waveform to active or inactive level. + * @param TIM5_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM5_FORCEDACTION_ACTIVE: Force active level on OC1REF + * - TIM5_FORCEDACTION_INACTIVE: Force inactive level on + * OC1REF. + * @retval None + */ +void TIM5_ForcedOC1Config(TIM5_ForcedAction_TypeDef TIM5_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM5_FORCED_ACTION_OK(TIM5_ForcedAction)); + + /* Reset the OCM Bits */ /* Configure The Forced output Mode */ + TIM5->CCMR1 = (uint8_t)((uint8_t)(TIM5->CCMR1 & (uint8_t)(~TIM5_CCMR_OCM)) + | (uint8_t)TIM5_ForcedAction); +} + +/** + * @brief Forces the TIM5 Channel2 output waveform to active or inactive level. + * @param TIM5_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM5_FORCEDACTION_ACTIVE: Force active level on OC2REF + * - TIM5_FORCEDACTION_INACTIVE: Force inactive level on + * OC2REF. + * @retval None + */ +void TIM5_ForcedOC2Config(TIM5_ForcedAction_TypeDef TIM5_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM5_FORCED_ACTION_OK(TIM5_ForcedAction)); + + /* Reset the OCM Bits */ /* Configure The Forced output Mode */ + TIM5->CCMR2 = (uint8_t)((uint8_t)(TIM5->CCMR2 & (uint8_t)(~TIM5_CCMR_OCM)) + | (uint8_t)TIM5_ForcedAction); +} + +/** + * @brief Forces the TIM5 Channel3 output waveform to active or inactive level. + * @param TIM5_ForcedAction specifies the forced Action to be set to the output waveform. + * This parameter can be one of the following values: + * - TIM5_FORCEDACTION_ACTIVE: Force active level on OC3REF + * - TIM5_FORCEDACTION_INACTIVE: Force inactive level on + * OC3REF. + * @retval None + */ +void TIM5_ForcedOC3Config(TIM5_ForcedAction_TypeDef TIM5_ForcedAction) +{ + /* Check the parameters */ + assert_param(IS_TIM5_FORCED_ACTION_OK(TIM5_ForcedAction)); + + /* Reset the OCM Bits */ /* Configure The Forced output Mode */ + TIM5->CCMR3 = (uint8_t)((uint8_t)(TIM5->CCMR3 & (uint8_t)(~TIM5_CCMR_OCM)) + | (uint8_t)TIM5_ForcedAction); +} + +/** + * @brief Enables or disables TIM5 peripheral Preload register on ARR. + * @param NewState new state of the TIM5 peripheral Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM5_ARRPreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the ARPE Bit */ + if (NewState != DISABLE) + { + TIM5->CR1 |= TIM5_CR1_ARPE ; + } + else + { + TIM5->CR1 &= (uint8_t)(~TIM5_CR1_ARPE) ; + } +} + +/** + * @brief Enables or disables the TIM5 peripheral Preload Register on CCR1. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM5_OC1PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC1PE Bit */ + if (NewState != DISABLE) + { + TIM5->CCMR1 |= TIM5_CCMR_OCxPE ; + } + else + { + TIM5->CCMR1 &= (uint8_t)(~TIM5_CCMR_OCxPE) ; + } +} + +/** + * @brief Enables or disables the TIM5 peripheral Preload Register on CCR2. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM5_OC2PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC2PE Bit */ + if (NewState != DISABLE) + { + TIM5->CCMR2 |= TIM5_CCMR_OCxPE ; + } + else + { + TIM5->CCMR2 &= (uint8_t)(~TIM5_CCMR_OCxPE) ; + } +} + +/** + * @brief Enables or disables the TIM5 peripheral Preload Register on CCR3. + * @param NewState new state of the Capture Compare Preload register. + * This parameter can be ENABLE or DISABLE. + * @retval None + */ +void TIM5_OC3PreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the OC3PE Bit */ + if (NewState != DISABLE) + { + TIM5->CCMR3 |= TIM5_CCMR_OCxPE ; + } + else + { + TIM5->CCMR3 &= (uint8_t)(~TIM5_CCMR_OCxPE) ; + } +} + +/** + * @brief Configures the TIM5 event to be generated by software. + * @param TIM5_EventSource specifies the event source. + * This parameter can be one of the following values: + * - TIM5_EVENTSOURCE_UPDATE: TIM5 update Event source + * - TIM5_EVENTSOURCE_CC1: TIM5 Capture Compare 1 Event source + * - TIM5_EVENTSOURCE_CC2: TIM5 Capture Compare 2 Event source + * - TIM5_EVENTSOURCE_CC3: TIM5 Capture Compare 3 Event source + * @retval None + */ +void TIM5_GenerateEvent(TIM5_EventSource_TypeDef TIM5_EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM5_EVENT_SOURCE_OK(TIM5_EventSource)); + + /* Set the event sources */ + TIM5->EGR = (uint8_t)TIM5_EventSource; +} + +/** + * @brief Configures the TIM5 Channel 1 polarity. + * @param TIM5_OCPolarity specifies the OC1 Polarity. + * This parameter can be one of the following values: + * - TIM5_OCPOLARITY_LOW: Output Compare active low + * - TIM5_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM5_OC1PolarityConfig(TIM5_OCPolarity_TypeDef TIM5_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM5_OC_POLARITY_OK(TIM5_OCPolarity)); + + /* Set or Reset the CC1P Bit */ + if (TIM5_OCPolarity != TIM5_OCPOLARITY_HIGH) + { + TIM5->CCER1 |= TIM5_CCER1_CC1P ; + } + else + { + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC1P) ; + } +} + + +/** + * @brief Configures the TIM5 Channel 2 polarity. + * @param TIM5_OCPolarity specifies the OC2 Polarity. + * This parameter can be one of the following values: + * - TIM5_OCPOLARITY_LOW: Output Compare active low + * - TIM5_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM5_OC2PolarityConfig(TIM5_OCPolarity_TypeDef TIM5_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM5_OC_POLARITY_OK(TIM5_OCPolarity)); + + /* Set or Reset the CC2P Bit */ + if (TIM5_OCPolarity != TIM5_OCPOLARITY_HIGH) + { + TIM5->CCER1 |= TIM5_CCER1_CC2P ; + } + else + { + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC2P) ; + } +} + +/** + * @brief Configures the TIM5 Channel 3 polarity. + * @param TIM5_OCPolarity specifies the OC3 Polarity. + * This parameter can be one of the following values: + * - TIM5_OCPOLARITY_LOW: Output Compare active low + * - TIM5_OCPOLARITY_HIGH: Output Compare active high + * @retval None + */ +void TIM5_OC3PolarityConfig(TIM5_OCPolarity_TypeDef TIM5_OCPolarity) +{ + /* Check the parameters */ + assert_param(IS_TIM5_OC_POLARITY_OK(TIM5_OCPolarity)); + + /* Set or Reset the CC3P Bit */ + if (TIM5_OCPolarity != TIM5_OCPOLARITY_HIGH) + { + TIM5->CCER2 |= TIM5_CCER2_CC3P ; + } + else + { + TIM5->CCER2 &= (uint8_t)(~TIM5_CCER2_CC3P) ; + } +} + +/** + * @brief Enables or disables the TIM5 Capture Compare Channel x. + * @param TIM5_Channel specifies the TIM5 Channel. + * This parameter can be one of the following values: + * - TIM5_Channel1: TIM5 Channel1 + * - TIM5_Channel2: TIM5 Channel2 + * - TIM5_Channel3: TIM5 Channel3 + * @param NewState specifies the TIM5 Channel CCxE bit new state. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void TIM5_CCxCmd(TIM5_Channel_TypeDef TIM5_Channel, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM5_CHANNEL_OK(TIM5_Channel)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (TIM5_Channel == TIM5_CHANNEL_1) + { + /* Set or Reset the CC1E Bit */ + if (NewState != DISABLE) + { + TIM5->CCER1 |= TIM5_CCER1_CC1E ; + } + else + { + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC1E) ; + } + + } + else if (TIM5_Channel == TIM5_CHANNEL_2) + { + /* Set or Reset the CC2E Bit */ + if (NewState != DISABLE) + { + TIM5->CCER1 |= TIM5_CCER1_CC2E; + } + else + { + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC2E) ; + } + } + else + { + /* Set or Reset the CC3E Bit */ + if (NewState != DISABLE) + { + TIM5->CCER2 |= TIM5_CCER2_CC3E; + } + else + { + TIM5->CCER2 &= (uint8_t)(~TIM5_CCER2_CC3E) ; + } + } +} + +/** + * @brief Selects the TIM5 Output Compare Mode. This function disables the + * selected channel before changing the Output Compare Mode. User has to + * enable this channel using TIM5_CCxCmd and TIM5_CCxNCmd functions. + * @param TIM5_Channel specifies the TIM5 Channel. + * This parameter can be one of the following values: + * - TIM5_Channel1: TIM5 Channel1 + * - TIM5_Channel2: TIM5 Channel2 + * - TIM5_Channel3: TIM5 Channel3 + * @param TIM5_OCMode specifies the TIM5 Output Compare Mode. + * This parameter can be one of the following values: + * - TIM5_OCMODE_TIMING + * - TIM5_OCMODE_ACTIVE + * - TIM5_OCMODE_TOGGLE + * - TIM5_OCMODE_PWM1 + * - TIM5_OCMODE_PWM2 + * - TIM5_FORCEDACTION_ACTIVE + * - TIM5_FORCEDACTION_INACTIVE + * @retval None + */ +void TIM5_SelectOCxM(TIM5_Channel_TypeDef TIM5_Channel, TIM5_OCMode_TypeDef TIM5_OCMode) +{ + /* Check the parameters */ + assert_param(IS_TIM5_CHANNEL_OK(TIM5_Channel)); + assert_param(IS_TIM5_OCM_OK(TIM5_OCMode)); + + if (TIM5_Channel == TIM5_CHANNEL_1) + { + /* Disable the Channel 1: Reset the CCE Bit */ + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC1E); + + /* Reset the Output Compare Bits Set the Output Compare Mode */ + TIM5->CCMR1 = (uint8_t)((uint8_t)(TIM5->CCMR1 & (uint8_t)(~TIM5_CCMR_OCM)) + | (uint8_t)TIM5_OCMode); + } + else if (TIM5_Channel == TIM5_CHANNEL_2) + { + /* Disable the Channel 2: Reset the CCE Bit */ + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC2E); + + /* Reset the Output Compare Bits ** Set the Output Compare Mode */ + TIM5->CCMR2 = (uint8_t)((uint8_t)(TIM5->CCMR2 & (uint8_t)(~TIM5_CCMR_OCM)) + | (uint8_t)TIM5_OCMode); + } + else + { + /* Disable the Channel 3: Reset the CCE Bit */ + TIM5->CCER2 &= (uint8_t)(~TIM5_CCER2_CC3E); + + /* Reset the Output Compare Bits ** Set the Output Compare Mode */ + TIM5->CCMR3 = (uint8_t)((uint8_t)(TIM5->CCMR3 & (uint8_t)(~TIM5_CCMR_OCM)) + | (uint8_t)TIM5_OCMode); + } +} + +/** + * @brief Sets the TIM5 Counter Register value. + * @param Counter specifies the Counter register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM5_SetCounter(uint16_t Counter) +{ + /* Set the Counter Register value */ + TIM5->CNTRH = (uint8_t)(Counter >> 8); + TIM5->CNTRL = (uint8_t)(Counter); +} + +/** + * @brief Sets the TIM5 Autoreload Register value. + * @param Autoreload specifies the Autoreload register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM5_SetAutoreload(uint16_t Autoreload) +{ + /* Set the Autoreload Register value */ + TIM5->ARRH = (uint8_t)(Autoreload >> 8); + TIM5->ARRL = (uint8_t)(Autoreload); +} + +/** + * @brief Sets the TIM5 Capture Compare1 Register value. + * @param Compare1 specifies the Capture Compare1 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM5_SetCompare1(uint16_t Compare1) +{ + /* Set the Capture Compare1 Register value */ + TIM5->CCR1H = (uint8_t)(Compare1 >> 8); + TIM5->CCR1L = (uint8_t)(Compare1); +} + +/** + * @brief Sets the TIM5 Capture Compare2 Register value. + * @param Compare2 specifies the Capture Compare2 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM5_SetCompare2(uint16_t Compare2) +{ + /* Set the Capture Compare2 Register value */ + TIM5->CCR2H = (uint8_t)(Compare2 >> 8); + TIM5->CCR2L = (uint8_t)(Compare2); +} + +/** + * @brief Sets the TIM5 Capture Compare3 Register value. + * @param Compare3 specifies the Capture Compare3 register new value. + * This parameter is between 0x0000 and 0xFFFF. + * @retval None + */ +void TIM5_SetCompare3(uint16_t Compare3) +{ + /* Set the Capture Compare3 Register value */ + TIM5->CCR3H = (uint8_t)(Compare3 >> 8); + TIM5->CCR3L = (uint8_t)(Compare3); +} + +/** + * @brief Sets the TIM5 Input Capture 1 prescaler. + * @param TIM5_IC1Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM5_ICPSC_DIV1: no prescaler + * - TIM5_ICPSC_DIV2: capture is done once every 2 events + * - TIM5_ICPSC_DIV4: capture is done once every 4 events + * - TIM5_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM5_SetIC1Prescaler(TIM5_ICPSC_TypeDef TIM5_IC1Prescaler) +{ + /* Check the parameters */ + assert_param(IS_TIM5_IC_PRESCALER_OK(TIM5_IC1Prescaler)); + + /* Reset the IC1PSC Bits */ /* Set the IC1PSC value */ + TIM5->CCMR1 = (uint8_t)((uint8_t)(TIM5->CCMR1 & (uint8_t)(~TIM5_CCMR_ICxPSC))| + (uint8_t)TIM5_IC1Prescaler); +} + +/** + * @brief Sets the TIM5 Input Capture 2 prescaler. + * @param TIM5_IC2Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM5_ICPSC_DIV1: no prescaler + * - TIM5_ICPSC_DIV2: capture is done once every 2 events + * - TIM5_ICPSC_DIV4: capture is done once every 4 events + * - TIM5_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM5_SetIC2Prescaler(TIM5_ICPSC_TypeDef TIM5_IC2Prescaler) +{ + /* Check the parameters */ + assert_param(IS_TIM5_IC_PRESCALER_OK(TIM5_IC2Prescaler)); + + /* Reset the IC1PSC Bits */ /* Set the IC1PSC value */ + TIM5->CCMR2 = (uint8_t)((uint8_t)(TIM5->CCMR2 & (uint8_t)(~TIM5_CCMR_ICxPSC)) + | (uint8_t)TIM5_IC2Prescaler); +} + +/** + * @brief Sets the TIM5 Input Capture 3 prescaler. + * @param TIM5_IC3Prescaler specifies the Input Capture prescaler new value + * This parameter can be one of the following values: + * - TIM5_ICPSC_DIV1: no prescaler + * - TIM5_ICPSC_DIV2: capture is done once every 2 events + * - TIM5_ICPSC_DIV4: capture is done once every 4 events + * - TIM5_ICPSC_DIV8: capture is done once every 8 events + * @retval None + */ +void TIM5_SetIC3Prescaler(TIM5_ICPSC_TypeDef TIM5_IC3Prescaler) +{ + /* Check the parameters */ + assert_param(IS_TIM5_IC_PRESCALER_OK(TIM5_IC3Prescaler)); + /* Reset the IC1PSC Bits */ /* Set the IC1PSC value */ + TIM5->CCMR3 = (uint8_t)((uint8_t)(TIM5->CCMR3 & (uint8_t)(~TIM5_CCMR_ICxPSC)) | + (uint8_t)TIM5_IC3Prescaler); +} + +/** + * @brief Gets the TIM5 Input Capture 1 value. + * @param None + * @retval Capture Compare 1 Register value. + */ +uint16_t TIM5_GetCapture1(void) +{ + uint16_t temp = 0; + + temp = ((uint16_t)TIM5->CCR1H << 8); + + /* Get the Capture 1 Register value */ + return (uint16_t)(temp | (uint16_t)(TIM5->CCR1L)); +} + +/** + * @brief Gets the TIM5 Input Capture 2 value. + * @param None + * @retval Capture Compare 2 Register value. + */ +uint16_t TIM5_GetCapture2(void) +{ + uint16_t temp = 0; + + temp = ((uint16_t)TIM5->CCR2H << 8); + + /* Get the Capture 2 Register value */ + return (uint16_t)(temp | (uint16_t)(TIM5->CCR2L)); +} + +/** + * @brief Gets the TIM5 Input Capture 3 value. + * @param None + * @retval Capture Compare 3 Register value. + */ +uint16_t TIM5_GetCapture3(void) +{ + uint16_t temp = 0; + + temp = ((uint16_t)TIM5->CCR3H << 8); + /* Get the Capture 1 Register value */ + return (uint16_t)(temp | (uint16_t)(TIM5->CCR3L)); +} + +/** + * @brief Gets the TIM5 Counter value. + * @param None + * @retval Counter Register value. + */ +uint16_t TIM5_GetCounter(void) +{ + uint16_t tmpcntr = 0; + + tmpcntr = ((uint16_t)TIM5->CNTRH << 8); + /* Get the Counter Register value */ + return (uint16_t)(tmpcntr | (uint16_t)(TIM5->CNTRL)); +} + +/** + * @brief Gets the TIM5 Prescaler value. + * @param None + * @retval Prescaler Register configuration value @ref TIM5_Prescaler_TypeDef . + */ +TIM5_Prescaler_TypeDef TIM5_GetPrescaler(void) +{ + /* Get the Prescaler Register value */ + return (TIM5_Prescaler_TypeDef)(TIM5->PSCR); +} + +/** + * @brief Checks whether the specified TIM5 flag is set or not. + * @param TIM5_FLAG specifies the flag to check. + * This parameter can be one of the following values: + * - TIM5_FLAG_UPDATE: TIM5 update Flag + * - TIM5_FLAG_CC1: TIM5 Capture Compare 1 Flag + * - TIM5_FLAG_CC2: TIM5 Capture Compare 2 Flag + * - TIM5_FLAG_CC3: TIM5 Capture Compare 3 Flag + * - TIM5_FLAG_CC1OF: TIM5 Capture Compare 1 overcapture Flag + * - TIM5_FLAG_CC2OF: TIM5 Capture Compare 2 overcapture Flag + * - TIM5_FLAG_CC3OF: TIM5 Capture Compare 3 overcapture Flag + * @retval FlagStatus The new state of TIM5_FLAG (SET or RESET). + */ +FlagStatus TIM5_GetFlagStatus(TIM5_FLAG_TypeDef TIM5_FLAG) +{ + FlagStatus bitstatus = RESET; + uint8_t tim5_flag_l, tim5_flag_h; + + /* Check the parameters */ + assert_param(IS_TIM5_GET_FLAG_OK(TIM5_FLAG)); + + tim5_flag_l= (uint8_t)(TIM5->SR1 & (uint8_t)TIM5_FLAG); + tim5_flag_h= (uint8_t)((uint16_t)TIM5_FLAG >> 8); + + if (((tim5_flag_l)|(uint8_t)(TIM5->SR2 & tim5_flag_h)) != RESET ) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return (FlagStatus)bitstatus; +} + +/** + * @brief Clears the TIM5’s pending flags. + * @param TIM5_FLAG specifies the flag to clear. + * This parameter can be one of the following values: + * - TIM5_FLAG_UPDATE: TIM5 update Flag + * - TIM5_FLAG_CC1: TIM5 Capture Compare 1 Flag + * - TIM5_FLAG_CC2: TIM5 Capture Compare 2 Flag + * - TIM5_FLAG_CC3: TIM5 Capture Compare 3 Flag + * - TIM5_FLAG_CC1OF: TIM5 Capture Compare 1 overcapture Flag + * - TIM5_FLAG_CC2OF: TIM5 Capture Compare 2 overcapture Flag + * - TIM5_FLAG_CC3OF: TIM5 Capture Compare 3 overcapture Flag + * @retval None. + */ +void TIM5_ClearFlag(TIM5_FLAG_TypeDef TIM5_FLAG) +{ + /* Check the parameters */ + assert_param(IS_TIM5_CLEAR_FLAG_OK(TIM5_FLAG)); + + /* Clear the flags (rc_w0) clear this bit by writing 0. Writing ‘1’ has no effect*/ + TIM5->SR1 = (uint8_t)(~((uint8_t)(TIM5_FLAG))); + TIM5->SR2 &= (uint8_t)(~((uint8_t)((uint16_t)TIM5_FLAG >> 8))); +} + +/** + * @brief Checks whether the TIM5 interrupt has occurred or not. + * @param TIM5_IT specifies the TIM5 interrupt source to check. + * This parameter can be one of the following values: + * - TIM5_IT_UPDATE: TIM5 update Interrupt source + * - TIM5_IT_CC1: TIM5 Capture Compare 1 Interrupt source + * - TIM5_IT_CC2: TIM5 Capture Compare 2 Interrupt source + * - TIM5_IT_CC3: TIM5 Capture Compare 3 Interrupt source + * @retval ITStatus The new state of the TIM5_IT(SET or RESET). + */ + +ITStatus TIM5_GetITStatus(TIM5_IT_TypeDef TIM5_IT) +{ + ITStatus bitstatus = RESET; + uint8_t TIM5_itStatus = 0, TIM5_itEnable = 0; + + /* Check the parameters */ + assert_param(IS_TIM5_GET_IT_OK(TIM5_IT)); + + TIM5_itStatus = (uint8_t)(TIM5->SR1 & TIM5_IT); + + TIM5_itEnable = (uint8_t)(TIM5->IER & TIM5_IT); + + if ((TIM5_itStatus != (uint8_t)RESET ) && (TIM5_itEnable != (uint8_t)RESET )) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return (ITStatus)(bitstatus); +} + +/** + * @brief Clears the TIM5's interrupt pending bits. + * @param TIM5_IT specifies the pending bit to clear. + * This parameter can be one of the following values: + * - TIM5_IT_UPDATE: TIM5 update Interrupt source + * - TIM5_IT_CC1: TIM5 Capture Compare 1 Interrupt source + * - TIM5_IT_CC2: TIM5 Capture Compare 2 Interrupt source + * - TIM5_IT_CC3: TIM5 Capture Compare 3 Interrupt source + * @retval None. + */ +void TIM5_ClearITPendingBit(TIM5_IT_TypeDef TIM5_IT) +{ + /* Check the parameters */ + assert_param(IS_TIM5_IT_OK(TIM5_IT)); + + /* Clear the IT pending Bit */ + TIM5->SR1 = (uint8_t)(~TIM5_IT); +} + +/** + * @brief Configure the TI1 as Input. + * @param TIM5_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM5_ICPOLARITY_FALLING + * - TIM5_ICPOLARITY_RISING + * @param TIM5_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM5_ICSELECTION_DIRECTTI: TIM5 Input 1 is selected to + * be connected to IC1. + * - TIM5_ICSELECTION_INDIRECTTI: TIM5 Input 1 is selected to + * be connected to IC2. + * @param TIM5_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI1_Config(uint8_t TIM5_ICPolarity, + uint8_t TIM5_ICSelection, + uint8_t TIM5_ICFilter) +{ + /* Disable the Channel 1: Reset the CCE Bit */ + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC1E); + + /* Select the Input and set the filter */ + TIM5->CCMR1 = (uint8_t)((uint8_t)(TIM5->CCMR1 & (uint8_t)(~( TIM5_CCMR_CCxS | TIM5_CCMR_ICxF ))) + | (uint8_t)(( (TIM5_ICSelection)) | ((uint8_t)( TIM5_ICFilter << 4)))); + + /* Select the Polarity */ + if (TIM5_ICPolarity != TIM5_ICPOLARITY_RISING) + { + TIM5->CCER1 |= TIM5_CCER1_CC1P ; + } + else + { + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC1P) ; + } + /* Set the CCE Bit */ + TIM5->CCER1 |= TIM5_CCER1_CC1E; +} + +/** + * @brief Configure the TI2 as Input. + * @param TIM5_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM5_ICPOLARITY_FALLING + * - TIM5_ICPOLARITY_RISING + * @param TIM5_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM5_ICSELECTION_DIRECTTI: TIM5 Input 2 is selected to + * be connected to IC2. + * - TIM5_ICSELECTION_INDIRECTTI: TIM5 Input 2 is selected to + * be connected to IC1. + * @param TIM5_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI2_Config(uint8_t TIM5_ICPolarity, + uint8_t TIM5_ICSelection, + uint8_t TIM5_ICFilter) +{ + /* Disable the Channel 2: Reset the CCE Bit */ + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC2E); + + /* Select the Input and set the filter */ + TIM5->CCMR2 = (uint8_t)((uint8_t)(TIM5->CCMR2 & (uint8_t)(~( TIM5_CCMR_CCxS | TIM5_CCMR_ICxF))) + | (uint8_t)(( (TIM5_ICSelection)) | ((uint8_t)( TIM5_ICFilter << 4)))); + + + /* Select the Polarity */ + if (TIM5_ICPolarity != TIM5_ICPOLARITY_RISING) + { + TIM5->CCER1 |= TIM5_CCER1_CC2P ; + } + else + { + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC2P) ; + } + + /* Set the CCE Bit */ + TIM5->CCER1 |= TIM5_CCER1_CC2E; +} + +/** + * @brief Configure the TI3 as Input. + * @param TIM5_ICPolarity The Input Polarity. + * This parameter can be one of the following values: + * - TIM5_ICPOLARITY_FALLING + * - TIM5_ICPOLARITY_RISING + * @param TIM5_ICSelection specifies the input to be used. + * This parameter can be one of the following values: + * - TIM5_ICSELECTION_DIRECTTI: TIM5 Input 3 is selected to + * be connected to IC3. + * @param TIM5_ICFilter Specifies the Input Capture Filter. + * This parameter must be a value between 0x00 and 0x0F. + * @retval None + */ +static void TI3_Config(uint8_t TIM5_ICPolarity, uint8_t TIM5_ICSelection, + uint8_t TIM5_ICFilter) +{ + /* Disable the Channel 3: Reset the CCE Bit */ + TIM5->CCER2 &= (uint8_t)(~TIM5_CCER2_CC3E); + + /* Select the Input and set the filter */ + TIM5->CCMR3 = (uint8_t)((uint8_t)(TIM5->CCMR3 & (uint8_t)(~( TIM5_CCMR_CCxS | TIM5_CCMR_ICxF))) + | (uint8_t)(( (TIM5_ICSelection)) | ((uint8_t)( TIM5_ICFilter << 4)))); + + + /* Select the Polarity */ + if (TIM5_ICPolarity != TIM5_ICPOLARITY_RISING) + { + TIM5->CCER2 |= TIM5_CCER2_CC3P ; + } + else + { + TIM5->CCER2 &= (uint8_t)(~TIM5_CCER2_CC3P) ; + } + /* Set the CCE Bit */ + TIM5->CCER2 |= TIM5_CCER2_CC3E; +} + +/** + * @brief Enables the TIM5 internal Clock. + * @par Parameters: + * None + * @retval None + */ +void TIM5_InternalClockConfig(void) +{ + /* Disable slave mode to clock the prescaler directly with the internal clock */ + TIM5->SMCR &= (uint8_t)(~TIM5_SMCR_SMS); +} + +/** + * @brief Selects the TIM5 Trigger Output Mode. + * @param TIM5_TRGOSource : Specifies the Trigger Output source. + * This parameter can be one of the @ref TIM5_TRGOSource_TypeDef enumeration. + * @retval None + */ +void TIM5_SelectOutputTrigger(TIM5_TRGOSource_TypeDef TIM5_TRGOSource) +{ + uint8_t tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM5_TRGO_SOURCE_OK(TIM5_TRGOSource)); + + tmpcr2 = TIM5->CR2; + + /* Reset the MMS Bits */ + tmpcr2 &= (uint8_t)(~TIM5_CR2_MMS); + + /* Select the TRGO source */ + tmpcr2 |= (uint8_t)TIM5_TRGOSource; + + TIM5->CR2 = tmpcr2; +} + +/** + * @brief Selects the TIM5 Slave Mode. + * @param TIM5_SlaveMode : Specifies the TIM5 Slave Mode. + * This parameter can be one of the @ref TIM5_SlaveMode_TypeDef enumeration. + * @retval None + */ +void TIM5_SelectSlaveMode(TIM5_SlaveMode_TypeDef TIM5_SlaveMode) +{ + uint8_t tmpsmcr = 0; + + /* Check the parameters */ + assert_param(IS_TIM5_SLAVE_MODE_OK(TIM5_SlaveMode)); + + tmpsmcr = TIM5->SMCR; + + /* Reset the SMS Bits */ + tmpsmcr &= (uint8_t)(~TIM5_SMCR_SMS); + + /* Select the Slave Mode */ + tmpsmcr |= (uint8_t)TIM5_SlaveMode; + + TIM5->SMCR = tmpsmcr; +} + +/** + * @brief Selects the TIM5 Input Trigger source. + * @param TIM5_InputTriggerSource : Specifies Input Trigger source. + * This parameter can be one of the @ref TIM5_TS_TypeDef enumeration. + * @retval None + */ +void TIM5_SelectInputTrigger(TIM5_TS_TypeDef TIM5_InputTriggerSource) +{ + uint8_t tmpsmcr = 0; + + /* Check the parameters */ + assert_param(IS_TIM5_TRIGGER_SELECTION_OK(TIM5_InputTriggerSource)); + + tmpsmcr = TIM5->SMCR; + + /* Select the Trigger Source */ + tmpsmcr &= (uint8_t)(~TIM5_SMCR_TS); + tmpsmcr |= (uint8_t)TIM5_InputTriggerSource; + + TIM5->SMCR = (uint8_t)tmpsmcr; +} + +/** + * @brief Configures the TIM5 Encoder Interface. + * @param TIM5_EncoderMode : Specifies the TIM5 Encoder Mode. + * This parameter can be one of the @ref TIM5_EncoderMode_TypeDef enumeration. + * @param TIM5_IC1Polarity : Specifies the IC1 Polarity. + * This parameter can be one of the @ref TIM5_ICPolarity_TypeDef enumeration. + * @param TIM5_IC2Polarity : Specifies the IC2 Polarity. + * This parameter can be one of the @ref TIM5_ICPolarity_TypeDef enumeration. + * @retval None + */ +void TIM5_EncoderInterfaceConfig(TIM5_EncoderMode_TypeDef TIM5_EncoderMode, + TIM5_ICPolarity_TypeDef TIM5_IC1Polarity, + TIM5_ICPolarity_TypeDef TIM5_IC2Polarity) +{ + uint8_t tmpsmcr = 0; + uint8_t tmpccmr1 = 0; + uint8_t tmpccmr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM5_ENCODER_MODE_OK(TIM5_EncoderMode)); + assert_param(IS_TIM5_IC_POLARITY_OK(TIM5_IC1Polarity)); + assert_param(IS_TIM5_IC_POLARITY_OK(TIM5_IC2Polarity)); + + tmpsmcr = TIM5->SMCR; + tmpccmr1 = TIM5->CCMR1; + tmpccmr2 = TIM5->CCMR2; + + /* Set the encoder Mode */ + tmpsmcr &= (uint8_t)(TIM5_SMCR_MSM | TIM5_SMCR_TS) ; + tmpsmcr |= (uint8_t)TIM5_EncoderMode; + + /* Select the Capture Compare 1 and the Capture Compare 2 as input */ + tmpccmr1 &= (uint8_t)(~TIM5_CCMR_CCxS); + tmpccmr2 &= (uint8_t)(~TIM5_CCMR_CCxS); + tmpccmr1 |= TIM5_CCMR_TIxDirect_Set; + tmpccmr2 |= TIM5_CCMR_TIxDirect_Set; + + /* Set the TI1 and the TI2 Polarities */ + if (TIM5_IC1Polarity == TIM5_ICPOLARITY_FALLING) + { + TIM5->CCER1 |= TIM5_CCER1_CC1P ; + } + else + { + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC1P) ; + } + + if (TIM5_IC2Polarity == TIM5_ICPOLARITY_FALLING) + { + TIM5->CCER1 |= TIM5_CCER1_CC2P ; + } + else + { + TIM5->CCER1 &= (uint8_t)(~TIM5_CCER1_CC2P) ; + } + + TIM5->SMCR = tmpsmcr; + TIM5->CCMR1 = tmpccmr1; + TIM5->CCMR2 = tmpccmr2; +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_tim6.c b/4_EXT_INT_1PORT/lib/src/stm8s_tim6.c new file mode 100644 index 0000000..eb1b035 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_tim6.c @@ -0,0 +1,515 @@ +/** + ****************************************************************************** + * @file stm8s_tim6.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the TIM6 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_tim6.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ + + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/** + * @addtogroup TIM6_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the TIM6 peripheral registers to their default reset values. + * @param None + * @retval None + */ +void TIM6_DeInit(void) +{ + TIM6->CR1 = TIM6_CR1_RESET_VALUE; + TIM6->CR2 = TIM6_CR2_RESET_VALUE; + TIM6->SMCR = TIM6_SMCR_RESET_VALUE; + TIM6->IER = TIM6_IER_RESET_VALUE; + TIM6->CNTR = TIM6_CNTR_RESET_VALUE; + TIM6->PSCR = TIM6_PSCR_RESET_VALUE; + TIM6->ARR = TIM6_ARR_RESET_VALUE; + TIM6->SR1 = TIM6_SR1_RESET_VALUE; +} + +/** + * @brief Initializes the TIM6 Time Base Unit according to the specified + * parameters. + * @param TIM6_Prescaler : This parameter can be any of the @Ref TIM5_Prescaler_TypeDef enumeration. + * @param TIM6_Period : This parameter must be a value between 0x00 and 0xFF. + * @retval None + */ +void TIM6_TimeBaseInit(TIM6_Prescaler_TypeDef TIM6_Prescaler, + uint8_t TIM6_Period) +{ + /* Check TIM6 prescaler value */ + assert_param(IS_TIM6_PRESCALER_OK(TIM6_Prescaler)); + /* Set the Autoreload value */ + TIM6->ARR = (uint8_t)(TIM6_Period); + /* Set the Prescaler value */ + TIM6->PSCR = (uint8_t)(TIM6_Prescaler); +} + +/** + * @brief Enables or disables the TIM6 peripheral. + * @param NewState : The new state of the TIM6 peripheral. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void TIM6_Cmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* set or Reset the CEN Bit */ + if (NewState == ENABLE) + { + TIM6->CR1 |= TIM6_CR1_CEN ; + } + else + { + TIM6->CR1 &= (uint8_t)(~TIM6_CR1_CEN) ; + } +} + +/** + * @brief Enables or Disables the TIM6 Update event. + * @param NewState : The new state of the TIM6 peripheral Preload register. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void TIM6_UpdateDisableConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the UDIS Bit */ + if (NewState == ENABLE) + { + TIM6->CR1 |= TIM6_CR1_UDIS ; + } + else + { + TIM6->CR1 &= (uint8_t)(~TIM6_CR1_UDIS) ; + } +} + +/** + * @brief Selects the TIM6 Update Request Interrupt source. + * @param TIM6_UpdateSource : Specifies the Update source. + * This parameter can be one of the @ref TIM6_UpdateSource_TypeDef enumeration. + * @retval None + */ +void TIM6_UpdateRequestConfig(TIM6_UpdateSource_TypeDef TIM6_UpdateSource) +{ + /* Check the parameters */ + assert_param(IS_TIM6_UPDATE_SOURCE_OK(TIM6_UpdateSource)); + + /* Set or Reset the URS Bit */ + if (TIM6_UpdateSource == TIM6_UPDATESOURCE_REGULAR) + { + TIM6->CR1 |= TIM6_CR1_URS ; + } + else + { + TIM6->CR1 &= (uint8_t)(~TIM6_CR1_URS) ; + } +} + +/** + * @brief Selects the TIM6’s One Pulse Mode. + * @param TIM6_OPMode : Specifies the OPM Mode to be used. + * This parameter can be one of the @ref TIM6_OPMode_TypeDef enumeration. + * @retval None + */ +void TIM6_SelectOnePulseMode(TIM6_OPMode_TypeDef TIM6_OPMode) +{ + /* Check the parameters */ + assert_param(IS_TIM6_OPM_MODE_OK(TIM6_OPMode)); + + /* Set or Reset the OPM Bit */ + if (TIM6_OPMode == TIM6_OPMODE_SINGLE) + { + TIM6->CR1 |= TIM6_CR1_OPM ; + } + else + { + TIM6->CR1 &= (uint8_t)(~TIM6_CR1_OPM) ; + } +} + +/** + * @brief Configures the TIM6 Prescaler. + * @param Prescaler : Specifies the Prescaler Register value + * This parameter can be one of the @ref TIM6_Prescaler_TypeDef enumeration. + * @param TIM6_PSCReloadMode : Specifies the TIM6 Prescaler Reload mode. + * This parameter can be one of the @ref TIM6_PSCReloadMode_TypeDef enumeration. + * @retval None + */ +void TIM6_PrescalerConfig(TIM6_Prescaler_TypeDef Prescaler, + TIM6_PSCReloadMode_TypeDef TIM6_PSCReloadMode) +{ + /* Check the parameters */ + assert_param(IS_TIM6_PRESCALER_RELOAD_OK(TIM6_PSCReloadMode)); + assert_param(IS_TIM6_PRESCALER_OK(Prescaler)); + + /* Set the Prescaler value */ + TIM6->PSCR = (uint8_t)Prescaler; + + /* Set or reset the UG Bit */ + if (TIM6_PSCReloadMode == TIM6_PSCRELOADMODE_IMMEDIATE) + { + TIM6->EGR |= TIM6_EGR_UG ; + } + else + { + TIM6->EGR &= (uint8_t)(~TIM6_EGR_UG) ; + } +} + +/** + * @brief Enables or disables TIM6 peripheral Preload register on ARR. + * @param NewState : The new state of the TIM6 peripheral Preload register. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void TIM6_ARRPreloadConfig(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the ARPE Bit */ + if (NewState == ENABLE) + { + TIM6->CR1 |= TIM6_CR1_ARPE ; + } + else + { + TIM6->CR1 &= (uint8_t)(~TIM6_CR1_ARPE) ; + } +} + +/** + * @brief Sets the TIM6 Counter Register value. + * @param Counter : Specifies the Counter register new value. + * This parameter is between 0x00 and 0xFF. + * @retval None + */ +void TIM6_SetCounter(uint8_t Counter) +{ + /* Set the Counter Register value */ + TIM6->CNTR = (uint8_t)(Counter); +} + +/** + * @brief Sets the TIM6 Autoreload Register value. + * @param Autoreload : Specifies the Autoreload register new value. + * This parameter is between 0x00 and 0xFF. + * @retval None + */ +void TIM6_SetAutoreload(uint8_t Autoreload) +{ + /* Set the Autoreload Register value */ + TIM6->ARR = (uint8_t)(Autoreload); +} + +/** + * @brief Gets the TIM6 Counter value. + * @param None + * @retval uint8_t: Counter Register value. + */ +uint8_t TIM6_GetCounter(void) +{ + uint8_t tmpcntr=0; + tmpcntr = TIM6->CNTR; + /* Get the Counter Register value */ + return ((uint8_t)tmpcntr); +} + +/** + * @brief Gets the TIM6 Prescaler value. + * @param None + * @retval TIM6_Prescaler_TypeDef : Prescaler Register configuration value. + */ +TIM6_Prescaler_TypeDef TIM6_GetPrescaler(void) +{ + /* Get the Prescaler Register value */ + return ((TIM6_Prescaler_TypeDef)TIM6->PSCR); +} + +/** + * @brief Enables or disables the specified TIM6 interrupts. + * @param TIM6_IT : Specifies the TIM6 interrupts sources to be enabled or disabled. + * This parameter can be any combination of the @ref TIM6_IT_TypeDef enumeration. + * @param NewState : The new state of the TIM6 peripheral. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + * @par Required preconditions: + * If QST option bit is enabled, the TIM6 Interrupt vector will be mapped on IRQ number 2 (irq0). + * Otherwise, it will be mapped on IRQ number 27 (irq25). + */ +void TIM6_ITConfig(TIM6_IT_TypeDef TIM6_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_TIM6_IT_OK(TIM6_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState == ENABLE) + { + /* Enable the Interrupt sources */ + TIM6->IER |= (uint8_t)TIM6_IT; + } + else + { + /* Disable the Interrupt sources */ + TIM6->IER &= (uint8_t)(~(uint8_t)TIM6_IT); + } +} + +/** + * @brief Clears the TIM’s pending flags. + * @param TIM6_FLAG : Specifies the flag to clear. + * This parameter can be one of the @ref TIM6_FLAG_TypeDef enumeration. + * @retval None + */ +void TIM6_ClearFlag(TIM6_FLAG_TypeDef TIM6_FLAG) +{ + /* Check the parameters */ + assert_param(IS_TIM6_CLEAR_FLAG_OK((uint8_t)TIM6_FLAG)); + /* Clear the flags (rc_w0) clear this bit by writing 0. Writing ‘1’ has no effect*/ + TIM6->SR1 &= (uint8_t)(~((uint8_t)TIM6_FLAG)); +} + +/** + * @brief Checks whether the TIM6 interrupt has occurred or not. + * @param TIM6_IT : Specifies the TIM6 interrupt source to check. + * This parameter can be one of the @ref TIM6_IT_TypeDef enumeration. + * @retval ITStatus : The new state of the TIM6_IT. + * This parameter can be any of the @ref ITStatus enumeration. + */ +ITStatus TIM6_GetITStatus(TIM6_IT_TypeDef TIM6_IT) +{ + ITStatus bitstatus = RESET; + uint8_t itStatus = 0, itEnable = 0; + + /* Check the parameters */ + assert_param(IS_TIM6_GET_IT_OK(TIM6_IT)); + + itStatus = (uint8_t)(TIM6->SR1 & (uint8_t)TIM6_IT); + + itEnable = (uint8_t)(TIM6->IER & (uint8_t)TIM6_IT); + + if ((itStatus != (uint8_t)RESET ) && (itEnable != (uint8_t)RESET )) + { + bitstatus = (ITStatus)SET; + } + else + { + bitstatus = (ITStatus)RESET; + } + return ((ITStatus)bitstatus); +} + +/** + * @brief Configures the TIM6 event to be generated by software. + * @param TIM6_EventSource : Specifies the event source. + * This parameter can be one of the @ref TIM6_EventSource_TypeDef enumeration. + * @retval None + */ +void TIM6_GenerateEvent(TIM6_EventSource_TypeDef TIM6_EventSource) +{ + /* Check the parameters */ + assert_param(IS_TIM6_EVENT_SOURCE_OK((uint8_t)TIM6_EventSource)); + + /* Set the event sources */ + TIM6->EGR |= (uint8_t)TIM6_EventSource; +} + +/** + * @brief Checks whether the specified TIM6 flag is set or not. + * @param TIM6_FLAG : Specifies the flag to check. + * This parameter can be one of the @ref TIM6_FLAG_TypeDef enumeration. + * @retval FlagStatus : The new state of TIM6_FLAG. + * This parameter can be any of the @ref FlagStatus enumeration. + */ +FlagStatus TIM6_GetFlagStatus(TIM6_FLAG_TypeDef TIM6_FLAG) +{ + volatile FlagStatus bitstatus = RESET; + + /* Check the parameters */ + assert_param(IS_TIM6_GET_FLAG_OK(TIM6_FLAG)); + + if ((TIM6->SR1 & (uint8_t)TIM6_FLAG) != 0) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return ((FlagStatus)bitstatus); +} + +/** + * @brief Clears the TIM6's interrupt pending bits. + * @param TIM6_IT : Specifies the pending bit to clear. + * This parameter can be one of the @ref TIM6_IT_TypeDef enumeration. + * @retval None + */ +void TIM6_ClearITPendingBit(TIM6_IT_TypeDef TIM6_IT) +{ + /* Check the parameters */ + assert_param(IS_TIM6_IT_OK(TIM6_IT)); + + /* Clear the IT pending Bit */ + TIM6->SR1 &= (uint8_t)(~(uint8_t)TIM6_IT); +} + +/** + * @brief Selects the TIM6 Trigger Output Mode. + * @param TIM6_TRGOSource : Specifies the Trigger Output source. + * This parameter can be one of the @ref TIM6_TRGOSource_TypeDef enumeration. + * @retval None + */ +void TIM6_SelectOutputTrigger(TIM6_TRGOSource_TypeDef TIM6_TRGOSource) +{ + uint8_t tmpcr2 = 0; + + /* Check the parameters */ + assert_param(IS_TIM6_TRGO_SOURCE_OK(TIM6_TRGOSource)); + + tmpcr2 = TIM6->CR2; + + /* Reset the MMS Bits */ + tmpcr2 &= (uint8_t)(~TIM6_CR2_MMS); + + /* Select the TRGO source */ + tmpcr2 |= (uint8_t)TIM6_TRGOSource; + + TIM6->CR2 = tmpcr2; +} + +/** + * @brief Sets or Resets the TIM6 Master/Slave Mode. + * @param NewState : The new state of the synchronization between TIM6 and its slaves (through TRGO). + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ + +void TIM6_SelectMasterSlaveMode(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Set or Reset the MSM Bit */ + if (NewState == ENABLE) + { + TIM6->SMCR |= TIM6_SMCR_MSM; + } + else + { + TIM6->SMCR &= (uint8_t)(~TIM6_SMCR_MSM); + } +} + +/** + * @brief Selects the TIM6 Input Trigger source. + * @param TIM6_InputTriggerSource : Specifies Input Trigger source. + * This parameter can be one of the @ref TIM6_TS_TypeDef enumeration. + * @retval None + */ +void TIM6_SelectInputTrigger(TIM6_TS_TypeDef TIM6_InputTriggerSource) +{ + uint8_t tmpsmcr = 0; + + /* Check the parameters */ + assert_param(IS_TIM6_TRIGGER_SELECTION_OK(TIM6_InputTriggerSource)); + + tmpsmcr = TIM6->SMCR; + + /* Select the Trigger Source */ + tmpsmcr &= (uint8_t)(~TIM6_SMCR_TS); + tmpsmcr |= (uint8_t)TIM6_InputTriggerSource; + + TIM6->SMCR = (uint8_t)tmpsmcr; +} + +/** + * @brief Enables the TIM6 internal Clock. + * @param None + * @retval None + */ +void TIM6_InternalClockConfig(void) +{ + /* Disable slave mode to clock the prescaler directly with the internal clock */ + TIM6->SMCR &= (uint8_t)(~TIM6_SMCR_SMS); +} + +/** + * @brief Selects the TIM6 Slave Mode. + * @param TIM6_SlaveMode : Specifies the TIM6 Slave Mode. + * This parameter can be one of the @ref TIM6_SlaveMode_TypeDef enumeration. + * @retval None + */ +void TIM6_SelectSlaveMode(TIM6_SlaveMode_TypeDef TIM6_SlaveMode) +{ + uint8_t tmpsmcr = 0; + + /* Check the parameters */ + assert_param(IS_TIM6_SLAVE_MODE_OK(TIM6_SlaveMode)); + + tmpsmcr = TIM6->SMCR; + + /* Reset the SMS Bits */ + tmpsmcr &= (uint8_t)(~TIM6_SMCR_SMS); + + /* Select the Slave Mode */ + tmpsmcr |= (uint8_t)TIM6_SlaveMode; + + TIM6->SMCR = tmpsmcr; +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_uart1.c b/4_EXT_INT_1PORT/lib/src/stm8s_uart1.c new file mode 100644 index 0000000..4efc56f --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_uart1.c @@ -0,0 +1,800 @@ +/** + ******************************************************************************** + * @file stm8s_uart1.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the UART1 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_uart1.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Public functions ----------------------------------------------------------*/ + +/** @} + * @addtogroup UART1_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the UART peripheral. + * @param None + * @retval None + */ +void UART1_DeInit(void) +{ + /* Clear the Idle Line Detected bit in the status register by a read + to the UART1_SR register followed by a Read to the UART1_DR register */ + (void)UART1->SR; + (void)UART1->DR; + + UART1->BRR2 = UART1_BRR2_RESET_VALUE; /* Set UART1_BRR2 to reset value 0x00 */ + UART1->BRR1 = UART1_BRR1_RESET_VALUE; /* Set UART1_BRR1 to reset value 0x00 */ + + UART1->CR1 = UART1_CR1_RESET_VALUE; /* Set UART1_CR1 to reset value 0x00 */ + UART1->CR2 = UART1_CR2_RESET_VALUE; /* Set UART1_CR2 to reset value 0x00 */ + UART1->CR3 = UART1_CR3_RESET_VALUE; /* Set UART1_CR3 to reset value 0x00 */ + UART1->CR4 = UART1_CR4_RESET_VALUE; /* Set UART1_CR4 to reset value 0x00 */ + UART1->CR5 = UART1_CR5_RESET_VALUE; /* Set UART1_CR5 to reset value 0x00 */ + + UART1->GTR = UART1_GTR_RESET_VALUE; + UART1->PSCR = UART1_PSCR_RESET_VALUE; +} + +/** + * @brief Initializes the UART1 according to the specified parameters. + * @note Configure in Push Pull or Open Drain mode the Tx pin by setting the + * correct I/O Port register according the product package and line + * configuration + * @param BaudRate: The baudrate. + * @param WordLength : This parameter can be any of the + * @ref UART1_WordLength_TypeDef enumeration. + * @param StopBits: This parameter can be any of the + * @ref UART1_StopBits_TypeDef enumeration. + * @param Parity: This parameter can be any of the + * @ref UART1_Parity_TypeDef enumeration. + * @param SyncMode: This parameter can be any of the + * @ref UART1_SyncMode_TypeDef values. + * @param Mode: This parameter can be any of the @ref UART1_Mode_TypeDef values + * @retval None + */ +void UART1_Init(uint32_t BaudRate, UART1_WordLength_TypeDef WordLength, + UART1_StopBits_TypeDef StopBits, UART1_Parity_TypeDef Parity, + UART1_SyncMode_TypeDef SyncMode, UART1_Mode_TypeDef Mode) +{ + uint32_t BaudRate_Mantissa = 0, BaudRate_Mantissa100 = 0; + + /* Check the parameters */ + assert_param(IS_UART1_BAUDRATE_OK(BaudRate)); + assert_param(IS_UART1_WORDLENGTH_OK(WordLength)); + assert_param(IS_UART1_STOPBITS_OK(StopBits)); + assert_param(IS_UART1_PARITY_OK(Parity)); + assert_param(IS_UART1_MODE_OK((uint8_t)Mode)); + assert_param(IS_UART1_SYNCMODE_OK((uint8_t)SyncMode)); + + /* Clear the word length bit */ + UART1->CR1 &= (uint8_t)(~UART1_CR1_M); + + /* Set the word length bit according to UART1_WordLength value */ + UART1->CR1 |= (uint8_t)WordLength; + + /* Clear the STOP bits */ + UART1->CR3 &= (uint8_t)(~UART1_CR3_STOP); + /* Set the STOP bits number according to UART1_StopBits value */ + UART1->CR3 |= (uint8_t)StopBits; + + /* Clear the Parity Control bit */ + UART1->CR1 &= (uint8_t)(~(UART1_CR1_PCEN | UART1_CR1_PS )); + /* Set the Parity Control bit to UART1_Parity value */ + UART1->CR1 |= (uint8_t)Parity; + + /* Clear the LSB mantissa of UART1DIV */ + UART1->BRR1 &= (uint8_t)(~UART1_BRR1_DIVM); + /* Clear the MSB mantissa of UART1DIV */ + UART1->BRR2 &= (uint8_t)(~UART1_BRR2_DIVM); + /* Clear the Fraction bits of UART1DIV */ + UART1->BRR2 &= (uint8_t)(~UART1_BRR2_DIVF); + + /* Set the UART1 BaudRates in BRR1 and BRR2 registers according to UART1_BaudRate value */ + BaudRate_Mantissa = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4)); + BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4)); + /* Set the fraction of UART1DIV */ + UART1->BRR2 |= (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) << 4) / 100) & (uint8_t)0x0F); + /* Set the MSB mantissa of UART1DIV */ + UART1->BRR2 |= (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0); + /* Set the LSB mantissa of UART1DIV */ + UART1->BRR1 |= (uint8_t)BaudRate_Mantissa; + + /* Disable the Transmitter and Receiver before setting the LBCL, CPOL and CPHA bits */ + UART1->CR2 &= (uint8_t)~(UART1_CR2_TEN | UART1_CR2_REN); + /* Clear the Clock Polarity, lock Phase, Last Bit Clock pulse */ + UART1->CR3 &= (uint8_t)~(UART1_CR3_CPOL | UART1_CR3_CPHA | UART1_CR3_LBCL); + /* Set the Clock Polarity, lock Phase, Last Bit Clock pulse */ + UART1->CR3 |= (uint8_t)((uint8_t)SyncMode & (uint8_t)(UART1_CR3_CPOL | + UART1_CR3_CPHA | UART1_CR3_LBCL)); + + if ((uint8_t)(Mode & UART1_MODE_TX_ENABLE)) + { + /* Set the Transmitter Enable bit */ + UART1->CR2 |= (uint8_t)UART1_CR2_TEN; + } + else + { + /* Clear the Transmitter Disable bit */ + UART1->CR2 &= (uint8_t)(~UART1_CR2_TEN); + } + if ((uint8_t)(Mode & UART1_MODE_RX_ENABLE)) + { + /* Set the Receiver Enable bit */ + UART1->CR2 |= (uint8_t)UART1_CR2_REN; + } + else + { + /* Clear the Receiver Disable bit */ + UART1->CR2 &= (uint8_t)(~UART1_CR2_REN); + } + /* Set the Clock Enable bit, lock Polarity, lock Phase and Last Bit Clock + pulse bits according to UART1_Mode value */ + if ((uint8_t)(SyncMode & UART1_SYNCMODE_CLOCK_DISABLE)) + { + /* Clear the Clock Enable bit */ + UART1->CR3 &= (uint8_t)(~UART1_CR3_CKEN); + } + else + { + UART1->CR3 |= (uint8_t)((uint8_t)SyncMode & UART1_CR3_CKEN); + } +} + +/** + * @brief Enable the UART1 peripheral. + * @param NewState : The new state of the UART Communication. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void UART1_Cmd(FunctionalState NewState) +{ + if (NewState != DISABLE) + { + /* UART1 Enable */ + UART1->CR1 &= (uint8_t)(~UART1_CR1_UARTD); + } + else + { + /* UART Disable */ + UART1->CR1 |= UART1_CR1_UARTD; + } +} + +/** + * @brief Enables or disables the specified USART interrupts. + * @param UART1_IT specifies the USART interrupt sources to be enabled or disabled. + * This parameter can be one of the following values: + * - UART1_IT_TXE: Transmit Data Register empty interrupt + * - UART1_IT_TC: Transmission complete interrupt + * - UART1_IT_RXNE_OR: Receive Data register not empty and Overrun interrupt + * - UART1_IT_IDLE: Idle line detection interrupt + * - USRT1_IT_ERR: Error interrupt + * @param NewState new state of the specified USART interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART1_ITConfig(UART1_IT_TypeDef UART1_IT, FunctionalState NewState) +{ + uint8_t uartreg = 0, itpos = 0x00; + + /* Check the parameters */ + assert_param(IS_UART1_CONFIG_IT_OK(UART1_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Get the UART1 register index */ + uartreg = (uint8_t)((uint16_t)UART1_IT >> 0x08); + /* Get the UART1 IT index */ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART1_IT & (uint8_t)0x0F)); + + if (NewState != DISABLE) + { + /**< Enable the Interrupt bits according to UART1_IT mask */ + if (uartreg == 0x01) + { + UART1->CR1 |= itpos; + } + else if (uartreg == 0x02) + { + UART1->CR2 |= itpos; + } + else + { + UART1->CR4 |= itpos; + } + } + else + { + /**< Disable the interrupt bits according to UART1_IT mask */ + if (uartreg == 0x01) + { + UART1->CR1 &= (uint8_t)(~itpos); + } + else if (uartreg == 0x02) + { + UART1->CR2 &= (uint8_t)(~itpos); + } + else + { + UART1->CR4 &= (uint8_t)(~itpos); + } + } + +} + +/** + * @brief Enables or disables the UART’s Half Duplex communication. + * @param NewState new state of the UART Communication. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART1_HalfDuplexCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + UART1->CR5 |= UART1_CR5_HDSEL; /**< UART1 Half Duplex Enable */ + } + else + { + UART1->CR5 &= (uint8_t)~UART1_CR5_HDSEL; /**< UART1 Half Duplex Disable */ + } +} + +/** + * @brief Configures the UART’s IrDA interface. + * @param UART1_IrDAMode specifies the IrDA mode. + * This parameter can be any of the @ref UART1_IrDAMode_TypeDef values. + * @retval None + */ +void UART1_IrDAConfig(UART1_IrDAMode_TypeDef UART1_IrDAMode) +{ + assert_param(IS_UART1_IRDAMODE_OK(UART1_IrDAMode)); + + if (UART1_IrDAMode != UART1_IRDAMODE_NORMAL) + { + UART1->CR5 |= UART1_CR5_IRLP; + } + else + { + UART1->CR5 &= ((uint8_t)~UART1_CR5_IRLP); + } +} + +/** + * @brief Enables or disables the UART’s IrDA interface. + * @param NewState new state of the IrDA mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART1_IrDACmd(FunctionalState NewState) +{ + /* Check parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ + UART1->CR5 |= UART1_CR5_IREN; + } + else + { + /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ + UART1->CR5 &= ((uint8_t)~UART1_CR5_IREN); + } +} + +/** + * @brief Sets the UART1 LIN Break detection length. + * @param UART1_LINBreakDetectionLength specifies the LIN break detection length. + * This parameter can be any of the + * @ref UART1_LINBreakDetectionLength_TypeDef values. + * @retval None + */ +void UART1_LINBreakDetectionConfig(UART1_LINBreakDetectionLength_TypeDef UART1_LINBreakDetectionLength) +{ + assert_param(IS_UART1_LINBREAKDETECTIONLENGTH_OK(UART1_LINBreakDetectionLength)); + + if (UART1_LINBreakDetectionLength != UART1_LINBREAKDETECTIONLENGTH_10BITS) + { + UART1->CR4 |= UART1_CR4_LBDL; + } + else + { + UART1->CR4 &= ((uint8_t)~UART1_CR4_LBDL); + } +} + +/** + * @brief Enables or disables the UART1’s LIN mode. + * @param NewState is new state of the UART1 LIN mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART1_LINCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the LIN mode by setting the LINE bit in the CR2 register */ + UART1->CR3 |= UART1_CR3_LINEN; + } + else + { + /* Disable the LIN mode by clearing the LINE bit in the CR2 register */ + UART1->CR3 &= ((uint8_t)~UART1_CR3_LINEN); + } +} + +/** + * @brief Enables or disables the UART1 Smart Card mode. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART1_SmartCardCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the SC mode by setting the SCEN bit in the CR5 register */ + UART1->CR5 |= UART1_CR5_SCEN; + } + else + { + /* Disable the SC mode by clearing the SCEN bit in the CR5 register */ + UART1->CR5 &= ((uint8_t)(~UART1_CR5_SCEN)); + } +} + +/** + * @brief Enables or disables NACK transmission. + * @note This function is valid only for UART1 because is related to SmartCard mode. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART1_SmartCardNACKCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the NACK transmission by setting the NACK bit in the CR5 register */ + UART1->CR5 |= UART1_CR5_NACK; + } + else + { + /* Disable the NACK transmission by clearing the NACK bit in the CR5 register */ + UART1->CR5 &= ((uint8_t)~(UART1_CR5_NACK)); + } +} + +/** + * @brief Selects the UART1 WakeUp method. + * @param UART1_WakeUp: specifies the UART1 wakeup method. + * This parameter can be any of the @ref UART1_WakeUp_TypeDef values. + * @retval None + */ +void UART1_WakeUpConfig(UART1_WakeUp_TypeDef UART1_WakeUp) +{ + assert_param(IS_UART1_WAKEUP_OK(UART1_WakeUp)); + + UART1->CR1 &= ((uint8_t)~UART1_CR1_WAKE); + UART1->CR1 |= (uint8_t)UART1_WakeUp; +} + +/** + * @brief Determines if the UART1 is in mute mode or not. + * @param NewState: new state of the UART1 mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART1_ReceiverWakeUpCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the mute mode UART1 by setting the RWU bit in the CR2 register */ + UART1->CR2 |= UART1_CR2_RWU; + } + else + { + /* Disable the mute mode UART1 by clearing the RWU bit in the CR1 register */ + UART1->CR2 &= ((uint8_t)~UART1_CR2_RWU); + } +} + +/** + * @brief Returns the most recent received data by the UART1 peripheral. + * @param None + * @retval The received data. + */ +uint8_t UART1_ReceiveData8(void) +{ + return ((char)UART1->DR); +} + +/** + * @brief Returns the most recent received data by the UART1 peripheral. + * @param None + * @retval The received data. + */ +uint16_t UART1_ReceiveData9(void) +{ + uint16_t temp = 0; + + temp = (uint16_t)(((uint16_t)( (uint16_t)UART1->CR1 & (uint16_t)UART1_CR1_R8)) << 1); + return (uint16_t)( (((uint16_t) UART1->DR) | temp ) & ((uint16_t)0x01FF)); +} + +/** + * @brief Transmits 8 bit data through the UART1 peripheral. + * @param Data: The data to transmit. + * @retval None + */ +void UART1_SendData8(uint8_t Data) +{ + /* Transmit Data */ + UART1->DR = Data; +} + +/** + * @brief Transmits 9 bit data through the UART peripheral. + * @param Data : The data to transmit. + * This parameter should be lower than 0x1FF. + * @retval None + */ +void UART1_SendData9(uint16_t Data) +{ + /**< Clear the transmit data bit 8 [8] */ + UART1->CR1 &= ((uint8_t)~UART1_CR1_T8); + /**< Write the transmit data bit [8] */ + UART1->CR1 |= (uint8_t)(((uint8_t)(Data >> 2)) & UART1_CR1_T8); + /**< Write the transmit data bit [0:7] */ + UART1->DR = (uint8_t)(Data); +} + +/** + * @brief Transmits break characters. + * @param None + * @retval None + */ +void UART1_SendBreak(void) +{ + UART1->CR2 |= UART1_CR2_SBK; +} + +/** + * @brief Sets the address of the UART1 node. + * @param UART1_Address: Indicates the address of the UART1 node. + * @retval None + */ +void UART1_SetAddress(uint8_t UART1_Address) +{ + /*assert_param for UART1_Address*/ + assert_param(IS_UART1_ADDRESS_OK(UART1_Address)); + + /* Clear the UART1 address */ + UART1->CR4 &= ((uint8_t)~UART1_CR4_ADD); + /* Set the UART1 address node */ + UART1->CR4 |= UART1_Address; +} + +/** + * @brief Sets the specified UART guard time. + * @note SmartCard Mode should be Enabled + * @param UART1_GuardTime: specifies the guard time. + * @retval None + */ +void UART1_SetGuardTime(uint8_t UART1_GuardTime) +{ + /* Set the UART1 guard time */ + UART1->GTR = UART1_GuardTime; +} + +/** + * @brief Sets the system clock prescaler. + * @note IrDA Low Power mode or smartcard mode should be enabled + * @note This function is related to SmartCard and IrDa mode. + * @param UART1_Prescaler: specifies the prescaler clock. + * This parameter can be one of the following values: + * @par IrDA Low Power Mode + * The clock source is divided by the value given in the register (8 bits) + * - 0000 0000 Reserved + * - 0000 0001 divides the clock source by 1 + * - 0000 0010 divides the clock source by 2 + * - ... + * @par Smart Card Mode + * The clock source is divided by the value given in the register + * (5 significant bits) multiplied by 2 + * - 0 0000 Reserved + * - 0 0001 divides the clock source by 2 + * - 0 0010 divides the clock source by 4 + * - 0 0011 divides the clock source by 6 + * - ... + * @retval None + */ +void UART1_SetPrescaler(uint8_t UART1_Prescaler) +{ + /* Load the UART1 prescaler value*/ + UART1->PSCR = UART1_Prescaler; +} + +/** + * @brief Checks whether the specified UART1 flag is set or not. + * @param UART1_FLAG specifies the flag to check. + * This parameter can be any of the @ref UART1_Flag_TypeDef enumeration. + * @retval FlagStatus (SET or RESET) + */ +FlagStatus UART1_GetFlagStatus(UART1_Flag_TypeDef UART1_FLAG) +{ + FlagStatus status = RESET; + + /* Check parameters */ + assert_param(IS_UART1_FLAG_OK(UART1_FLAG)); + + + /* Check the status of the specified UART1 flag*/ + if (UART1_FLAG == UART1_FLAG_LBDF) + { + if ((UART1->CR4 & (uint8_t)UART1_FLAG) != (uint8_t)0x00) + { + /* UART1_FLAG is set*/ + status = SET; + } + else + { + /* UART1_FLAG is reset*/ + status = RESET; + } + } + else if (UART1_FLAG == UART1_FLAG_SBK) + { + if ((UART1->CR2 & (uint8_t)UART1_FLAG) != (uint8_t)0x00) + { + /* UART1_FLAG is set*/ + status = SET; + } + else + { + /* UART1_FLAG is reset*/ + status = RESET; + } + } + else + { + if ((UART1->SR & (uint8_t)UART1_FLAG) != (uint8_t)0x00) + { + /* UART1_FLAG is set*/ + status = SET; + } + else + { + /* UART1_FLAG is reset*/ + status = RESET; + } + } + /* Return the UART1_FLAG status*/ + return status; +} + +/** + * @brief Clears the UART1 flags. + * @param UART1_FLAG specifies the flag to clear + * This parameter can be any combination of the following values: + * - UART1_FLAG_LBDF: LIN Break detection flag. + * - UART1_FLAG_RXNE: Receive data register not empty flag. + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), + * OR (OverRun error) and IDLE (Idle line detected) flags are + * cleared by software sequence: a read operation to UART1_SR register + * (UART1_GetFlagStatus())followed by a read operation to UART1_DR + * register(UART1_ReceiveData8() or UART1_ReceiveData9()). + * + * - RXNE flag can be also cleared by a read to the UART1_DR register + * (UART1_ReceiveData8()or UART1_ReceiveData9()). + * + * - TC flag can be also cleared by software sequence: a read operation + * to UART1_SR register (UART1_GetFlagStatus()) followed by a write + * operation to UART1_DR register (UART1_SendData8() or UART1_SendData9()). + * + * - TXE flag is cleared only by a write to the UART1_DR register + * (UART1_SendData8() or UART1_SendData9()). + * + * - SBK flag is cleared during the stop bit of break. + * @retval None + */ +void UART1_ClearFlag(UART1_Flag_TypeDef UART1_FLAG) +{ + assert_param(IS_UART1_CLEAR_FLAG_OK(UART1_FLAG)); + + /* Clear the Receive Register Not Empty flag */ + if (UART1_FLAG == UART1_FLAG_RXNE) + { + UART1->SR = (uint8_t)~(UART1_SR_RXNE); + } + /* Clear the LIN Break Detection flag */ + else + { + UART1->CR4 &= (uint8_t)~(UART1_CR4_LBDF); + } +} + +/** + * @brief Checks whether the specified UART1 interrupt has occurred or not. + * @param UART1_IT: Specifies the UART1 interrupt pending bit to check. + * This parameter can be one of the following values: + * - UART1_IT_LBDF: LIN Break detection interrupt + * - UART1_IT_TXE: Transmit Data Register empty interrupt + * - UART1_IT_TC: Transmission complete interrupt + * - UART1_IT_RXNE: Receive Data register not empty interrupt + * - UART1_IT_IDLE: Idle line detection interrupt + * - UART1_IT_OR: OverRun Error interrupt + * - UART1_IT_PE: Parity Error interrupt + * @retval The new state of UART1_IT (SET or RESET). + */ +ITStatus UART1_GetITStatus(UART1_IT_TypeDef UART1_IT) +{ + ITStatus pendingbitstatus = RESET; + uint8_t itpos = 0; + uint8_t itmask1 = 0; + uint8_t itmask2 = 0; + uint8_t enablestatus = 0; + + /* Check parameters */ + assert_param(IS_UART1_GET_IT_OK(UART1_IT)); + + /* Get the UART1 IT index */ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART1_IT & (uint8_t)0x0F)); + /* Get the UART1 IT index */ + itmask1 = (uint8_t)((uint8_t)UART1_IT >> (uint8_t)4); + /* Set the IT mask*/ + itmask2 = (uint8_t)((uint8_t)1 << itmask1); + + + /* Check the status of the specified UART1 pending bit*/ + if (UART1_IT == UART1_IT_PE) + { + /* Get the UART1_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART1->CR1 & itmask2); + /* Check the status of the specified UART1 interrupt*/ + + if (((UART1->SR & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + + else if (UART1_IT == UART1_IT_LBDF) + { + /* Get the UART1_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART1->CR4 & itmask2); + /* Check the status of the specified UART1 interrupt*/ + if (((UART1->CR4 & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else + { + /* Get the UART1_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART1->CR2 & itmask2); + /* Check the status of the specified UART1 interrupt*/ + if (((UART1->SR & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + + /* Return the UART1_IT status*/ + return pendingbitstatus; +} + +/** + * @brief Clears the UART1 pending flags. + * @param UART1_IT specifies the pending bit to clear + * This parameter can be one of the following values: + * - UART1_IT_LBDF: LIN Break detection interrupt + * - UART1_IT_RXNE: Receive Data register not empty interrupt. + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), + * OR (OverRun error) and IDLE (Idle line detected) pending bits are + * cleared by software sequence: a read operation to UART1_SR register + * (UART1_GetITStatus()) followed by a read operation to UART1_DR register + * (UART1_ReceiveData8() or UART1_ReceiveData9()). + * + * - RXNE pending bit can be also cleared by a read to the UART1_DR register + * (UART1_ReceiveData8() or UART1_ReceiveData9()). + * + * - TC (Transmit complete) pending bit can be cleared by software + * sequence: a read operation to UART1_SR register (UART1_GetITStatus()) + * followed by a write operation to UART1_DR register (UART1_SendData8() + * or UART1_SendData9()). + * + * - TXE pending bit is cleared only by a write to the UART1_DR register + * (UART1_SendData8() or UART1_SendData9()). + * @retval None + */ +void UART1_ClearITPendingBit(UART1_IT_TypeDef UART1_IT) +{ + assert_param(IS_UART1_CLEAR_IT_OK(UART1_IT)); + + /* Clear the Receive Register Not Empty pending bit */ + if (UART1_IT == UART1_IT_RXNE) + { + UART1->SR = (uint8_t)~(UART1_SR_RXNE); + } + /* Clear the LIN Break Detection pending bit */ + else + { + UART1->CR4 &= (uint8_t)~(UART1_CR4_LBDF); + } +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_uart2.c b/4_EXT_INT_1PORT/lib/src/stm8s_uart2.c new file mode 100644 index 0000000..45e41b1 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_uart2.c @@ -0,0 +1,882 @@ +/** + ******************************************************************************** + * @file stm8s_uart2.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the UART2 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_uart2.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Public functions ----------------------------------------------------------*/ + +/** @} + * @addtogroup UART2_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the UART peripheral. + * @param None + * @retval None + */ + +void UART2_DeInit(void) +{ + /* Clear the Idle Line Detected bit in the status register by a read + to the UART2_SR register followed by a Read to the UART2_DR register */ + (void) UART2->SR; + (void)UART2->DR; + + UART2->BRR2 = UART2_BRR2_RESET_VALUE; /* Set UART2_BRR2 to reset value 0x00 */ + UART2->BRR1 = UART2_BRR1_RESET_VALUE; /* Set UART2_BRR1 to reset value 0x00 */ + + UART2->CR1 = UART2_CR1_RESET_VALUE; /* Set UART2_CR1 to reset value 0x00 */ + UART2->CR2 = UART2_CR2_RESET_VALUE; /* Set UART2_CR2 to reset value 0x00 */ + UART2->CR3 = UART2_CR3_RESET_VALUE; /* Set UART2_CR3 to reset value 0x00 */ + UART2->CR4 = UART2_CR4_RESET_VALUE; /* Set UART2_CR4 to reset value 0x00 */ + UART2->CR5 = UART2_CR5_RESET_VALUE; /* Set UART2_CR5 to reset value 0x00 */ + UART2->CR6 = UART2_CR6_RESET_VALUE; /* Set UART2_CR6 to reset value 0x00 */ +} + +/** + * @brief Initializes the UART2 according to the specified parameters. + * @param BaudRate: The baudrate. + * @param WordLength : This parameter can be any of the + * @ref UART2_WordLength_TypeDef enumeration. + * @param StopBits: This parameter can be any of the + * @ref UART2_StopBits_TypeDef enumeration. + * @param Parity: This parameter can be any of the + * @ref UART2_Parity_TypeDef enumeration. + * @param SyncMode: This parameter can be any of the + * @ref UART2_SyncMode_TypeDef values. + * @param Mode: This parameter can be any of the @ref UART2_Mode_TypeDef values + * @retval None + */ +void UART2_Init(uint32_t BaudRate, UART2_WordLength_TypeDef WordLength, UART2_StopBits_TypeDef StopBits, UART2_Parity_TypeDef Parity, UART2_SyncMode_TypeDef SyncMode, UART2_Mode_TypeDef Mode) +{ + uint8_t BRR2_1 = 0, BRR2_2 = 0; + uint32_t BaudRate_Mantissa = 0, BaudRate_Mantissa100 = 0; + + /* Check the parameters */ + assert_param(IS_UART2_BAUDRATE_OK(BaudRate)); + assert_param(IS_UART2_WORDLENGTH_OK(WordLength)); + assert_param(IS_UART2_STOPBITS_OK(StopBits)); + assert_param(IS_UART2_PARITY_OK(Parity)); + assert_param(IS_UART2_MODE_OK((uint8_t)Mode)); + assert_param(IS_UART2_SYNCMODE_OK((uint8_t)SyncMode)); + + /* Clear the word length bit */ + UART2->CR1 &= (uint8_t)(~UART2_CR1_M); + /* Set the word length bit according to UART2_WordLength value */ + UART2->CR1 |= (uint8_t)WordLength; + + /* Clear the STOP bits */ + UART2->CR3 &= (uint8_t)(~UART2_CR3_STOP); + /* Set the STOP bits number according to UART2_StopBits value */ + UART2->CR3 |= (uint8_t)StopBits; + + /* Clear the Parity Control bit */ + UART2->CR1 &= (uint8_t)(~(UART2_CR1_PCEN | UART2_CR1_PS )); + /* Set the Parity Control bit to UART2_Parity value */ + UART2->CR1 |= (uint8_t)Parity; + + /* Clear the LSB mantissa of UART2DIV */ + UART2->BRR1 &= (uint8_t)(~UART2_BRR1_DIVM); + /* Clear the MSB mantissa of UART2DIV */ + UART2->BRR2 &= (uint8_t)(~UART2_BRR2_DIVM); + /* Clear the Fraction bits of UART2DIV */ + UART2->BRR2 &= (uint8_t)(~UART2_BRR2_DIVF); + + /* Set the UART2 BaudRates in BRR1 and BRR2 registers according to UART2_BaudRate value */ + BaudRate_Mantissa = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4)); + BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4)); + + /* The fraction and MSB mantissa should be loaded in one step in the BRR2 register*/ + /* Set the fraction of UARTDIV */ + BRR2_1 = (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) + << 4) / 100) & (uint8_t)0x0F); + BRR2_2 = (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0); + + UART2->BRR2 = (uint8_t)(BRR2_1 | BRR2_2); + /* Set the LSB mantissa of UARTDIV */ + UART2->BRR1 = (uint8_t)BaudRate_Mantissa; + + /* Disable the Transmitter and Receiver before setting the LBCL, CPOL and CPHA bits */ + UART2->CR2 &= (uint8_t)~(UART2_CR2_TEN | UART2_CR2_REN); + /* Clear the Clock Polarity, lock Phase, Last Bit Clock pulse */ + UART2->CR3 &= (uint8_t)~(UART2_CR3_CPOL | UART2_CR3_CPHA | UART2_CR3_LBCL); + /* Set the Clock Polarity, lock Phase, Last Bit Clock pulse */ + UART2->CR3 |= (uint8_t)((uint8_t)SyncMode & (uint8_t)(UART2_CR3_CPOL | \ + UART2_CR3_CPHA | UART2_CR3_LBCL)); + + if ((uint8_t)(Mode & UART2_MODE_TX_ENABLE)) + { + /* Set the Transmitter Enable bit */ + UART2->CR2 |= (uint8_t)UART2_CR2_TEN; + } + else + { + /* Clear the Transmitter Disable bit */ + UART2->CR2 &= (uint8_t)(~UART2_CR2_TEN); + } + if ((uint8_t)(Mode & UART2_MODE_RX_ENABLE)) + { + /* Set the Receiver Enable bit */ + UART2->CR2 |= (uint8_t)UART2_CR2_REN; + } + else + { + /* Clear the Receiver Disable bit */ + UART2->CR2 &= (uint8_t)(~UART2_CR2_REN); + } + /* Set the Clock Enable bit, lock Polarity, lock Phase and Last Bit Clock + pulse bits according to UART2_Mode value */ + if ((uint8_t)(SyncMode & UART2_SYNCMODE_CLOCK_DISABLE)) + { + /* Clear the Clock Enable bit */ + UART2->CR3 &= (uint8_t)(~UART2_CR3_CKEN); + } + else + { + UART2->CR3 |= (uint8_t)((uint8_t)SyncMode & UART2_CR3_CKEN); + } +} + +/** + * @brief Enable the UART2 peripheral. + * @param NewState : The new state of the UART Communication. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void UART2_Cmd(FunctionalState NewState) +{ + if (NewState != DISABLE) + { + /* UART2 Enable */ + UART2->CR1 &= (uint8_t)(~UART2_CR1_UARTD); + } + else + { + /* UART2 Disable */ + UART2->CR1 |= UART2_CR1_UARTD; + } +} + +/** + * @brief Enables or disables the specified UART2 interrupts. + * @param UART2_IT specifies the UART2 interrupt sources to be enabled or disabled. + * This parameter can be one of the following values: + * - UART2_IT_LBDF: LIN Break detection interrupt + * - UART2_IT_LHDF: LIN Break detection interrupt + * - UART2_IT_TXE: Transmit Data Register empty interrupt + * - UART2_IT_TC: Transmission complete interrupt + * - UART2_IT_RXNE_OR: Receive Data register not empty/Over run error interrupt + * - UART2_IT_IDLE: Idle line detection interrupt + * - UART2_IT_PE: Parity Error interrupt + * @param NewState new state of the specified UART2 interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART2_ITConfig(UART2_IT_TypeDef UART2_IT, FunctionalState NewState) +{ + uint8_t uartreg = 0, itpos = 0x00; + + /* Check the parameters */ + assert_param(IS_UART2_CONFIG_IT_OK(UART2_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Get the UART2 register index */ + uartreg = (uint8_t)((uint16_t)UART2_IT >> 0x08); + + /* Get the UART2 IT index */ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART2_IT & (uint8_t)0x0F)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt bits according to UART2_IT mask */ + if (uartreg == 0x01) + { + UART2->CR1 |= itpos; + } + else if (uartreg == 0x02) + { + UART2->CR2 |= itpos; + } + else if (uartreg == 0x03) + { + UART2->CR4 |= itpos; + } + else + { + UART2->CR6 |= itpos; + } + } + else + { + /* Disable the interrupt bits according to UART2_IT mask */ + if (uartreg == 0x01) + { + UART2->CR1 &= (uint8_t)(~itpos); + } + else if (uartreg == 0x02) + { + UART2->CR2 &= (uint8_t)(~itpos); + } + else if (uartreg == 0x03) + { + UART2->CR4 &= (uint8_t)(~itpos); + } + else + { + UART2->CR6 &= (uint8_t)(~itpos); + } + } +} + +/** + * @brief Configures the UART2’s IrDA interface. + * @param UART2_IrDAMode specifies the IrDA mode. + * This parameter can be any of the @ref UART2_IrDAMode_TypeDef values. + * @retval None + */ +void UART2_IrDAConfig(UART2_IrDAMode_TypeDef UART2_IrDAMode) +{ + assert_param(IS_UART2_IRDAMODE_OK(UART2_IrDAMode)); + + if (UART2_IrDAMode != UART2_IRDAMODE_NORMAL) + { + UART2->CR5 |= UART2_CR5_IRLP; + } + else + { + UART2->CR5 &= ((uint8_t)~UART2_CR5_IRLP); + } +} + +/** + * @brief Enables or disables the UART2’s IrDA interface. + * @param NewState new state of the IrDA mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART2_IrDACmd(FunctionalState NewState) +{ + /* Check parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ + UART2->CR5 |= UART2_CR5_IREN; + } + else + { + /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ + UART2->CR5 &= ((uint8_t)~UART2_CR5_IREN); + } +} + +/** + * @brief Sets the UART2 LIN Break detection length. + * @param UART2_LINBreakDetectionLength specifies the LIN break detection length. + * This parameter can be any of the + * @ref UART2_LINBreakDetectionLength_TypeDef values. + * @retval None + */ +void UART2_LINBreakDetectionConfig(UART2_LINBreakDetectionLength_TypeDef UART2_LINBreakDetectionLength) +{ + /* Check parameters */ + assert_param(IS_UART2_LINBREAKDETECTIONLENGTH_OK(UART2_LINBreakDetectionLength)); + + if (UART2_LINBreakDetectionLength != UART2_LINBREAKDETECTIONLENGTH_10BITS) + { + UART2->CR4 |= UART2_CR4_LBDL; + } + else + { + UART2->CR4 &= ((uint8_t)~UART2_CR4_LBDL); + } +} + +/** + * @brief Configure the UART2 peripheral. + * @param UART2_Mode specifies the LIN mode. + * This parameter can be any of the @ref UART2_LinMode_TypeDef values. + * @param UART2_Autosync specifies the LIN automatic resynchronization mode. + * This parameter can be any of the @ref UART2_LinAutosync_TypeDef values. + * @param UART2_DivUp specifies the LIN divider update method. + * This parameter can be any of the @ref UART2_LinDivUp_TypeDef values. + * @retval None + */ +void UART2_LINConfig(UART2_LinMode_TypeDef UART2_Mode, + UART2_LinAutosync_TypeDef UART2_Autosync, + UART2_LinDivUp_TypeDef UART2_DivUp) +{ + /* Check parameters */ + assert_param(IS_UART2_SLAVE_OK(UART2_Mode)); + assert_param(IS_UART2_AUTOSYNC_OK(UART2_Autosync)); + assert_param(IS_UART2_DIVUP_OK(UART2_DivUp)); + + if (UART2_Mode != UART2_LIN_MODE_MASTER) + { + UART2->CR6 |= UART2_CR6_LSLV; + } + else + { + UART2->CR6 &= ((uint8_t)~UART2_CR6_LSLV); + } + + if (UART2_Autosync != UART2_LIN_AUTOSYNC_DISABLE) + { + UART2->CR6 |= UART2_CR6_LASE ; + } + else + { + UART2->CR6 &= ((uint8_t)~ UART2_CR6_LASE ); + } + + if (UART2_DivUp != UART2_LIN_DIVUP_LBRR1) + { + UART2->CR6 |= UART2_CR6_LDUM; + } + else + { + UART2->CR6 &= ((uint8_t)~ UART2_CR6_LDUM); + } +} + +/** + * @brief Enables or disables the UART2 LIN mode. + * @param NewState is new state of the UART2 LIN mode. + * This parameter can be ENABLE or DISABLE + * @retval None + */ +void UART2_LINCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the LIN mode by setting the LINE bit in the CR2 register */ + UART2->CR3 |= UART2_CR3_LINEN; + } + else + { + /* Disable the LIN mode by clearing the LINE bit in the CR2 register */ + UART2->CR3 &= ((uint8_t)~UART2_CR3_LINEN); + } +} + +/** + * @brief Enables or disables the UART2 Smart Card mode. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART2_SmartCardCmd(FunctionalState NewState) +{ + /* Check parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the SC mode by setting the SCEN bit in the CR5 register */ + UART2->CR5 |= UART2_CR5_SCEN; + } + else + { + /* Disable the SC mode by clearing the SCEN bit in the CR5 register */ + UART2->CR5 &= ((uint8_t)(~UART2_CR5_SCEN)); + } +} + +/** + * @brief Enables or disables NACK transmission. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART2_SmartCardNACKCmd(FunctionalState NewState) +{ + /* Check parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the NACK transmission by setting the NACK bit in the CR5 register */ + UART2->CR5 |= UART2_CR5_NACK; + } + else + { + /* Disable the NACK transmission by clearing the NACK bit in the CR5 register */ + UART2->CR5 &= ((uint8_t)~(UART2_CR5_NACK)); + } +} + +/** + * @brief Selects the UART2 WakeUp method. + * @param UART2_WakeUp: specifies the UART2 wakeup method. + * This parameter can be any of the @ref UART2_WakeUp_TypeDef values. + * @retval None + */ +void UART2_WakeUpConfig(UART2_WakeUp_TypeDef UART2_WakeUp) +{ + assert_param(IS_UART2_WAKEUP_OK(UART2_WakeUp)); + + UART2->CR1 &= ((uint8_t)~UART2_CR1_WAKE); + UART2->CR1 |= (uint8_t)UART2_WakeUp; +} + +/** + * @brief Determines if the UART2 is in mute mode or not. + * @param NewState: new state of the UART2 mode. + * This parameter can be ENABLE or DISABLE + * @retval None + */ +void UART2_ReceiverWakeUpCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the mute mode UART2 by setting the RWU bit in the CR2 register */ + UART2->CR2 |= UART2_CR2_RWU; + } + else + { + /* Disable the mute mode UART2 by clearing the RWU bit in the CR1 register */ + UART2->CR2 &= ((uint8_t)~UART2_CR2_RWU); + } +} + +/** + * @brief Returns the most recent received data by the UART2 peripheral. + * @param None + * @retval Received Data + */ +uint8_t UART2_ReceiveData8(void) +{ + return ((uint8_t)UART2->DR); +} + +/** + * @brief Returns the most recent received data by the UART2 peripheral. + * @param None + * @retval Received Data + */ +uint16_t UART2_ReceiveData9(void) +{ + uint16_t temp = 0; + + temp = ((uint16_t)(((uint16_t)((uint16_t)UART2->CR1 & (uint16_t)UART2_CR1_R8)) << 1)); + + return (uint16_t)((((uint16_t)UART2->DR) | temp) & ((uint16_t)0x01FF)); +} + +/** + * @brief Transmits 8 bit data through the UART2 peripheral. + * @param Data: the data to transmit. + * @retval None + */ +void UART2_SendData8(uint8_t Data) +{ + /* Transmit Data */ + UART2->DR = Data; +} + +/** + * @brief Transmits 9 bit data through the UART2 peripheral. + * @param Data: the data to transmit. + * @retval None + */ +void UART2_SendData9(uint16_t Data) +{ + /* Clear the transmit data bit 8 */ + UART2->CR1 &= ((uint8_t)~UART2_CR1_T8); + + /* Write the transmit data bit [8] */ + UART2->CR1 |= (uint8_t)(((uint8_t)(Data >> 2)) & UART2_CR1_T8); + + /* Write the transmit data bit [0:7] */ + UART2->DR = (uint8_t)(Data); +} + +/** + * @brief Transmits break characters. + * @param None + * @retval None + */ +void UART2_SendBreak(void) +{ + UART2->CR2 |= UART2_CR2_SBK; +} + +/** + * @brief Sets the address of the UART2 node. + * @param UART2_Address: Indicates the address of the UART2 node. + * @retval None + */ +void UART2_SetAddress(uint8_t UART2_Address) +{ + /*assert_param for x UART2_Address*/ + assert_param(IS_UART2_ADDRESS_OK(UART2_Address)); + + /* Clear the UART2 address */ + UART2->CR4 &= ((uint8_t)~UART2_CR4_ADD); + /* Set the UART2 address node */ + UART2->CR4 |= UART2_Address; +} + +/** + * @brief Sets the specified UART2 guard time. + * @note SmartCard Mode should be Enabled + * @param UART2_GuardTime: specifies the guard time. + * @retval None + */ +void UART2_SetGuardTime(uint8_t UART2_GuardTime) +{ + /* Set the UART2 guard time */ + UART2->GTR = UART2_GuardTime; +} + +/** + * @brief Sets the system clock prescaler. + * @note IrDA Low Power mode or smartcard mode should be enabled + * @note This function is related to SmartCard and IrDa mode. + * @param UART2_Prescaler: specifies the prescaler clock. + * This parameter can be one of the following values: + * @par IrDA Low Power Mode + * The clock source is divided by the value given in the register (8 bits) + * - 0000 0000 Reserved + * - 0000 0001 divides the clock source by 1 + * - 0000 0010 divides the clock source by 2 + * - ... + * @par Smart Card Mode + * The clock source is divided by the value given in the register + * (5 significant bits) multiped by 2 + * - 0 0000 Reserved + * - 0 0001 divides the clock source by 2 + * - 0 0010 divides the clock source by 4 + * - 0 0011 divides the clock source by 6 + * - ... + * @retval None + */ +void UART2_SetPrescaler(uint8_t UART2_Prescaler) +{ + /* Load the UART2 prescaler value*/ + UART2->PSCR = UART2_Prescaler; +} + +/** + * @brief Checks whether the specified UART2 flag is set or not. + * @param UART2_FLAG specifies the flag to check. + * This parameter can be any of the @ref UART2_Flag_TypeDef enumeration. + * @retval FlagStatus (SET or RESET) + */ +FlagStatus UART2_GetFlagStatus(UART2_Flag_TypeDef UART2_FLAG) +{ + FlagStatus status = RESET; + + /* Check parameters */ + assert_param(IS_UART2_FLAG_OK(UART2_FLAG)); + + /* Check the status of the specified UART2 flag*/ + if (UART2_FLAG == UART2_FLAG_LBDF) + { + if ((UART2->CR4 & (uint8_t)UART2_FLAG) != (uint8_t)0x00) + { + /* UART2_FLAG is set*/ + status = SET; + } + else + { + /* UART2_FLAG is reset*/ + status = RESET; + } + } + else if (UART2_FLAG == UART2_FLAG_SBK) + { + if ((UART2->CR2 & (uint8_t)UART2_FLAG) != (uint8_t)0x00) + { + /* UART2_FLAG is set*/ + status = SET; + } + else + { + /* UART2_FLAG is reset*/ + status = RESET; + } + } + else if ((UART2_FLAG == UART2_FLAG_LHDF) || (UART2_FLAG == UART2_FLAG_LSF)) + { + if ((UART2->CR6 & (uint8_t)UART2_FLAG) != (uint8_t)0x00) + { + /* UART2_FLAG is set*/ + status = SET; + } + else + { + /* UART2_FLAG is reset*/ + status = RESET; + } + } + else + { + if ((UART2->SR & (uint8_t)UART2_FLAG) != (uint8_t)0x00) + { + /* UART2_FLAG is set*/ + status = SET; + } + else + { + /* UART2_FLAG is reset*/ + status = RESET; + } + } + + /* Return the UART2_FLAG status*/ + return status; +} + +/** + * @brief Clears the UART2 flags. + * @param UART2_FLAG specifies the flag to clear + * This parameter can be any combination of the following values: + * - UART2_FLAG_LBDF: LIN Break detection flag. + * - UART2_FLAG_LHDF: LIN Header detection flag. + * - UART2_FLAG_LSF: LIN synchrone field flag. + * - UART2_FLAG_RXNE: Receive data register not empty flag. + * @note: + * - PE (Parity error), FE (Framing error), NE (Noise error), + * OR (OverRun error) and IDLE (Idle line detected) flags are cleared + * by software sequence: a read operation to UART2_SR register + * (UART2_GetFlagStatus())followed by a read operation to UART2_DR + * register(UART2_ReceiveData8() or UART2_ReceiveData9()). + * + * - RXNE flag can be also cleared by a read to the UART2_DR register + * (UART2_ReceiveData8()or UART2_ReceiveData9()). + * + * - TC flag can be also cleared by software sequence: a read operation + * to UART2_SR register (UART2_GetFlagStatus()) followed by a write + * operation to UART2_DR register (UART2_SendData8() or UART2_SendData9()). + * + * - TXE flag is cleared only by a write to the UART2_DR register + * (UART2_SendData8() or UART2_SendData9()). + * + * - SBK flag is cleared during the stop bit of break. + * @retval None + */ +void UART2_ClearFlag(UART2_Flag_TypeDef UART2_FLAG) +{ + assert_param(IS_UART2_CLEAR_FLAG_OK(UART2_FLAG)); + + /* Clear the Receive Register Not Empty flag */ + if (UART2_FLAG == UART2_FLAG_RXNE) + { + UART2->SR = (uint8_t)~(UART2_SR_RXNE); + } + /* Clear the LIN Break Detection flag */ + else if (UART2_FLAG == UART2_FLAG_LBDF) + { + UART2->CR4 &= (uint8_t)(~UART2_CR4_LBDF); + } + /* Clear the LIN Header Detection Flag */ + else if (UART2_FLAG == UART2_FLAG_LHDF) + { + UART2->CR6 &= (uint8_t)(~UART2_CR6_LHDF); + } + /* Clear the LIN Synch Field flag */ + else + { + UART2->CR6 &= (uint8_t)(~UART2_CR6_LSF); + } +} + +/** + * @brief Checks whether the specified UART2 interrupt has occurred or not. + * @param UART2_IT: Specifies the UART2 interrupt pending bit to check. + * This parameter can be one of the following values: + * - UART2_IT_LBDF: LIN Break detection interrupt + * - UART2_IT_TXE: Transmit Data Register empty interrupt + * - UART2_IT_TC: Transmission complete interrupt + * - UART2_IT_RXNE: Receive Data register not empty interrupt + * - UART2_IT_IDLE: Idle line detection interrupt + * - UART2_IT_OR: OverRun Error interrupt + * - UART2_IT_PE: Parity Error interrupt + * @retval The state of UART2_IT (SET or RESET). + */ +ITStatus UART2_GetITStatus(UART2_IT_TypeDef UART2_IT) +{ + ITStatus pendingbitstatus = RESET; + uint8_t itpos = 0; + uint8_t itmask1 = 0; + uint8_t itmask2 = 0; + uint8_t enablestatus = 0; + + /* Check parameters */ + assert_param(IS_UART2_GET_IT_OK(UART2_IT)); + + /* Get the UART2 IT index*/ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART2_IT & (uint8_t)0x0F)); + /* Get the UART2 IT index*/ + itmask1 = (uint8_t)((uint8_t)UART2_IT >> (uint8_t)4); + /* Set the IT mask*/ + itmask2 = (uint8_t)((uint8_t)1 << itmask1); + + /* Check the status of the specified UART2 pending bit*/ + if (UART2_IT == UART2_IT_PE) + { + /* Get the UART2_ITPENDINGBIT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART2->CR1 & itmask2); + /* Check the status of the specified UART2 interrupt*/ + + if (((UART2->SR & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else if (UART2_IT == UART2_IT_LBDF) + { + /* Get the UART2_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART2->CR4 & itmask2); + /* Check the status of the specified UART2 interrupt*/ + if (((UART2->CR4 & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else if (UART2_IT == UART2_IT_LHDF) + { + /* Get the UART2_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART2->CR6 & itmask2); + /* Check the status of the specified UART2 interrupt*/ + if (((UART2->CR6 & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else + { + /* Get the UART2_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART2->CR2 & itmask2); + /* Check the status of the specified UART2 interrupt*/ + if (((UART2->SR & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + /* Return the UART2_IT status*/ + return pendingbitstatus; +} + +/** + * @brief Clears the UART2 pending flags. + * @param UART2_IT specifies the pending bit to clear + * This parameter can be one of the following values: + * - UART2_IT_LBDF: LIN Break detection interrupt + * - UART2_IT_LHDF: LIN Header detection interrupt + * - UART2_IT_RXNE: Receive Data register not empty interrupt. + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), + * OR (OverRun error) and IDLE (Idle line detected) pending bits are + * cleared by software sequence: a read operation to UART2_SR register + * (UART2_GetITStatus()) followed by a read operation to UART2_DR register + * (UART2_ReceiveData8() or UART2_ReceiveData9()). + * + * - RXNE pending bit can be also cleared by a read to the UART2_DR + * register (UART2_ReceiveData8() or UART2_ReceiveData9()). + * + * - TC (Transmit complete) pending bit can be cleared by software + * sequence: a read operation to UART2_SR register + * (UART2_GetITStatus()) followed by a write operation to UART2_DR + * register (UART2_SendData8()or UART2_SendData9()). + * + * - TXE pending bit is cleared only by a write to the UART2_DR register + * (UART2_SendData8() or UART2_SendData9()). + * @retval None + */ +void UART2_ClearITPendingBit(UART2_IT_TypeDef UART2_IT) +{ + assert_param(IS_UART2_CLEAR_IT_OK(UART2_IT)); + + /* Clear the Receive Register Not Empty pending bit */ + if (UART2_IT == UART2_IT_RXNE) + { + UART2->SR = (uint8_t)~(UART2_SR_RXNE); + } + /* Clear the LIN Break Detection pending bit */ + else if (UART2_IT == UART2_IT_LBDF) + { + UART2->CR4 &= (uint8_t)~(UART2_CR4_LBDF); + } + /* Clear the LIN Header Detection pending bit */ + else + { + UART2->CR6 &= (uint8_t)(~UART2_CR6_LHDF); + } +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_uart3.c b/4_EXT_INT_1PORT/lib/src/stm8s_uart3.c new file mode 100644 index 0000000..0488a0c --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_uart3.c @@ -0,0 +1,737 @@ +/** + ******************************************************************************** + * @file stm8s_uart3.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the uart3 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_uart3.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ + +/* Private functions ---------------------------------------------------------*/ +/* Public functions ----------------------------------------------------------*/ + +/** @} + * @addtogroup UART3_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the UART peripheral. + * @param None + * @retval None + */ + +void UART3_DeInit(void) +{ + /* Clear the Idle Line Detected bit in the status rerister by a read + to the UART3_SR register followed by a Read to the UART3_DR register */ + (void) UART3->SR; + (void) UART3->DR; + + UART3->BRR2 = UART3_BRR2_RESET_VALUE; /*Set UART3_BRR2 to reset value 0x00 */ + UART3->BRR1 = UART3_BRR1_RESET_VALUE; /*Set UART3_BRR1 to reset value 0x00 */ + + UART3->CR1 = UART3_CR1_RESET_VALUE; /*Set UART3_CR1 to reset value 0x00 */ + UART3->CR2 = UART3_CR2_RESET_VALUE; /*Set UART3_CR2 to reset value 0x00 */ + UART3->CR3 = UART3_CR3_RESET_VALUE; /*Set UART3_CR3 to reset value 0x00 */ + UART3->CR4 = UART3_CR4_RESET_VALUE; /*Set UART3_CR4 to reset value 0x00 */ + UART3->CR6 = UART3_CR6_RESET_VALUE; /*Set UART3_CR6 to reset value 0x00 */ +} + +/** + * @brief Initializes the UART3 according to the specified parameters. + * @param BaudRate: The baudrate. + * @param WordLength : This parameter can be any of + * the @ref UART3_WordLength_TypeDef enumeration. + * @param StopBits: This parameter can be any of the + * @ref UART3_StopBits_TypeDef enumeration. + * @param Parity: This parameter can be any of the + * @ref UART3_Parity_TypeDef enumeration. + * @param Mode: This parameter can be any of the @ref UART3_Mode_TypeDef values + * @retval None + */ +void UART3_Init(uint32_t BaudRate, UART3_WordLength_TypeDef WordLength, + UART3_StopBits_TypeDef StopBits, UART3_Parity_TypeDef Parity, + UART3_Mode_TypeDef Mode) +{ + uint8_t BRR2_1 = 0, BRR2_2 = 0; + uint32_t BaudRate_Mantissa = 0, BaudRate_Mantissa100 = 0; + + /* Check the parameters */ + assert_param(IS_UART3_WORDLENGTH_OK(WordLength)); + assert_param(IS_UART3_STOPBITS_OK(StopBits)); + assert_param(IS_UART3_PARITY_OK(Parity)); + assert_param(IS_UART3_BAUDRATE_OK(BaudRate)); + assert_param(IS_UART3_MODE_OK((uint8_t)Mode)); + + /* Clear the word length bit */ + UART3->CR1 &= (uint8_t)(~UART3_CR1_M); + /* Set the word length bit according to UART3_WordLength value */ + UART3->CR1 |= (uint8_t)WordLength; + + /* Clear the STOP bits */ + UART3->CR3 &= (uint8_t)(~UART3_CR3_STOP); + /* Set the STOP bits number according to UART3_StopBits value */ + UART3->CR3 |= (uint8_t)StopBits; + + /* Clear the Parity Control bit */ + UART3->CR1 &= (uint8_t)(~(UART3_CR1_PCEN | UART3_CR1_PS)); + /* Set the Parity Control bit to UART3_Parity value */ + UART3->CR1 |= (uint8_t)Parity; + + /* Clear the LSB mantissa of UART3DIV */ + UART3->BRR1 &= (uint8_t)(~UART3_BRR1_DIVM); + /* Clear the MSB mantissa of UART3DIV */ + UART3->BRR2 &= (uint8_t)(~UART3_BRR2_DIVM); + /* Clear the Fraction bits of UART3DIV */ + UART3->BRR2 &= (uint8_t)(~UART3_BRR2_DIVF); + + /* Set the UART3 BaudRates in BRR1 and BRR2 registers according to UART3_BaudRate value */ + BaudRate_Mantissa = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4)); + BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4)); + /* The fraction and MSB mantissa should be loaded in one step in the BRR2 register */ + /* Set the fraction of UART3DIV */ + BRR2_1 = (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) + << 4) / 100) & (uint8_t)0x0F); + BRR2_2 = (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0); + + UART3->BRR2 = (uint8_t)(BRR2_1 | BRR2_2); + /* Set the LSB mantissa of UART3DIV */ + UART3->BRR1 = (uint8_t)BaudRate_Mantissa; + + if ((uint8_t)(Mode & UART3_MODE_TX_ENABLE)) + { + /* Set the Transmitter Enable bit */ + UART3->CR2 |= UART3_CR2_TEN; + } + else + { + /* Clear the Transmitter Disable bit */ + UART3->CR2 &= (uint8_t)(~UART3_CR2_TEN); + } + if ((uint8_t)(Mode & UART3_MODE_RX_ENABLE)) + { + /* Set the Receiver Enable bit */ + UART3->CR2 |= UART3_CR2_REN; + } + else + { + /* Clear the Receiver Disable bit */ + UART3->CR2 &= (uint8_t)(~UART3_CR2_REN); + } +} + +/** + * @brief Enable the UART1 peripheral. + * @param NewState : The new state of the UART Communication. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void UART3_Cmd(FunctionalState NewState) +{ + if (NewState != DISABLE) + { + /* UART3 Enable */ + UART3->CR1 &= (uint8_t)(~UART3_CR1_UARTD); + } + else + { + /* UART3 Disable */ + UART3->CR1 |= UART3_CR1_UARTD; + } +} + +/** + * @brief Enables or disables the specified UART3 interrupts. + * @param UART3_IT specifies the UART3 interrupt sources to be enabled or disabled. + * This parameter can be one of the following values: + * - UART3_IT_LBDF: LIN Break detection interrupt + * - UART3_IT_LHDF: LIN Break detection interrupt + * - UART3_IT_TXE: Transmit Data Register empty interrupt + * - UART3_IT_TC: Transmission complete interrupt + * - UART3_IT_RXNE_OR: Receive Data register not empty/Over run error interrupt + * - UART3_IT_IDLE: Idle line detection interrupt + * - UART3_IT_PE: Parity Error interrupt + * @param NewState new state of the specified UART3 interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART3_ITConfig(UART3_IT_TypeDef UART3_IT, FunctionalState NewState) +{ + uint8_t uartreg = 0, itpos = 0x00; + + /* Check the parameters */ + assert_param(IS_UART3_CONFIG_IT_OK(UART3_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Get the UART3 register index */ + uartreg = (uint8_t)((uint16_t)UART3_IT >> 0x08); + + /* Get the UART3 IT index */ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART3_IT & (uint8_t)0x0F)); + + if (NewState != DISABLE) + { + /* Enable the Interrupt bits according to UART3_IT mask */ + if (uartreg == 0x01) + { + UART3->CR1 |= itpos; + } + else if (uartreg == 0x02) + { + UART3->CR2 |= itpos; + } + else if (uartreg == 0x03) + { + UART3->CR4 |= itpos; + } + else + { + UART3->CR6 |= itpos; + } + } + else + { + /* Disable the interrupt bits according to UART3_IT mask */ + if (uartreg == 0x01) + { + UART3->CR1 &= (uint8_t)(~itpos); + } + else if (uartreg == 0x02) + { + UART3->CR2 &= (uint8_t)(~itpos); + } + else if (uartreg == 0x03) + { + UART3->CR4 &= (uint8_t)(~itpos); + } + else + { + UART3->CR6 &= (uint8_t)(~itpos); + } + } +} + +/** + * @brief Sets the UART3 LIN Break detection length. + * @param UART3_LINBreakDetectionLength specifies the LIN break detection length. + * This parameter can be any of the + * @ref UART3_LINBreakDetectionLength_TypeDef values. + * @retval None + */ +void UART3_LINBreakDetectionConfig(UART3_LINBreakDetectionLength_TypeDef UART3_LINBreakDetectionLength) +{ + /* Check the parameters */ + assert_param(IS_UART3_LINBREAKDETECTIONLENGTH_OK(UART3_LINBreakDetectionLength)); + + if (UART3_LINBreakDetectionLength != UART3_LINBREAKDETECTIONLENGTH_10BITS) + { + UART3->CR4 |= UART3_CR4_LBDL; + } + else + { + UART3->CR4 &= ((uint8_t)~UART3_CR4_LBDL); + } +} + +/** + * @brief Configure the UART3 peripheral. + * @param UART3_Mode specifies the LIN mode. + * This parameter can be any of the @ref UART3_LinMode_TypeDef values. + * @param UART3_Autosync specifies the LIN automatic resynchronization mode. + * This parameter can be any of the @ref UART3_LinAutosync_TypeDef values. + * @param UART3_DivUp specifies the LIN divider update method. + * This parameter can be any of the @ref UART3_LinDivUp_TypeDef values. + * @retval None + */ +void UART3_LINConfig(UART3_LinMode_TypeDef UART3_Mode, + UART3_LinAutosync_TypeDef UART3_Autosync, + UART3_LinDivUp_TypeDef UART3_DivUp) +{ + /* Check the parameters */ + assert_param(IS_UART3_SLAVE_OK(UART3_Mode)); + assert_param(IS_UART3_AUTOSYNC_OK(UART3_Autosync)); + assert_param(IS_UART3_DIVUP_OK(UART3_DivUp)); + + if (UART3_Mode != UART3_LIN_MODE_MASTER) + { + UART3->CR6 |= UART3_CR6_LSLV; + } + else + { + UART3->CR6 &= ((uint8_t)~UART3_CR6_LSLV); + } + + if (UART3_Autosync != UART3_LIN_AUTOSYNC_DISABLE) + { + UART3->CR6 |= UART3_CR6_LASE ; + } + else + { + UART3->CR6 &= ((uint8_t)~ UART3_CR6_LASE ); + } + + if (UART3_DivUp != UART3_LIN_DIVUP_LBRR1) + { + UART3->CR6 |= UART3_CR6_LDUM; + } + else + { + UART3->CR6 &= ((uint8_t)~ UART3_CR6_LDUM); + } +} + +/** + * @brief Enables or disables the UART3 LIN mode. + * @param NewState is new state of the UART3 LIN mode. + * This parameter can be ENABLE or DISABLE + * @retval None + */ +void UART3_LINCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the LIN mode by setting the LINE bit in the CR2 register */ + UART3->CR3 |= UART3_CR3_LINEN; + } + else + { + /* Disable the LIN mode by clearing the LINE bit in the CR2 register */ + UART3->CR3 &= ((uint8_t)~UART3_CR3_LINEN); + } +} + +/** + * @brief Selects the UART3 WakeUp method. + * @param UART3_WakeUp: specifies the UART3 wakeup method. + * This parameter can be any of the @ref UART3_WakeUp_TypeDef values. + * @retval None + */ +void UART3_WakeUpConfig(UART3_WakeUp_TypeDef UART3_WakeUp) +{ + /* Check the parameters */ + assert_param(IS_UART3_WAKEUP_OK(UART3_WakeUp)); + + UART3->CR1 &= ((uint8_t)~UART3_CR1_WAKE); + UART3->CR1 |= (uint8_t)UART3_WakeUp; +} + +/** + * @brief Determines if the UART3 is in mute mode or not. + * @param NewState: new state of the UART3 mode. + * This parameter can be ENABLE or DISABLE + * @retval None + */ +void UART3_ReceiverWakeUpCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + /* Enable the mute mode UART3 by setting the RWU bit in the CR2 register */ + UART3->CR2 |= UART3_CR2_RWU; + } + else + { + /* Disable the mute mode UART3 by clearing the RWU bit in the CR1 register */ + UART3->CR2 &= ((uint8_t)~UART3_CR2_RWU); + } +} + +/** + * @brief Returns the most recent received data by the UART3 peripheral. + * @param None + * @retval Received Data + */ +uint8_t UART3_ReceiveData8(void) +{ + return ((uint8_t)UART3->DR); +} + +/** + * @brief Returns the most recent received data by the UART3 peripheral. + * @param None + * @retval Received Data + */ +uint16_t UART3_ReceiveData9(void) +{ + uint16_t temp = 0; + + temp = (uint16_t)(((uint16_t)((uint16_t)UART3->CR1 & (uint16_t)UART3_CR1_R8)) << 1); + return (uint16_t)((((uint16_t)UART3->DR) | temp) & ((uint16_t)0x01FF)); +} + +/** + * @brief Transmits 8 bit data through the UART3 peripheral. + * @param Data the data to transmit. + * @retval None + */ +void UART3_SendData8(uint8_t Data) +{ + /* Transmit Data */ + UART3->DR = Data; +} + +/** + * @brief Transmits 9 bit data through the UART3 peripheral. + * @param Data: the data to transmit. + * @retval None + */ +void UART3_SendData9(uint16_t Data) +{ + /* Clear the transmit data bit 8 */ + UART3->CR1 &= ((uint8_t)~UART3_CR1_T8); + + /* Write the transmit data bit [8] */ + UART3->CR1 |= (uint8_t)(((uint8_t)(Data >> 2)) & UART3_CR1_T8); + + /* Write the transmit data bit [0:7] */ + UART3->DR = (uint8_t)(Data); +} + +/** + * @brief Transmits break characters. + * @param None + * @retval None + */ +void UART3_SendBreak(void) +{ + UART3->CR2 |= UART3_CR2_SBK; +} + +/** + * @brief Sets the address of the UART3 node. + * @param UART3_Address: Indicates the address of the UART3 node. + * @retval None + */ +void UART3_SetAddress(uint8_t UART3_Address) +{ + /* Check the parameters */ + assert_param(IS_UART3_ADDRESS_OK(UART3_Address)); + + /* Clear the UART3 address */ + UART3->CR4 &= ((uint8_t)~UART3_CR4_ADD); + /* Set the UART3 address node */ + UART3->CR4 |= UART3_Address; +} + +/** + * @brief Checks whether the specified UART3 flag is set or not. + * @param UART3_FLAG specifies the flag to check. + * This parameter can be any of the @ref UART3_Flag_TypeDef enumeration. + * @retval FlagStatus (SET or RESET) + */ +FlagStatus UART3_GetFlagStatus(UART3_Flag_TypeDef UART3_FLAG) +{ + FlagStatus status = RESET; + + /* Check parameters */ + assert_param(IS_UART3_FLAG_OK(UART3_FLAG)); + + /* Check the status of the specified UART3 flag*/ + if (UART3_FLAG == UART3_FLAG_LBDF) + { + if ((UART3->CR4 & (uint8_t)UART3_FLAG) != (uint8_t)0x00) + { + /* UART3_FLAG is set*/ + status = SET; + } + else + { + /* UART3_FLAG is reset*/ + status = RESET; + } + } + else if (UART3_FLAG == UART3_FLAG_SBK) + { + if ((UART3->CR2 & (uint8_t)UART3_FLAG) != (uint8_t)0x00) + { + /* UART3_FLAG is set*/ + status = SET; + } + else + { + /* UART3_FLAG is reset*/ + status = RESET; + } + } + else if ((UART3_FLAG == UART3_FLAG_LHDF) || (UART3_FLAG == UART3_FLAG_LSF)) + { + if ((UART3->CR6 & (uint8_t)UART3_FLAG) != (uint8_t)0x00) + { + /* UART3_FLAG is set*/ + status = SET; + } + else + { + /* UART3_FLAG is reset*/ + status = RESET; + } + } + else + { + if ((UART3->SR & (uint8_t)UART3_FLAG) != (uint8_t)0x00) + { + /* UART3_FLAG is set*/ + status = SET; + } + else + { + /* UART3_FLAG is reset*/ + status = RESET; + } + } + + /* Return the UART3_FLAG status*/ + return status; +} + +/** + * @brief Clears the UART3 flags. + * @param UART3_FLAG specifies the flag to clear + * This parameter can be any combination of the following values: + * - UART3_FLAG_LBDF: LIN Break detection flag. + * - UART3_FLAG_LHDF: LIN Header detection flag. + * - UART3_FLAG_LSF: LIN synchrone field flag. + * - UART3_FLAG_RXNE: Receive data register not empty flag. + * @note + * - PE (Parity error), FE (Framing error), NF (Noise error), + * OR (OverRun error) and IDLE (Idle line detected) flags are cleared + * by software sequence: a read operation to UART3_SR register + * (UART3_GetFlagStatus())followed by a read operation to UART3_DR + * register(UART3_ReceiveData8() or UART3_ReceiveData9()). + * + * - RXNE flag can be also cleared by a read to the UART3_DR register + * (UART3_ReceiveData8()or UART3_ReceiveData9()). + * + * - TC flag can be also cleared by software sequence: a read operation + * to UART3_SR register (UART3_GetFlagStatus()) followed by a write + * operation to UART3_DR register (UART3_SendData8() or UART3_SendData9()). + * + * - TXE flag is cleared only by a write to the UART3_DR register + * (UART3_SendData8() or UART3_SendData9()). + * + * - SBK flag is cleared during the stop bit of break. + * @retval None + */ +void UART3_ClearFlag(UART3_Flag_TypeDef UART3_FLAG) +{ + /* Check the parameters */ + assert_param(IS_UART3_CLEAR_FLAG_OK(UART3_FLAG)); + + /*Clear the Receive Register Not Empty flag */ + if (UART3_FLAG == UART3_FLAG_RXNE) + { + UART3->SR = (uint8_t)~(UART3_SR_RXNE); + } + /*Clear the LIN Break Detection flag */ + else if (UART3_FLAG == UART3_FLAG_LBDF) + { + UART3->CR4 &= (uint8_t)(~UART3_CR4_LBDF); + } + /*Clear the LIN Header Detection Flag */ + else if (UART3_FLAG == UART3_FLAG_LHDF) + { + UART3->CR6 &= (uint8_t)(~UART3_CR6_LHDF); + } + /*Clear the LIN Synch Field flag */ + else + { + UART3->CR6 &= (uint8_t)(~UART3_CR6_LSF); + } +} + +/** + * @brief Checks whether the specified UART3 interrupt has occurred or not. + * @param UART3_IT: Specifies the UART3 interrupt pending bit to check. + * This parameter can be one of the following values: + * - UART3_IT_LBDF: LIN Break detection interrupt + * - UART3_IT_TXE: Transmit Data Register empty interrupt + * - UART3_IT_TC: Transmission complete interrupt + * - UART3_IT_RXNE: Receive Data register not empty interrupt + * - UART3_IT_IDLE: Idle line detection interrupt + * - UART3_IT_OR: OverRun Error interrupt + * - UART3_IT_PE: Parity Error interrupt + * @retval The state of UART3_IT (SET or RESET). + */ +ITStatus UART3_GetITStatus(UART3_IT_TypeDef UART3_IT) +{ + ITStatus pendingbitstatus = RESET; + uint8_t itpos = 0; + uint8_t itmask1 = 0; + uint8_t itmask2 = 0; + uint8_t enablestatus = 0; + + /* Check parameters */ + assert_param(IS_UART3_GET_IT_OK(UART3_IT)); + + /* Get the UART3 IT index*/ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART3_IT & (uint8_t)0x0F)); + /* Get the UART3 IT index*/ + itmask1 = (uint8_t)((uint8_t)UART3_IT >> (uint8_t)4); + /* Set the IT mask*/ + itmask2 = (uint8_t)((uint8_t)1 << itmask1); + + /* Check the status of the specified UART3 pending bit*/ + if (UART3_IT == UART3_IT_PE) + { + /* Get the UART3_ITPENDINGBIT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART3->CR1 & itmask2); + /* Check the status of the specified UART3 interrupt*/ + + if (((UART3->SR & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else if (UART3_IT == UART3_IT_LBDF) + { + /* Get the UART3_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART3->CR4 & itmask2); + /* Check the status of the specified UART3 interrupt*/ + if (((UART3->CR4 & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else if (UART3_IT == UART3_IT_LHDF) + { + /* Get the UART3_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART3->CR6 & itmask2); + /* Check the status of the specified UART3 interrupt*/ + if (((UART3->CR6 & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else + { + /* Get the UART3_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART3->CR2 & itmask2); + /* Check the status of the specified UART3 interrupt*/ + if (((UART3->SR & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + /* Return the UART3_IT status*/ + return pendingbitstatus; +} + +/** + * @brief Clears the UART3 pending flags. + * @param UART3_IT specifies the pending bit to clear + * This parameter can be one of the following values: + * - UART3_IT_LBDF: LIN Break detection interrupt + * - UART3_IT_LHDF: LIN Header detection interrupt + * - UART3_IT_RXNE: Receive Data register not empty interrupt. + * + * @note + * - PE (Parity error), FE (Framing error), NF (Noise error), + * OR (OverRun error) and IDLE (Idle line detected) pending bits are + * cleared by software sequence: a read operation to UART3_SR register + * (UART3_GetITStatus()) followed by a read operation to UART3_DR register + * (UART3_ReceiveData8() or UART3_ReceiveData9()). + * + * - RXNE pending bit can be also cleared by a read to the UART3_DR register + * (UART3_ReceiveData8() or UART3_ReceiveData9() ). + * + * - TC (Transmit complete) pending bit can be cleared by software + * sequence: a read operation to UART3_SR register (UART3_GetITStatus()) + * followed by a write operation to UART3_DR register + * (UART3_SendData8()or UART3_SendData9()). + * + * - TXE pending bit is cleared only by a write to the UART3_DR register + * (UART3_SendData8() or UART3_SendData9()). + * @retval None + */ +void UART3_ClearITPendingBit(UART3_IT_TypeDef UART3_IT) +{ + /* Check the parameters */ + assert_param(IS_UART3_CLEAR_IT_OK(UART3_IT)); + + /*Clear the Receive Register Not Empty pending bit */ + if (UART3_IT == UART3_IT_RXNE) + { + UART3->SR = (uint8_t)~(UART3_SR_RXNE); + } + /*Clear the LIN Break Detection pending bit */ + else if (UART3_IT == UART3_IT_LBDF) + { + UART3->CR4 &= (uint8_t)~(UART3_CR4_LBDF); + } + /*Clear the LIN Header Detection pending bit */ + else + { + UART3->CR6 &= (uint8_t)(~UART3_CR6_LHDF); + } +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_uart4.c b/4_EXT_INT_1PORT/lib/src/stm8s_uart4.c new file mode 100644 index 0000000..8f8a9af --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_uart4.c @@ -0,0 +1,902 @@ +/** + ******************************************************************************** + * @file stm8s_uart4.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the UART4 peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_uart4.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Public functions ----------------------------------------------------------*/ + +/** @} + * @addtogroup UART4_Public_Functions + * @{ + */ + +/** + * @brief Deinitializes the UART peripheral. + * @param None + * @retval None + */ + +void UART4_DeInit(void) +{ + /* Clear the Idle Line Detected bit in the status register by a read + to the UART4_SR register followed by a Read to the UART4_DR register */ + (void)UART4->SR; + (void)UART4->DR; + + UART4->BRR2 = UART4_BRR2_RESET_VALUE; /* Set UART4_BRR2 to reset value 0x00 */ + UART4->BRR1 = UART4_BRR1_RESET_VALUE; /* Set UART4_BRR1 to reset value 0x00 */ + + UART4->CR1 = UART4_CR1_RESET_VALUE; /* Set UART4_CR1 to reset value 0x00 */ + UART4->CR2 = UART4_CR2_RESET_VALUE; /* Set UART4_CR2 to reset value 0x00 */ + UART4->CR3 = UART4_CR3_RESET_VALUE; /* Set UART4_CR3 to reset value 0x00 */ + UART4->CR4 = UART4_CR4_RESET_VALUE; /* Set UART4_CR4 to reset value 0x00 */ + UART4->CR5 = UART4_CR5_RESET_VALUE; /* Set UART4_CR5 to reset value 0x00 */ + UART4->CR6 = UART4_CR6_RESET_VALUE; /* Set UART4_CR6 to reset value 0x00 */ +} + +/** + * @brief Initializes the UART4 according to the specified parameters. + * @param BaudRate: The baudrate. + * @param WordLength : This parameter can be any of the + * @ref UART4_WordLength_TypeDef enumeration. + * @param StopBits: This parameter can be any of the + * @ref UART4_StopBits_TypeDef enumeration. + * @param Parity: This parameter can be any of the + * @ref UART4_Parity_TypeDef enumeration. + * @param SyncMode: This parameter can be any of the + * @ref UART4_SyncMode_TypeDef values. + * @param Mode: This parameter can be any of the @ref UART4_Mode_TypeDef values + * @retval None + */ +void UART4_Init(uint32_t BaudRate, UART4_WordLength_TypeDef WordLength, UART4_StopBits_TypeDef StopBits, UART4_Parity_TypeDef Parity, UART4_SyncMode_TypeDef SyncMode, UART4_Mode_TypeDef Mode) +{ + uint8_t BRR2_1 = 0, BRR2_2 = 0; + uint32_t BaudRate_Mantissa = 0, BaudRate_Mantissa100 = 0; + + /* Check the parameters */ + assert_param(IS_UART4_BAUDRATE_OK(BaudRate)); + assert_param(IS_UART4_WORDLENGTH_OK(WordLength)); + assert_param(IS_UART4_STOPBITS_OK(StopBits)); + assert_param(IS_UART4_PARITY_OK(Parity)); + assert_param(IS_UART4_MODE_OK((uint8_t)Mode)); + assert_param(IS_UART4_SYNCMODE_OK((uint8_t)SyncMode)); + + /* Clear the word length bit */ + UART4->CR1 &= (uint8_t)(~UART4_CR1_M); + /* Set the word length bit according to UART4_WordLength value */ + UART4->CR1 |= (uint8_t)WordLength; + + /* Clear the STOP bits */ + UART4->CR3 &= (uint8_t)(~UART4_CR3_STOP); + /* Set the STOP bits number according to UART4_StopBits value */ + UART4->CR3 |= (uint8_t)StopBits; + + /* Clear the Parity Control bit */ + UART4->CR1 &= (uint8_t)(~(UART4_CR1_PCEN | UART4_CR1_PS )); + /* Set the Parity Control bit to UART4_Parity value */ + UART4->CR1 |= (uint8_t)Parity; + + /* Clear the LSB mantissa of UART4DIV */ + UART4->BRR1 &= (uint8_t)(~UART4_BRR1_DIVM); + /* Clear the MSB mantissa of UART4DIV */ + UART4->BRR2 &= (uint8_t)(~UART4_BRR2_DIVM); + /* Clear the Fraction bits of UART4DIV */ + UART4->BRR2 &= (uint8_t)(~UART4_BRR2_DIVF); + + /* Set the UART4 BaudRates in BRR1 and BRR2 registers according to UART4_BaudRate value */ + BaudRate_Mantissa = ((uint32_t)CLK_GetClockFreq() / (BaudRate << 4)); + BaudRate_Mantissa100 = (((uint32_t)CLK_GetClockFreq() * 100) / (BaudRate << 4)); + + /* The fraction and MSB mantissa should be loaded in one step in the BRR2 register*/ + /* Set the fraction of UARTDIV */ + BRR2_1 = (uint8_t)((uint8_t)(((BaudRate_Mantissa100 - (BaudRate_Mantissa * 100)) + << 4) / 100) & (uint8_t)0x0F); + BRR2_2 = (uint8_t)((BaudRate_Mantissa >> 4) & (uint8_t)0xF0); + + UART4->BRR2 = (uint8_t)(BRR2_1 | BRR2_2); + /* Set the LSB mantissa of UARTDIV */ + UART4->BRR1 = (uint8_t)BaudRate_Mantissa; + + /* Disable the Transmitter and Receiver before setting the LBCL, CPOL and CPHA bits */ + UART4->CR2 &= (uint8_t)~(UART4_CR2_TEN | UART4_CR2_REN); + /* Clear the Clock Polarity, lock Phase, Last Bit Clock pulse */ + UART4->CR3 &= (uint8_t)~(UART4_CR3_CPOL | UART4_CR3_CPHA | UART4_CR3_LBCL); + /* Set the Clock Polarity, lock Phase, Last Bit Clock pulse */ + UART4->CR3 |= (uint8_t)((uint8_t)SyncMode & (uint8_t)(UART4_CR3_CPOL | \ + UART4_CR3_CPHA | UART4_CR3_LBCL)); + + if((uint8_t)(Mode & UART4_MODE_TX_ENABLE)) + { + /* Set the Transmitter Enable bit */ + UART4->CR2 |= (uint8_t)UART4_CR2_TEN; + } + else + { + /* Clear the Transmitter Disable bit */ + UART4->CR2 &= (uint8_t)(~UART4_CR2_TEN); + } + if((uint8_t)(Mode & UART4_MODE_RX_ENABLE)) + { + /* Set the Receiver Enable bit */ + UART4->CR2 |= (uint8_t)UART4_CR2_REN; + } + else + { + /* Clear the Receiver Disable bit */ + UART4->CR2 &= (uint8_t)(~UART4_CR2_REN); + } + /* Set the Clock Enable bit, lock Polarity, lock Phase and Last Bit Clock + pulse bits according to UART4_Mode value */ + if((uint8_t)(SyncMode & UART4_SYNCMODE_CLOCK_DISABLE)) + { + /* Clear the Clock Enable bit */ + UART4->CR3 &= (uint8_t)(~UART4_CR3_CKEN); + } + else + { + UART4->CR3 |= (uint8_t)((uint8_t)SyncMode & UART4_CR3_CKEN); + } +} + +/** + * @brief Enable the UART4 peripheral. + * @param NewState : The new state of the UART Communication. + * This parameter can be any of the @ref FunctionalState enumeration. + * @retval None + */ +void UART4_Cmd(FunctionalState NewState) +{ + if(NewState != DISABLE) + { + /* UART4 Enable */ + UART4->CR1 &= (uint8_t)(~UART4_CR1_UARTD); + } + else + { + /* UART4 Disable */ + UART4->CR1 |= UART4_CR1_UARTD; + } +} + +/** + * @brief Enables or disables the specified UART4 interrupts. + * @param UART4_IT specifies the UART4 interrupt sources to be enabled or disabled. + * This parameter can be one of the following values: + * - UART4_IT_LBDF: LIN Break detection interrupt + * - UART4_IT_LHDF: LIN Break detection interrupt + * - UART4_IT_TXE: Transmit Data Register empty interrupt + * - UART4_IT_TC: Transmission complete interrupt + * - UART4_IT_RXNE_OR: Receive Data register not empty/Over run error interrupt + * - UART4_IT_IDLE: Idle line detection interrupt + * - UART4_IT_PE: Parity Error interrupt + * @param NewState new state of the specified UART4 interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART4_ITConfig(UART4_IT_TypeDef UART4_IT, FunctionalState NewState) +{ + uint8_t uartreg = 0, itpos = 0x00; + + /* Check the parameters */ + assert_param(IS_UART4_CONFIG_IT_OK(UART4_IT)); + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + /* Get the UART4 register index */ + uartreg = (uint8_t)((uint16_t)UART4_IT >> 0x08); + + /* Get the UART4 IT index */ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART4_IT & (uint8_t)0x0F)); + + if(NewState != DISABLE) + { + /* Enable the Interrupt bits according to UART4_IT mask */ + if(uartreg == 0x01) + { + UART4->CR1 |= itpos; + } + else if(uartreg == 0x02) + { + UART4->CR2 |= itpos; + } + else if(uartreg == 0x03) + { + UART4->CR4 |= itpos; + } + else + { + UART4->CR6 |= itpos; + } + } + else + { + /* Disable the interrupt bits according to UART4_IT mask */ + if(uartreg == 0x01) + { + UART4->CR1 &= (uint8_t)(~itpos); + } + else if(uartreg == 0x02) + { + UART4->CR2 &= (uint8_t)(~itpos); + } + else if(uartreg == 0x03) + { + UART4->CR4 &= (uint8_t)(~itpos); + } + else + { + UART4->CR6 &= (uint8_t)(~itpos); + } + } +} + +/** + * @brief Enables or disables the UART’s Half Duplex communication. + * @param NewState new state of the UART Communication. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART4_HalfDuplexCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if (NewState != DISABLE) + { + UART4->CR5 |= UART4_CR5_HDSEL; /**< UART4 Half Duplex Enable */ + } + else + { + UART4->CR5 &= (uint8_t)~UART4_CR5_HDSEL; /**< UART4 Half Duplex Disable */ + } +} + +/** + * @brief Configures the UART4’s IrDA interface. + * @param UART4_IrDAMode specifies the IrDA mode. + * This parameter can be any of the @ref UART4_IrDAMode_TypeDef values. + * @retval None + */ +void UART4_IrDAConfig(UART4_IrDAMode_TypeDef UART4_IrDAMode) +{ + assert_param(IS_UART4_IRDAMODE_OK(UART4_IrDAMode)); + + if(UART4_IrDAMode != UART4_IRDAMODE_NORMAL) + { + UART4->CR5 |= UART4_CR5_IRLP; + } + else + { + UART4->CR5 &= ((uint8_t)~UART4_CR5_IRLP); + } +} + +/** + * @brief Enables or disables the UART4’s IrDA interface. + * @param NewState new state of the IrDA mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART4_IrDACmd(FunctionalState NewState) +{ + /* Check parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if(NewState != DISABLE) + { + /* Enable the IrDA mode by setting the IREN bit in the CR3 register */ + UART4->CR5 |= UART4_CR5_IREN; + } + else + { + /* Disable the IrDA mode by clearing the IREN bit in the CR3 register */ + UART4->CR5 &= ((uint8_t)~UART4_CR5_IREN); + } +} + +/** + * @brief Sets the UART4 LIN Break detection length. + * @param UART4_LINBreakDetectionLength specifies the LIN break detection length. + * This parameter can be any of the + * @ref UART4_LINBreakDetectionLength_TypeDef values. + * @retval None + */ +void UART4_LINBreakDetectionConfig(UART4_LINBreakDetectionLength_TypeDef UART4_LINBreakDetectionLength) +{ + /* Check parameters */ + assert_param(IS_UART4_LINBREAKDETECTIONLENGTH_OK(UART4_LINBreakDetectionLength)); + + if(UART4_LINBreakDetectionLength != UART4_LINBREAKDETECTIONLENGTH_10BITS) + { + UART4->CR4 |= UART4_CR4_LBDL; + } + else + { + UART4->CR4 &= ((uint8_t)~UART4_CR4_LBDL); + } +} + +/** + * @brief Configure the UART4 peripheral. + * @param UART4_Mode specifies the LIN mode. + * This parameter can be any of the @ref UART4_LinMode_TypeDef values. + * @param UART4_Autosync specifies the LIN automatic resynchronization mode. + * This parameter can be any of the @ref UART4_LinAutosync_TypeDef values. + * @param UART4_DivUp specifies the LIN divider update method. + * This parameter can be any of the @ref UART4_LinDivUp_TypeDef values. + * @retval None + */ +void UART4_LINConfig(UART4_LinMode_TypeDef UART4_Mode, + UART4_LinAutosync_TypeDef UART4_Autosync, + UART4_LinDivUp_TypeDef UART4_DivUp) +{ + /* Check parameters */ + assert_param(IS_UART4_SLAVE_OK(UART4_Mode)); + assert_param(IS_UART4_AUTOSYNC_OK(UART4_Autosync)); + assert_param(IS_UART4_DIVUP_OK(UART4_DivUp)); + + if(UART4_Mode != UART4_LIN_MODE_MASTER) + { + UART4->CR6 |= UART4_CR6_LSLV; + } + else + { + UART4->CR6 &= ((uint8_t)~UART4_CR6_LSLV); + } + + if(UART4_Autosync != UART4_LIN_AUTOSYNC_DISABLE) + { + UART4->CR6 |= UART4_CR6_LASE ; + } + else + { + UART4->CR6 &= ((uint8_t)~ UART4_CR6_LASE ); + } + + if(UART4_DivUp != UART4_LIN_DIVUP_LBRR1) + { + UART4->CR6 |= UART4_CR6_LDUM; + } + else + { + UART4->CR6 &= ((uint8_t)~ UART4_CR6_LDUM); + } +} + +/** + * @brief Enables or disables the UART4 LIN mode. + * @param NewState is new state of the UART4 LIN mode. + * This parameter can be ENABLE or DISABLE + * @retval None + */ +void UART4_LINCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if(NewState != DISABLE) + { + /* Enable the LIN mode by setting the LINE bit in the CR2 register */ + UART4->CR3 |= UART4_CR3_LINEN; + } + else + { + /* Disable the LIN mode by clearing the LINE bit in the CR2 register */ + UART4->CR3 &= ((uint8_t)~UART4_CR3_LINEN); + } +} + +/** + * @brief Enables or disables the UART4 Smart Card mode. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART4_SmartCardCmd(FunctionalState NewState) +{ + /* Check parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if(NewState != DISABLE) + { + /* Enable the SC mode by setting the SCEN bit in the CR5 register */ + UART4->CR5 |= UART4_CR5_SCEN; + } + else + { + /* Disable the SC mode by clearing the SCEN bit in the CR5 register */ + UART4->CR5 &= ((uint8_t)(~UART4_CR5_SCEN)); + } +} + +/** + * @brief Enables or disables NACK transmission. + * @param NewState: new state of the Smart Card mode. + * This parameter can be: ENABLE or DISABLE. + * @retval None + */ +void UART4_SmartCardNACKCmd(FunctionalState NewState) +{ + /* Check parameters */ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if(NewState != DISABLE) + { + /* Enable the NACK transmission by setting the NACK bit in the CR5 register */ + UART4->CR5 |= UART4_CR5_NACK; + } + else + { + /* Disable the NACK transmission by clearing the NACK bit in the CR5 register */ + UART4->CR5 &= ((uint8_t)~(UART4_CR5_NACK)); + } +} + +/** + * @brief Selects the UART4 WakeUp method. + * @param UART4_WakeUp: specifies the UART4 wakeup method. + * This parameter can be any of the @ref UART4_WakeUp_TypeDef values. + * @retval None + */ +void UART4_WakeUpConfig(UART4_WakeUp_TypeDef UART4_WakeUp) +{ + assert_param(IS_UART4_WAKEUP_OK(UART4_WakeUp)); + + UART4->CR1 &= ((uint8_t)~UART4_CR1_WAKE); + UART4->CR1 |= (uint8_t)UART4_WakeUp; +} + +/** + * @brief Determines if the UART4 is in mute mode or not. + * @param NewState: new state of the UART4 mode. + * This parameter can be ENABLE or DISABLE + * @retval None + */ +void UART4_ReceiverWakeUpCmd(FunctionalState NewState) +{ + assert_param(IS_FUNCTIONALSTATE_OK(NewState)); + + if(NewState != DISABLE) + { + /* Enable the mute mode UART4 by setting the RWU bit in the CR2 register */ + UART4->CR2 |= UART4_CR2_RWU; + } + else + { + /* Disable the mute mode UART4 by clearing the RWU bit in the CR1 register */ + UART4->CR2 &= ((uint8_t)~UART4_CR2_RWU); + } +} + +/** + * @brief Returns the most recent received data by the UART4 peripheral. + * @param None + * @retval Received Data + */ +uint8_t UART4_ReceiveData8(void) +{ + return ((uint8_t)UART4->DR); +} + +/** + * @brief Returns the most recent received data by the UART4 peripheral. + * @param None + * @retval Received Data + */ +uint16_t UART4_ReceiveData9(void) +{ + uint16_t temp = 0; + + temp = ((uint16_t)(((uint16_t)((uint16_t)UART4->CR1 & (uint16_t)UART4_CR1_R8)) << 1)); + + return (uint16_t)((((uint16_t)UART4->DR) | temp) & ((uint16_t)0x01FF)); +} + +/** + * @brief Transmits 8 bit data through the UART4 peripheral. + * @param Data: the data to transmit. + * @retval None + */ +void UART4_SendData8(uint8_t Data) +{ + /* Transmit Data */ + UART4->DR = Data; +} + +/** + * @brief Transmits 9 bit data through the UART4 peripheral. + * @param Data: the data to transmit. + * @retval None + */ +void UART4_SendData9(uint16_t Data) +{ + /* Clear the transmit data bit 8 */ + UART4->CR1 &= ((uint8_t)~UART4_CR1_T8); + + /* Write the transmit data bit [8] */ + UART4->CR1 |= (uint8_t)(((uint8_t)(Data >> 2)) & UART4_CR1_T8); + + /* Write the transmit data bit [0:7] */ + UART4->DR = (uint8_t)(Data); +} + +/** + * @brief Transmits break characters. + * @param None + * @retval None + */ +void UART4_SendBreak(void) +{ + UART4->CR2 |= UART4_CR2_SBK; +} + +/** + * @brief Sets the address of the UART4 node. + * @param UART4_Address: Indicates the address of the UART4 node. + * @retval None + */ +void UART4_SetAddress(uint8_t UART4_Address) +{ + /*assert_param for x UART4_Address*/ + assert_param(IS_UART4_ADDRESS_OK(UART4_Address)); + + /* Clear the UART4 address */ + UART4->CR4 &= ((uint8_t)~UART4_CR4_ADD); + /* Set the UART4 address node */ + UART4->CR4 |= UART4_Address; +} + +/** + * @brief Sets the specified UART4 guard time. + * @note SmartCard Mode should be Enabled + * @param UART4_GuardTime: specifies the guard time. + * @retval None + */ +void UART4_SetGuardTime(uint8_t UART4_GuardTime) +{ + /* Set the UART4 guard time */ + UART4->GTR = UART4_GuardTime; +} + +/** + * @brief Sets the system clock prescaler. + * @note IrDA Low Power mode or smartcard mode should be enabled + * @note This function is related to SmartCard and IrDa mode. + * @param UART4_Prescaler: specifies the prescaler clock. + * This parameter can be one of the following values: + * @par IrDA Low Power Mode + * The clock source is divided by the value given in the register (8 bits) + * - 0000 0000 Reserved + * - 0000 0001 divides the clock source by 1 + * - 0000 0010 divides the clock source by 2 + * - ... + * @par Smart Card Mode + * The clock source is divided by the value given in the register + * (5 significant bits) multiplied by 2 + * - 0 0000 Reserved + * - 0 0001 divides the clock source by 2 + * - 0 0010 divides the clock source by 4 + * - 0 0011 divides the clock source by 6 + * - ... + * @retval None + */ +void UART4_SetPrescaler(uint8_t UART4_Prescaler) +{ + /* Load the UART4 prescaler value*/ + UART4->PSCR = UART4_Prescaler; +} + +/** + * @brief Checks whether the specified UART4 flag is set or not. + * @param UART4_FLAG specifies the flag to check. + * This parameter can be any of the @ref UART4_Flag_TypeDef enumeration. + * @retval FlagStatus (SET or RESET) + */ +FlagStatus UART4_GetFlagStatus(UART4_Flag_TypeDef UART4_FLAG) +{ + FlagStatus status = RESET; + + /* Check parameters */ + assert_param(IS_UART4_FLAG_OK(UART4_FLAG)); + + /* Check the status of the specified UART4 flag*/ + if(UART4_FLAG == UART4_FLAG_LBDF) + { + if((UART4->CR4 & (uint8_t)UART4_FLAG) != (uint8_t)0x00) + { + /* UART4_FLAG is set*/ + status = SET; + } + else + { + /* UART4_FLAG is reset*/ + status = RESET; + } + } + else if(UART4_FLAG == UART4_FLAG_SBK) + { + if((UART4->CR2 & (uint8_t)UART4_FLAG) != (uint8_t)0x00) + { + /* UART4_FLAG is set*/ + status = SET; + } + else + { + /* UART4_FLAG is reset*/ + status = RESET; + } + } + else if((UART4_FLAG == UART4_FLAG_LHDF) || (UART4_FLAG == UART4_FLAG_LSF)) + { + if((UART4->CR6 & (uint8_t)UART4_FLAG) != (uint8_t)0x00) + { + /* UART4_FLAG is set*/ + status = SET; + } + else + { + /* UART4_FLAG is reset*/ + status = RESET; + } + } + else + { + if((UART4->SR & (uint8_t)UART4_FLAG) != (uint8_t)0x00) + { + /* UART4_FLAG is set*/ + status = SET; + } + else + { + /* UART4_FLAG is reset*/ + status = RESET; + } + } + + /* Return the UART4_FLAG status*/ + return status; +} + +/** + * @brief Clears the UART4 flags. + * @param UART4_FLAG specifies the flag to clear + * This parameter can be any combination of the following values: + * - UART4_FLAG_LBDF: LIN Break detection flag. + * - UART4_FLAG_LHDF: LIN Header detection flag. + * - UART4_FLAG_LSF: LIN synchrone field flag. + * - UART4_FLAG_RXNE: Receive data register not empty flag. + * @note: + * - PE (Parity error), FE (Framing error), NE (Noise error), + * OR (OverRun error) and IDLE (Idle line detected) flags are cleared + * by software sequence: a read operation to UART4_SR register + * (UART4_GetFlagStatus())followed by a read operation to UART4_DR + * register(UART4_ReceiveData8() or UART4_ReceiveData9()). + * + * - RXNE flag can be also cleared by a read to the UART4_DR register + * (UART4_ReceiveData8()or UART4_ReceiveData9()). + * + * - TC flag can be also cleared by software sequence: a read operation + * to UART4_SR register (UART4_GetFlagStatus()) followed by a write + * operation to UART4_DR register (UART4_SendData8() or UART4_SendData9()). + * + * - TXE flag is cleared only by a write to the UART4_DR register + * (UART4_SendData8() or UART4_SendData9()). + * + * - SBK flag is cleared during the stop bit of break. + * @retval None + */ +void UART4_ClearFlag(UART4_Flag_TypeDef UART4_FLAG) +{ + assert_param(IS_UART4_CLEAR_FLAG_OK(UART4_FLAG)); + + /* Clear the Receive Register Not Empty flag */ + if(UART4_FLAG == UART4_FLAG_RXNE) + { + UART4->SR = (uint8_t)~(UART4_SR_RXNE); + } + /* Clear the LIN Break Detection flag */ + else if(UART4_FLAG == UART4_FLAG_LBDF) + { + UART4->CR4 &= (uint8_t)(~UART4_CR4_LBDF); + } + /* Clear the LIN Header Detection Flag */ + else if(UART4_FLAG == UART4_FLAG_LHDF) + { + UART4->CR6 &= (uint8_t)(~UART4_CR6_LHDF); + } + /* Clear the LIN Synch Field flag */ + else + { + UART4->CR6 &= (uint8_t)(~UART4_CR6_LSF); + } +} + +/** + * @brief Checks whether the specified UART4 interrupt has occurred or not. + * @param UART4_IT: Specifies the UART4 interrupt pending bit to check. + * This parameter can be one of the following values: + * - UART4_IT_LBDF: LIN Break detection interrupt + * - UART4_IT_TXE: Transmit Data Register empty interrupt + * - UART4_IT_TC: Transmission complete interrupt + * - UART4_IT_RXNE: Receive Data register not empty interrupt + * - UART4_IT_IDLE: Idle line detection interrupt + * - UART4_IT_OR: OverRun Error interrupt + * - UART4_IT_PE: Parity Error interrupt + * @retval The state of UART4_IT (SET or RESET). + */ +ITStatus UART4_GetITStatus(UART4_IT_TypeDef UART4_IT) +{ + ITStatus pendingbitstatus = RESET; + uint8_t itpos = 0; + uint8_t itmask1 = 0; + uint8_t itmask2 = 0; + uint8_t enablestatus = 0; + + /* Check parameters */ + assert_param(IS_UART4_GET_IT_OK(UART4_IT)); + + /* Get the UART4 IT index*/ + itpos = (uint8_t)((uint8_t)1 << (uint8_t)((uint8_t)UART4_IT & (uint8_t)0x0F)); + /* Get the UART4 IT index*/ + itmask1 = (uint8_t)((uint8_t)UART4_IT >> (uint8_t)4); + /* Set the IT mask*/ + itmask2 = (uint8_t)((uint8_t)1 << itmask1); + + /* Check the status of the specified UART4 pending bit*/ + if(UART4_IT == UART4_IT_PE) + { + /* Get the UART4_ITPENDINGBIT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART4->CR1 & itmask2); + /* Check the status of the specified UART4 interrupt*/ + + if(((UART4->SR & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else if(UART4_IT == UART4_IT_LBDF) + { + /* Get the UART4_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART4->CR4 & itmask2); + /* Check the status of the specified UART4 interrupt*/ + if(((UART4->CR4 & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else if(UART4_IT == UART4_IT_LHDF) + { + /* Get the UART4_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART4->CR6 & itmask2); + /* Check the status of the specified UART4 interrupt*/ + if(((UART4->CR6 & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + else + { + /* Get the UART4_IT enable bit status*/ + enablestatus = (uint8_t)((uint8_t)UART4->CR2 & itmask2); + /* Check the status of the specified UART4 interrupt*/ + if(((UART4->SR & itpos) != (uint8_t)0x00) && enablestatus) + { + /* Interrupt occurred*/ + pendingbitstatus = SET; + } + else + { + /* Interrupt not occurred*/ + pendingbitstatus = RESET; + } + } + /* Return the UART4_IT status*/ + return pendingbitstatus; +} + +/** + * @brief Clears the UART4 pending flags. + * @param UART4_IT specifies the pending bit to clear + * This parameter can be one of the following values: + * - UART4_IT_LBDF: LIN Break detection interrupt + * - UART4_IT_LHDF: LIN Header detection interrupt + * - UART4_IT_RXNE: Receive Data register not empty interrupt. + * @note + * - PE (Parity error), FE (Framing error), NE (Noise error), + * OR (OverRun error) and IDLE (Idle line detected) pending bits are + * cleared by software sequence: a read operation to UART4_SR register + * (UART4_GetITStatus()) followed by a read operation to UART4_DR register + * (UART4_ReceiveData8() or UART4_ReceiveData9()). + * + * - RXNE pending bit can be also cleared by a read to the UART4_DR + * register (UART4_ReceiveData8() or UART4_ReceiveData9()). + * + * - TC (Transmit complete) pending bit can be cleared by software + * sequence: a read operation to UART4_SR register + * (UART4_GetITStatus()) followed by a write operation to UART4_DR + * register (UART4_SendData8()or UART4_SendData9()). + * + * - TXE pending bit is cleared only by a write to the UART4_DR register + * (UART4_SendData8() or UART4_SendData9()). + * @retval None + */ +void UART4_ClearITPendingBit(UART4_IT_TypeDef UART4_IT) +{ + assert_param(IS_UART4_CLEAR_IT_OK(UART4_IT)); + + /* Clear the Receive Register Not Empty pending bit */ + if(UART4_IT == UART4_IT_RXNE) + { + UART4->SR = (uint8_t)~(UART4_SR_RXNE); + } + /* Clear the LIN Break Detection pending bit */ + else if(UART4_IT == UART4_IT_LBDF) + { + UART4->CR4 &= (uint8_t)~(UART4_CR4_LBDF); + } + /* Clear the LIN Header Detection pending bit */ + else + { + UART4->CR6 &= (uint8_t)(~UART4_CR6_LHDF); + } +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/lib/src/stm8s_wwdg.c b/4_EXT_INT_1PORT/lib/src/stm8s_wwdg.c new file mode 100644 index 0000000..6790622 --- /dev/null +++ b/4_EXT_INT_1PORT/lib/src/stm8s_wwdg.c @@ -0,0 +1,125 @@ +/** + ******************************************************************************** + * @file stm8s_wwdg.c + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains all the functions for the WWDG peripheral. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_wwdg.h" + +/** @addtogroup STM8S_StdPeriph_Driver + * @{ + */ +/* Private define ------------------------------------------------------------*/ +#define BIT_MASK ((uint8_t)0x7F) +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** @addtogroup WWDG_Public_Functions + * @{ + */ + +/** + * @brief Initializes the WWDG peripheral. + * This function set Window Register = WindowValue, Counter Register + * according to Counter and \b ENABLE \b WWDG + * @param Counter : WWDG counter value + * @param WindowValue : specifies the WWDG Window Register, range is 0x00 to 0x7F. + * @retval None + */ +void WWDG_Init(uint8_t Counter, uint8_t WindowValue) +{ + /* Check the parameters */ + assert_param(IS_WWDG_WINDOWLIMITVALUE_OK(WindowValue)); + + WWDG->WR = WWDG_WR_RESET_VALUE; + WWDG->CR = (uint8_t)((uint8_t)(WWDG_CR_WDGA | WWDG_CR_T6) | (uint8_t)Counter); + WWDG->WR = (uint8_t)((uint8_t)(~WWDG_CR_WDGA) & (uint8_t)(WWDG_CR_T6 | WindowValue)); +} + +/** + * @brief Refreshes the WWDG peripheral. + * @param Counter : WWDG 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_COUNTERVALUE_OK(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 = (uint8_t)(Counter & (uint8_t)BIT_MASK); +} + +/** + * @brief Gets the WWDG Counter Value. + * This value could be used to check if WWDG is in the window, where + * refresh is allowed. + * @param None + * @retval WWDG Counter Value + */ +uint8_t WWDG_GetCounter(void) +{ + return(WWDG->CR); +} + +/** + * @brief Generates immediate WWDG RESET. + * @param None + * @retval None + */ +void WWDG_SWReset(void) +{ + WWDG->CR = WWDG_CR_WDGA; /* Activate WWDG, with clearing T6 */ +} + +/** + * @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) +{ + /* Check the parameters */ + assert_param(IS_WWDG_WINDOWLIMITVALUE_OK(WindowValue)); + + WWDG->WR = (uint8_t)((uint8_t)(~WWDG_CR_WDGA) & (uint8_t)(WWDG_CR_T6 | WindowValue)); +} + +/** + * @} + */ + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/user/Backup of EXT_INT_1PORT.ewd b/4_EXT_INT_1PORT/user/Backup of EXT_INT_1PORT.ewd new file mode 100644 index 0000000..5bae25e --- /dev/null +++ b/4_EXT_INT_1PORT/user/Backup of EXT_INT_1PORT.ewd @@ -0,0 +1,449 @@ + + + + 2 + + Debug + + STM8 + + 1 + + C-SPY + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + SIMULATOR_STM8 + 1 + + 0 + 1 + 1 + + + + + STICE_STM8 + 2 + + 1 + 1 + 1 + + + + + + + + + + + + STLINK_STM8 + 2 + + 1 + 1 + 1 + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + STM8 + + 0 + + C-SPY + 1 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + SIMULATOR_STM8 + 1 + + 0 + 1 + 0 + + + + + STICE_STM8 + 2 + + 1 + 1 + 0 + + + + + + + + + + + + STLINK_STM8 + 2 + + 1 + 1 + 0 + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + + diff --git a/4_EXT_INT_1PORT/user/Backup of EXT_INT_1PORT.ewp b/4_EXT_INT_1PORT/user/Backup of EXT_INT_1PORT.ewp new file mode 100644 index 0000000..abd500c --- /dev/null +++ b/4_EXT_INT_1PORT/user/Backup of EXT_INT_1PORT.ewp @@ -0,0 +1,1604 @@ + + + + 2 + + Debug + + STM8 + + 1 + + General + 3 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + ICCSTM8 + 3 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ASTM8 + 3 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 0 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 3 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 3 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + STM8 + + 0 + + General + 3 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + ICCSTM8 + 3 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ASTM8 + 3 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 0 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 3 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 3 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Debug + + + lib + + $PROJ_DIR$\..\lib\src\stm8s_clk.c + + + $PROJ_DIR$\..\lib\src\stm8s_exti.c + + + $PROJ_DIR$\..\lib\src\stm8s_gpio.c + + + + user + + $PROJ_DIR$\main.c + + + $PROJ_DIR$\stm8s_conf.h + + + $PROJ_DIR$\stm8s_it.c + + + $PROJ_DIR$\stm8s_it.h + + + + + diff --git a/4_EXT_INT_1PORT/user/Debug/Exe/EXT_INT_1PORT.out b/4_EXT_INT_1PORT/user/Debug/Exe/EXT_INT_1PORT.out new file mode 100644 index 0000000000000000000000000000000000000000..d66ac313319dfb45c7bf1694432ac058ce3d5ec9 GIT binary patch literal 90744 zcmeFa34B%6wLiYkbf?TCbGSfA7z8pxP!Td*AR0(Wf&*f2LvjO=Oxz?8M369<6e5A3 zSZk|@+G>5YwiT@Q5p6BBmN?t0ZLO_sZTntdeb#F2v-^rX6=2?y8#%HL6T%MA_35H`x!xl6tGmcw4%2lMVRMI6FaOJCs2* z)n*ziVy%Z%#99woD7MBFyGc7_OTP-|1?hP>tLa%dZ%w}p=g9OlesH0pd{oQx=?|BARe7Aqsef`}( z?ccMwfA3S05B+mO?>-8Luj%jp0mXuH?>5PY`&NJV1O2EA!{z6akop!=RL&pJsm1jBt=}w%r z^wBt5z}0@pO1={yjs0ZBA`*Kss!idCA9wugW2!LJ9=KS<`>(RoS3i8OMCd_f$ zSf(Cz6n@A9A0Lh2B{dz_SlG#N)Up40+y0X_ryVr=pQ9iV%10gl;@6LzF*+?of!UT#jDWmv$5QlOGl$pXc?zO%^!c3v(LFBh4Yi$XM4n`n;OmZZmAoj(5R z^vtW%i>^+;4#jh#?EVKoJy~}DQTy{{_v5Og{?1X07Y86;E2rlTYi5EfnA zeb1MjJXv-U7WAVEpEGd5q|cu$dp?*{$2mWPPxaZTeRx>yzkP1*zYwtW@0efOza#Qt zsek)XoOZ-Iqbd9rJosadJZ|gh?OD;&XS*rwkD!d5FH$3u{_S14k<6OARTO3Ek;z-R zGW{L34@*a6t$*tdaOk+2x7 zm;$A^Qu-K5`3^}=;T;Eg7-@XrScFgQI9PgW*QY1gG)SND0!!}i9Hl4d$z^O>#|bta zG4XngNKP@+JNi36?eBc0zjJ?o=bHX5=KQ~h1;ZZwdcYXa%y&4)!6O~{-lv)EqyFCK zkFc%%cl;h~KRW98rgY5Vi`<;{3o&ePT8=Ph|Grf|%J)xg-8x^HFQY~5>gnp=^G^Ss zKa@wNM5SxVQSP44Qxe8YAGr_qu@q@#&vE8`o#!r>bZNohdOG`t5i1_ZGnEZc2M7#hM_c#iYcgE6E9;^M>Qp?zPEUiqzA` zyx(RFiv4{5&BR7Wz!bBVLD!i%n@9}aYEa%^(S_La#N^Q_F zt)S)z&A#$q$}#1r{Ac-?d{p|gbWA$RJ~^gGy~Cq^$D@A7qdq`X|GxLSKI>C={*T;e zIm(V(3hq0`j!MV1g8QCk2+7A)J)|60^pFIq`4SwF^$~$qpa&Ju`mi980Z4sPs(d9o zst7Vah49cR>>_V4R=D*gN3Iu29x99PpKkIOyBEf^a1^jSLkRF`aVDb_wT zxg8HX=drY?<5C}UDe`>fa^-%TyT|=y=ZKygZuqX6ru2N*GC9Kg9cD?DR-m}lxyoF5 zt~8fjJ?-s272J-qiavH+t^lj!3<=cZ@^>xB|HMZaKrcymtWoOZI%(t8X&-gKqvpxe zB+z$sKFpks&WB~E*7>l_$vQX5`0q-wj91+UKO1k^xuc^iMMJT%6lJ`&^G2B`i0OP- zrBpUb6^T?`o7B!tYFCPll8v_^VTx_#%Fo8z^zZ>sydug691aLKTT)ZtQ@OOsp{*=1EaTsG#iOD>1(iU1JFTv3uMT6V<% zV5&>fgjGSNy6l?EVR1!RL8iK*G*`666$60TT$0@-J6uWxfJm1V<&vXaN=(O>c0AbE zxeK+ezdO0VtLG$}a)M1czW3gxV5e!XV8hO>(?S}4=Q*Zx>&hqC4#UtjdK{T>0|ewkdJ8} z9aE2LkE`j9j~>_Dsq%`Bl^yfcv=`hoIPb%3f!vK2E`$?x209UQrde};Q=S3O!Q6Nb zF4Tak$I&fzIHUKUL_R9ztM>PH-;^G`|AdPro0{BfST0;#8av{r(jwR{p^;f5T+EIz4qwBMt z-kmE~_S}>{mb?-{Tx499t=Ru_w*MFMifJD&bH3S;k(rg9lRJA(-rTBH)is{l)obc* zUR&SL*wnnv+tS*$enb1lTQI+#kQ5gk6&VrXaM%*|71qodd70HTm~M<>Gg z0~Y(}nDh~KjgPZ53%Z~Gc6WUAxTF_PZxj~5Ml!a49JBSl%VMeO8T!WS`a;nrwqn}9 zmO0<;=sB|g|C|n3Snm0(=ieA}9PW)ud%vUSKBr}+&l%MJP5YpO7karrTYb6G@ zy}xt*{fP4Uf&Si?Z%SACd#Cqz<(%q$4K164yvW_(^$?1Yyb7hvR&+Eqdm7!Djwr?h zSwyIY?i}1T5Fn`yv+I% zid4sRBl-z<(0 zBPf3D)euz-MXX^IVU}P)QF7{O3hXqJnKIW-n>p$_js>6NP?&U^HD24W)!LzLvusy( zsJm>p%T}A!ZgtoqY>~DoTeL047Hf;M#oH2WiMAwLvTcNIq-~UKG zus%OwL!o|d*&VqjqT6wYy)dC^Z){J@zUci?%M)5&eCg#^3KKT`>{R~?Lny-zG!x&u zh%(GWg|ac${XS&)@a%Swe;;g!t4xKl#mcObRkkWt)oSTvU6RdVjj%>qqpZ=^7;CIG z&Kj;LA|XOIV_UaE1QoyY=Qs`=e*=y%E_=N&;nrT|fLxfc=}uKXm2m6pLy`rAmJ1l` zxB=YIIt+o(bHVWdIM(7isW9P|UhRN-r*anrUw_bkx9!W;do1}0ZG{P~g$XT%3Eskl zbp;6xiX4%!en_&1LJHcu?OotDV@NonKTtg2NGs*3g$bK`@siB5#Bp)CO=wuf%3?Vb>0ouqZI~Cty7vte5GIj^O#%AZV{m0OOt^ zvjTB!0Y|tvQ-(yw5#ab^a6E|Go@lBtL&6;5S|&2K^PAvC{l)p46lG;;1xJX?ULNAI zvh*{y>n<=xzdHn?LV4?WaJ&!PZWnX-=NBha%9%8%N zCNtIvKf_J!p|C4lz_tM#M}b@EP>cE!7_R~2X+t6^T)+hDz8F#8(T5<%`|F^DwB*LHR;V6??qWxyEakJc_n`I-+^0QM# ze9kyD0zL@=siyh`j4=rqYZ5TdBw+lR1bp$OqL-;z9ufg#FeU1~K0rWnAj5)*CIOR7 z0w$kHz*k=@dj01^Cg8syV0D0iBTNF0GzmD$B;e>X3HXaQir%Ej$oX3k&L8^~2-pa2 zaHQLTBMr)r)Acr&h4R9kQzf$IibN8;L! z>nL2|@5y8-`2UcY1EadQMF;SZH!pXym**|5nK1S1}>whg=bohOvd=N`#a~#(RPLf z&SW&_-A@dq*2&L+Bjy1EtJlVQ_?fgG5f6?SR-PNjGig1d1{{AllvEt_)toz-;%P8*n1aSNi9RGN}9Bn2U zM=u1&KZny=+zK(zzl>WUMp+wLo9;?^u-J$`1}{foZ8O;xW6Znc%!#p|OQVzRaVAXO zWWwbquw+|wf|uo`u45Anx>!F#C$rlmyIsyt*zyyqK0)JDx@&WeqN0Gt6hhS7!A%}A zj_9)Yc7dBclwI$_JR)FcI1AhfUs(Dk6O#$pj> zFQ%#&wXg;tDhg}t`w;aoL>)k34UFTs0&t|U!2k+t031OB7tHc%CRJgI>u7+6E<%}SF_2Lu<@FN4Ob^@Mz@1u zR*=^X$}eE-38=&SW5JDB2KjMtM>eqHn+UG^;m=GvJI4WZJMoN7`~qXUo53x%DB;$H z30s2shUz{5zL0Vv#=pC_f?LQ)&>FJdJ1~xuV8z|r!IAV2u;yT8oP_c3ZkpE)os5rx zBXzUqAmbV4j9H9L`V1UlOQx7dSveu2telBr_%v|aoFQNMMe2Iw`+ab;qZuw5I=@JL z0epW5zNhiDb9^Kx7Y{`_8QZe}90OY4(_5%8bX+MM=p3^~;Y^0}@b@Oqt8mUSUsSF% z+*jGN7%Dg57f=;!{JAFc2zg))OB%YdJv8mdLw$i92UWRHENREU@fmPa&5mmf`$MM( zr!5wqEp5z2Uy8 z;5K*2IHJAVcQ?4r4CXkf@oW?xOGtzryTQ$|AeiM~4LNN!SWX8wdWt0Q!Bv$%xN6;D z+ohbtgR3a+Y3M+D(cp)xh=Y6naypdneR)VZy20_aa2yBQmQH^h#eD)Ct@wp$EW)+- zXCAd*hK6ikKe$2rvvD-4_8Gc&l+0zz!SSurb2K-)2FJ6=_;ql64;;fZXoD;3%Ra$l z6Ayu-8m#r8e0&Zb7rh1?A3+Ow()1KwenNXe!g~I=s<$AaR(>sE)iPZ6B&=GPPcpVRG8qr3qMho!4&3lWC4X+ZAhf6k#T&I_RttFl4!lE(YET@}Ma_c# zc*_PoAf}ucPA}qTJYRU)p>?=c;tX{f6OIgYT6m*JOly640FHf+7bH`qfxflY*5dK5 zY^bVh#A{#0`Q^^SS%uT5I}4i{n(OL4Ugx!0Gcz-0X3osa$#d2=d7bng9W8{5LvCwq zsaxIXsc}}Xsq*5feRz@M5S@0&I!0dA)Kt$TS*~krWwPc^(Xyt=3yjsWN7B%I#=K{W zt8Z#t%~Y!m=x)TtzOKjU2lw^5fp{t@oPu50J1uj>adtte2*>cy?!W-O~*DPKE!XRuGVHX5ra|pXtWb+vD zDlECiU2$D;W#Qr_rA03HlKiF1^Gm=j2%o>avQ!u0LnB$?^73-m(#pb;(!y&hD)TE{ zZofX1JT%^{rJQZ>sVH4uUg&Z!t|(@|)ddom5@22lz$~tCvF~x|<=-30k*>15c*(W- zCCgpz3|;g9WF`|#0+3lu=1K-2vzZc#%wcLMGM8zg$l1&iikyRf7A3CO4S|a*-Gvnu zMJ$rj0)qV)vay`#DuW2PB}K*878kk7-Iy+LQZuf!aaCBjRh#qJ8%Qdk4Y zDsONv%r7Z%mz1Ij3XLl-u5h_amzLZB%Y;wJBjwOYo|0Ij%0equ@#S4v0;WOPb1r)R zLGgYORL-c@$B5o?buTI_F3mSY_hAYQd3~5d6eHKbhbclC24e6^Hf5njQWllPOLE+0 zsE~#EC9rKK@(4m@A(J3f4sr=XUDu*z(39&D@GLB7ICVu9 zmgFyT2gEsjai|mlF*j1o^8E73Om}g4Q9f5}X=(WqE>#d7E?-u9ol!X~2mMK}%fH68 zyv$u(RN^WrUP?9*Np*aFQ4!ptVo84aHCPda!&v^upB4!U%3b-_6uBy0g_Xr{Y}e97 zm5be(83o0a6+Tv{CClVw+y>S~ezp~rrDYVu{ZL5bLuI&gS*$Li51GZB!Kh5oWstnq zExHViw|H+vev`al_I=ZfM@X``Y%cMnMF{>utNu zkj|I7tW-2Z3&O@ME?%_QCyt+G+2VZnlHwwilwV&zM?@C578Nf=#X!Z>&1OWG;nQLmPHC z&_;*pGpfPHh%k(%C-7$w$z**jLZb}(U!RPZKYm z{)D_I>a>^<1r;~24ikoVU7a>RN&fQd*)|hgSXfGFb~yYbK=GU$WHrYvB&#Si6jSB( zF7~l%f(zLnOSv(E- z_DBg54|T6gPMuLbugpkH@kFHCw^1%0ivg56E=J<@dD0fS%x2?LBX-O|hQfW~+ z-Z*3wEapLpf@oEMl_^+Qo{69$f*62IQd#oC`l{6xtyQgUE$o+4^q-_DnFBP}f?$W=T_x#~1q#IX**=Eo}38J&mn} z^-a}lxi&tc$CUUyWxQa~)aI@BC;w21zgkJ;F*FeL)-_yPRo~{1|E?N;y)t?PWnS9W z+T7Oa^b>@zyo3@p!B1P4QWOjPH_k*~rm#eSWXSKO)I7BAwUMQeA~9 zi!TyTxFafDZ`A$m;H8ILXna%g1dHrow3}QlvE_gi>R`?Mqd)f=DeSDy&RV;Ml>NB z{n0k=a#(@KV(?-vygiO_S1U<+LX1p2^-WbZ0Te%SjH^_}3X0{;HE_|2zyiEIV%!&$ zF@nIg9>pINe==g+YI&51=WU}=41b9j*CfY_2vh0oiX695j!o8^CojetW`XaIOv#Cz ztjAtgwbrw|*=L7eMy6a5J4uhDae&uTwYJF9>fsfv#M8LCb&ZesU{p#$Y>rM`(c09E zs@dX;{hz3m5??lDRbF%Ho{UbZ^kq}Av9UTpz^<5-DqqU$n!GhZ`EH9#SrePC=Npjn zSX_!Xc0zI+X1sasR<_~_yq3S)b9Bdel|Y-kR->A5M~dEV(jui zrgTUU&EI9{HR-PjDGy7rp$(_;ZMD zog(Hqm>y@b3prxB938_e2f3`{mh?o6MF^3~h1fRCLSW&9v3t|wHC>8{T#8|?IM_AJ z-!Y0XFny>3N(Jt`1GHrfCo6o4YSI3VCdXn=|-zrogRxOq-u4=5o zNRLUGlBm{5qo)J$u!#yW>3+2OA~MBo1QsM}et@WRgsAX1Qjg!qX6&J1vMOz*L$Ca5 z^C2cZY|cgfh8PB5CTzCpJc&2lf5JoLdMeOAGE9PQ-OBhDIohxB+~NWTL8+^MOc&Hs z?WtSuDXMC%%45=x6#HnnX3QI?!hb`mts*7JKN&7zcZkh)ELgOnZE}QFKQ#tdg-wmM zb*q{5s${{unA!hJ2-tCh!=RwJv>B*wQ=r2n$5PJ*F?9rb!6LB3s|yZS1nooU^?=dq zQUq=Va)nn#)U`G@wGeLPSRIF(jyS$MOv=+PL$oiDLt=x*UF?77&2h}4vt6q zZSQgvRJGNV)0AFXF?s?@>q*4!armbMz|UKVLVz3CzUMHeAWXV($}Bua^nbv<;t*30 z;1=PQP|PUc-gg*N4koQ6${0LKWsi2yR00^+Vqnm!*b5?z{M}2c8e8jHTB?}zg-Db- z31a_ZXmn;q1}G-Y)+sv4!0c_r4(GVUrOEi$b;-W3`w3?Q{q&_)v9IQ-jhP7Czyd%=AM4y~F zS68AfViji1Vi8PwR*uG9cb;xPSMJGSQjQd(EvfAHpk1K>JnyES=E_xgS__-n8e6H` z?~yHuYEq25@Oi?MRs5n1G>}6c`Zx5I3kel|ra>PUSFB!6bS9ldQhs!KcklFI0 zP;tk6Q){?vd>V9p4zXw~aJ(^GGDBY4PRp?uS$}TG{7Wu#CB}mVRV{jj&Bw+XplK62 z?&uM2RA#JDF)4r6m3U?eU6AEYJr3)5O;9_35vmxKhvhq5x1SA{ZqSQ1_97Ru)*HIL zz!wv)!!nSkq-g__zAjm4mrUALiwv>jfP)CyDPkhZguRZq*$!IQ!#W+h+pkNP=R?mU zKwr<*IW=7BKo#0mETRMIz*9ukc+s!U;=0vqm~@XAYiQ(UJcXgpJ<=p}xTKHvu1TMJ zq$}{K4%bKH`uuXZ^not4ky*qiXo%6534Pw?`iMSa5g$Eh=u}DXo!>MxS(Jjp;)=9z zlp7_(q(!sm2|cts1y*#Ui^^93-3zUS_YGHTK&sKMYLRzCy`LNEeV41}?*wVitKm^0 zL2W3Q>qHC270kqyvEeEbl9x7Yi$V)#&q2n#^?h4k9B*~Cw-#ef*uMnMq=l9gXrML; zU3cBZ9SdlD&xb|bf|$Jy6Ft8jfY@bUMC=^IK1SNHuMU&Pk!rMi9Bt!cht~=9?&stMHp_xhlsYc*wvY2~O zC{Yp3)T$FM5&bL2kuxy%+;G_eHlUsJqM@JTEo997@Fdv*Yp}jP$CzH-r&z|o8cK<< z-tBW8W-2D#r(|CRZ9fJ{JJ;i#VbX(ippE)soKOMt1EI&eq=)||7cW*rmD^=rp=3;c zMPf%FF_UhW=M+JiK1?|OZ5lw_E?@Tr@JEZUjOIEXA0{11KiWDl20dcLe;YbJTh)T6 z3R~T^Rd|LFV}Q3sFDqjdAQD8?B7*QE#~{u3qw4D#IXH1LJQh?qo*FIiCQ zay~NV-u9nGv=Y|P;-+OWZw`~56CJC3yU@3Djl;BHhS(JJuCe(j7C0@A;ab=s$!R~t zSXA98Co<;J^MxI^@TxX%72TC)(o>RU1nP;5Ii-}K@A^Dz$Ayqx zkT32Z5ENli^bb>u5opiDk|l`>evS~4(%`sfn8c*)Xs5||6lV;LnYo94wYsUX)k_Zs zACzz>0@6(q+VD*&89O*!(m^uXwK5*F_!xQ%nM-#MJrB*KJrZtCKs2~4iN$xfWbDhs zB^tz{?JpCSqI$y_g=qIS)z8j!9c=Hh_BoK94KDwl-Y4Ko5E`ChMi>ifPpQ!fda6gcZch(Wq0nxu^g3cP zszL%L`l1avE_5@kb?(wcp_~LcPZFThE^TU-t`llB>VPp581PFb^kJpCM&rXu^o^l4 zgLv6Qf1?BrCY{_U-a{yJl^2)c@%{V~cX3uBgyaKeKeD2%7*Bf#A-Vec>j@?Xgw6_& zHeO~hQDc$JRZdT-2QlY(<2{F9dgE1xU_3q99*$48{uV?qeI~O8)8}8eoW+MAiwapn zFtRXzDSz{mNyfdRi&u_EjdJw8ML>_)6kmqOi_gL1-Q0jd^m%M#5WcW% zIp>e(gaZ?Zh%AN&q{2nyux;TZ^4Rw95qO7TNB9_exG8)L-e=eqK8D_ExE*Z|oPU?z zdR)9>>(Yy@ba`dj@=E@`kti=6L9ZK$cY=Hrcyol?RY$MMeG>8hw9R2;C z0LnZT9ZCt43qJ@Tg}Ft|2*ASBiDnLPyz)YpY(_1?^Y3{3LAa2fn7=Jl!N0%2qzUI& z68tl7=h+gb-Xg{F$w^u9QoOTe0`P#eKPC(2_mO48^ge*9jt|JiI|4pnHeP!30dp8? zj1MYVT3oAc%Q>vT#06e>tx`| zmg{(3a{~{05bL%vkRS%~izW{65qD`3y()%x#wse={klbX3W_W%^GCiD9I2qV}Gk)=7U#oX(sc8+g;>Y)wbI0 z#tKX;9!{ugXkoH_ha@%7BPe)-f+pmSa8$dch$tnA6#A8}kc?--hFKwc9lUofHeXtd zf$cGT(BWYf0{zDACfhJ624AGZa-JPToKQ1H;xTbpT)%QW;&LrWfSGGA7EXKDTCoV8 zI0{RFSC%0TlUq9Yoe5bw-vV1jPp_X_d5!!jR&vKGA#Yc&Z>p=oEhF`Sq>+GcQvpE0 z^DKZt2uQEY<1>NTA>9{=%QvXOe?Is_SBX1`g+C2mR3(g%Su?X^{H^{p*H%a0QJ z11rbFjx~7eiqOy9|G@*=ERL;QLrV*O;`iw7eXN+Y)KzmNC%wF-wT52q_puxY1io7f zR=@lBv-`Dg$YL?Y7yqu(j)G{a!ODxfzODfeocN+H-&noIQ%%!CAzl5(mbzO!Tr4ha zDvDL-&EcgR*H_j1lb=Kd$0vJ{T)Fq7H~y|2NEV;)t*WWcBxLWM_dKAz0(t1WzEvCA ze7Igo;8uA&%|7G?ffLhIk@hn^E&r;o!El$JxVFBkWsNWOV>+omZV~D4)k*8Js(pn2 zR7E~`5zB{r%Ang&v)YH;t|RezSs#w~3@z@K<~kqhB|T%@nD8t8H$4*|vwW04_fzKh zkdNrO7#*|_{Bxa@uzm)8iV%H+SU>PGnmj&+e*T$qa+0V z>Ew&O7OcoHR?m0GToTy4oYN!D*qKdio+0TOqkTq`wSTWBDKnxqWl{E2O&Tv-(Rf|Z z{Jw|$vP1H_=R)b%{XX)WOZiRJw0U_>%~}FQBW9Ye08;@@)f|&GtLIuL2o-5ffhOe` z*6?!at{a^7X+*?ZNGANw@CQlv2T=}Nw?fW71%gJ%swjhdhauM;$n`}jT8o&cjZD;( z5w@8-bCzh@1kE~4b6kb<0vJPHz`?~hU#&?C@cCWtBbzR~d>uDHzVAUkB|_82DpI;8 zIb}&?|Hv?8UyJPDz=xJ2w`-HG)ReS?+xrgLZvOj(+#LMP&B@*J)i=v8&&ipuX}OAY znWi|6z(fQt)1<3pO$fW?!V9~-3&Li?R8gs8#yiL3aE_-Mt(&WjOK|Pb_^{s4Nuuq< z;EtM-?METNYceF5yiSv58g6{+h0pjcWc)NTj!uOOH*4Bl6h*S(rkF~gLA#KO?}$YH zdq{BvMjHm-c;WMnMZW!TPi68>O>@HEoQBcYU--=DBlCI4JI7WyS(8#_d{mlxjv+O- z-pdL<`vmOC&vx`6XT0}Gje_6Y!;tR*CO@02N!dn&^rZ`JiQDHQH zhnu-HOJEh#Y<-~RqR(K%4yQXuK#I4hjZma$!|0+1ya0pu&QZwi8Om*PUf%drP0Pqb z#+xT8^40LdnTEDaLfgT0{b$s64e~$ATg1^jvQsrF&QKZaa_9>#gv$Go<)g?_i;Xp7-kVY!3C9W-zrGAO@modzYJ*wW<8w+zYbZ1%!rHMfb1afcyYGH0+~V<<2pzh3eE6q-53_j8 ziQkjME&K8))3Psz>o?Zoo(FQ5IXK_H3fx86rutTWIe1bNcf>%i?4bC{pgUyBHp1fe z1Y?_d%jX_+32_ViO%;@pWMo8R$KLDUDG_j#S(+9#Ubge*P~s~UQv09#Ev5OFsX)LX#Wa2=zL5dad)5Y(+3^q z?5;$1RK|Glmdy(ijTD+Ivc}D2L~B>%u* zJP*=&B$KN6g|PyTr1N5d#3KseV?OY7FvBwl`WX*xeG$P7`~u0Sz7tlQv0<|tL1G+8 zMg-JU$P_RgW)r=Pcyl?E(Qg)Jxf#KiP07fC8M{Ro{}u!{^GG`H70A5^?&nB4KO~S3 zA@~iBr1R4P`80y`)VesoAdq-SJSamV7#&7~QOy4=0G`bd58V;5?=a~oC4vK0Z{tAo zD#iJI8DTu*VMOw)prEQ8K9ar9q*_p-0SZb<$&I`@EBz#!B&PBpw+uXFCY1pbJ~CWY zS4=F4ow*nVYYak(<>?}YXHe|2FkXP?qp9i@^JtuW2YJC#;Uahg1!;p1Lx18t6P(2r zA3z8yNveVq1S9IPW(D(sM&X=yfI8tRN1k&g*kT{pfLcH~r;40Yd9*oeD}c*5g3j2f z{6=#u!e;#@>A6e-p1NFfU87u_A{Qr*#wp;K5tM);&CIFKCq6=50|kaP}&si`11 z3SsJbs7;7PSX}Y&6T;EJ(cNt71MzS?eRxB5A`Bd^^dy(yi70+xKrFSfNYTf6dZk)w z*nr{Bd>KTz65SXk?_1BW;bNyF7U`tvVbh{--Pej(^q=%Jndty$IU2Do{K{lrE$J+$ z=-8BSX{1jP>jlS8Lt-ZayOwgGv-A_tHS%k4&gsB*ayp!)$64g+UTICQRM#ur%&qWv z2xlTD>zj+5aHd*Eg%NlJ7cW&>D&AMXi2UUh{9Z@cT$!nuTm0=6-%{*#;QR+sVABc@ zzwj*r{Be9_NR1U^bl!|Dg!l!o5)+P}y9Kfv;31Br^VbFP>j+Y>E6(2+$nOIT6oGsV zrKX=>6t(6>fPrL05UyH>!)YUCm`XJB&zEOzfwCo?bx6hOOglY!8$G}t%0slw6~Ia=vWnxagIR+Y3ERkUdSr ztct^-DtIC^0++?Ik}iR-0*W8Vc8-gT0`LhisuCGN7*&ai#K|&MRjf9iIx>P{r3uQo zIA!965EtC#iAqYmGU)Q^uuSDDJ3= z5sKhfU+F?NMe!^L8gvEiRc15)*W2~o7YV{=*?b0|JwIw}|%612S z>+rCKf5%K-14j};9M#G$BJl0dOOY7gqL+RQq1_bc^>4;Xv155G%?YS+rdZ#;u@sH> zwU9b-4novR1$g7P6x*J zy+py)jNgY4SJSt>Zx%(;F@+c>Uysl?@!K4JZ%!h_!D&Y*2nEsxY>vq(@f}g(JK_kS zNATM$-ck(Qol>V9Pn5C$1*iwVb@a}dd242(!eR(UFnIc#{Re&qGxH9TM1=#ZDU6LG zbNm}Woe*Df61z7N1rBaAdQ}*+QXdiRa;P8NW}~0PkfO>T&-XFX3An^#X%h2*pFrPs zMknEdjC~r=e-eqfZs6(YdF4Ls$i2+@>#bI=YZM1h0*&r})``s!HFMj@O`C!CgH5Qf>PBY^Nt zgOC?V;6@obA-Ci7ZGdR3$qf{+QH4&%8_LV30-|x*W@DoWJ(f3wmz@Ok6^i8>HRw^J zr~qcH0`ygi(l<)bBYD$2<8wgw@<_f>fgZ=(oteb%6vc(xC_ty=D$H69=us1;|22G_ zjMu#ks#P?A)|(XnJMcOc&o+a)6JEJQb9ef>ocS;)sWsR6`Cs4G`EmWPtOxWCem(lT zFnT0!f9Cxa(C_fu8}OorPQs#bSCem~%!<&y(|}%JsH(xIM{G4Pv@x($g64I)f!T^U z33Y$uYd*{l%%mouW$iF9v}3Fc?C32%Of4`!XKYNafuY?)6*O97@A6@e0t1H`m*>O0 zg}DWadfYz@%#KK4ZbDtAX%&~5c9B%Sg|>^jFoBtmF}4FWslbQn0j3)DCdG$20L&A> zkex)TgP6Bj@yTIok~xOat7)Usc zIzBET?M`EdgwwC}VUW86&DnIS5u65wXO0zE5+OGem>ggpLzOD>VO+p`2F!1Km?hX# z0D8~7)rUdpMLd9Io{>Hb>>LT{X8qp4(8dpukR`)cI`Y*XN(VgH0#p>r3S87t1%4$TuvO zE6QT!!a}*MaHLXJSc2bT{9MZXRT=nY;+KVAHhwwy<>EIRzd88j;Wt+WO$MDZ>6AsM zY&zx8DOa&N?64#1i-bXr{In!lB{@>VXDvHfmt=#(3E>sEx)46z5MIUVB7|4?irzv= z!{qcGkV9wr9$bCLYtt0W4$<_qu~eJ7Pd*@}+SPs10m(il!ag=KpJJp`rtV`0kd_Hf ze?aJ5I7QjVMu+G0mviKlU>}^+oW!^avu#w~v$UDRA*|wiIrL02fb1on*EwYRniK zGtrdU5^RaKBwMm=gl(j4lx;K$@ZvYS^T?TcyM;6H=2k*2qCIc;!NadbSeQdr5HUJh z^#fC*(W!{8j@}ZUh2hDS=oWR%?|{Kj;413aa5Pcnq>oH61^rF(>o`sLD^9$dW6LD= zI=19Q4qAI${Zw?~^r|Wl{Q7#9%qGin&08BJ4WCF>@p#q8ENPlWIsQhJe0`@aa^B%l zDN)M2r4)*O)$Z8fde4_74ZbML5nBh5W%WD0EPutb)cjeFY&EisnL=4&)F53;TGHqa z_M+h(DfoL*{7rx62+h0|ry0K?@QKAW+|$r$F! z5l22%C3y^Yn@2xYlcw1nTP&6_tP#nHLKVX=InZ<0g4 z8tU3tXE@}qer9)AJ&ksU<=zia+vIz%vOCnZmpSAouCzPkx|^T8%7{(v*<4;uSTFOpQp8bSOq*x-Yx4fstSS*L1f|b@({vb-W zcDRL+lGpo;Gn*=B7?vIJJfP76ig~U0Z#x`YzHhO0-e_6B zDSnr2Z$-yZi@o#4C`B86mzUCOwHDjqwKi27W7()HSxy zrb@f4u+8ebmcaO18x(2vW`}%Dw+SfS4Pf(+>-+7F63gJP7*(M*7xl+VG= zW+~WphAfY~A9jit#d0s%Y4mN^zip9$!Yu{0L-A_ou83zHJ= zyyNl)>bx^#mMY6*zVx7q&WYEGT@R8UD3;OgJECM^$GFXQ$1Rq14L5^5wu2BKKM)!H zW1tybDYGnD9{azCRViiy&*-m*$pbWt!~IPZ{pQ?EBRhwjxDm#*Z0h{}YHCZfA40yB zlrPOpxiR_F^lZkQz-zqohsaVDx*ex1Em32j&t^-@?2o_=8$g3^EJ9T4$KNqfedfw+ zmMl-%{(ve)3+A665{4T?hSMuIw74yLI+Q87|K?llj&{phs!a@AAR<#tp?Rjxf`Mk5 zDYIp=JoWE~ppVG(Z+fQAP7mty6urFCuY)&kv^1Af>mV%GgAlnPpPmoQav68Mph$|y zXa5TdEEmh$21_%yoZyQ&zTiuf`~mP)WI40T&vz&18zuO*OrXeAQcZR$IZQvFZ7#er9cE!ulucgWjr zCbw(fH1=y>L153viu8Ul+Fr$?y!TZ-#*Ann(trQa?pSN7fA5cwcLfzIt!QwI@Fk72 zStMO%qh&egLC9H9?Hl{}8SO|oH@G3)$|tm?2j9F8dR+34vOo3*HNo7?Vav#i?`XNf8*zWrNv zhu2bd*EI&vWT`s*Cj+QAfNgF{kobb#u{w?xefW@w7Ie6Y_=?WiOf*Smc3GbL9Z0WN z<0B-!C3?)Q*W}wBw_3cs1>8>N;d{)Jn-8d8f(dVu<@sNENR~!T;%(Bwhrk)Vl6}lQ zn(Tg5+iYnqYQy_suWK7}cR94>-SyKgn;TkNN5T^K{kKE5PC`r7vg*XWAJ`r1zIFxF z;*I_;8u(IslJ>?xODRKU^JIBp$Ahxu5M}i5!=j9wygdyqW=w{Mgz z5xiWse}WOd-GRZ!$jiX!*PP`jgsjkc>O!2j_Pixcc?BTv0eNfA*EP@PW4qxqrLuhO zU)!ZvVf{bqjp$j5#WWf2T4Nn_SU$zmvIcdW9kh#n8M?&1n!Es{R~ zJ&o39$KHh#A9(Sh>3~Lgr81i)%h$czF4=`vzagzgPr>A10|}-|meI%_b0}Wqs)UjE zYsRpjtEnrOgaP}yF;s#3xMY~!2+95fLQT3CC*Dp^o`n!!xILS}+hw*umaqRsyA&ZL zdzIT;9PSrt9i?(kT) zjQI`(-^5kGA}$}xPQTW#0#IiY{3>qJ8(wOcw3*yBPm$nbZuJRf@e7u8%BBjz6Wi^M zRsxX0^*no{g_!<1vgfPTXUo~ihchcqwM(+d`6t|DqsDkKnu(GpCW7}J#G6K(T(!#{ z25(+F2Gr{>lUa@|-}sCu6Xgg0WTRek*pgr0&}t}`kQ${3i(*)oILTpKad3T{FY*N= zG6Btfqvh73t&rnxE)mwgnFYekD8h-W%*{TH+=qKNUnf7C1xjQVC(A3JXqRl!-1d(f zwikt;bSg^GLldKPhe(^F=bdLYCbRwJUa+8}AT|*JXFucAQ$48YPR_6sE$cY?rr+ zb_;WhTO1peTP;#U3bpnal0Uv3x#MX#co~f-sbQM+dz`Y+OG6Hv1~eJJLS{*_{Kc=L z7CAAmF;ex^cn_jjIyaSDj`xszqjBLuaKN{av3l`IaMSCM;_S+rqKbwZ<=dn|jmw z&Zh`vcQiS_4I%lwh3@Kbak=>iBrfJHvoT8kUr4LZTmDMYV#1f=?)Fc<20G)(lvbEaueBzR`+*Oph`XWhjh3vb+(Pe;PMWr1{m9o#_fy}8 zL7ZMAOLzvvk_K^NweT#ffum@wU}3$ZjH$}rQG8V=@kQFe&Q-F|SyI=y*5h?vOPfQ^ z%$%8-ljp2$@;WOjm*kz>esFw`$Cah4ZeGdXs&8_h)4TZo)cl=9H{T@fJbBP&3+Ks# z?-OyJJot_q=gEU_)^nab#HLkE&KWbjo|-zZr@GbYE~76L)Xvkd6%AGO^#Sn})m4p% z<`+G7P*S+sJuC5ejJtSgr8~2%w7ha=Q(G%?!V?$x9E)?}dG3%X*sQE?T+6*DBO|*u zduCmA?L=P|_}p}@(_L6mnO}H~yP|l7YhFe>zFis=zu1*u78vWnUW6N+ZZ}?u#OECN zK9G2R4STyGWewle6z{X*m4?P<=u_R)(0~Ljm$UP$I!I5|vv5}7^y$vRriNy0JUJ9q zRBU(QoZ)fKD5Y|4Y;sq(0H8oyBR-L$BkLOJBS|^|J`w9~Xrk}>2t@0uswzFo+tkwH zt`}N#k2mE6Y82552{+ zvZSu1m9Ms+13Owq;vZ_E0Xo(y&*5go5J*h-C$RM+E&mT|8HgM&6#&2aEDFHg)>>CT z?1dn5y;Kl-LDVlS5dK^*6@*?84NdDk!&(`5hL_B*o1cG7c3AB%a=cUkriN%( z?N4pc%uD9i&0oEy$~&y)=NVoyzi$4j)~34f<{#h#Mgtuh2aLXXuGJWW(}!8{sM(Ct zHMd-p5qZ!f3+FJK2s1hHPpsBBXB0Wz6*p8=x|X;LmKT>4QATxDtKBVa&COm&bfm&*R4m3?({ zb6sOy>#&r4n6A;t{*nh=G!GcI;tv>h@LVsI`b8}DR*W6nnom>nFVMn2-W$<#y)@DC zEi-Iz*L&7`>fINoBGxwruc;pXdmcufmzrX|DQ<6R zZE8Es4ZsVz`l080srp^C>Q{aGw)X;!ghY;)s-9l;+8WnXHP+O7YTTaoYELu0I2wLR zdVz`~T>h5|M=u-<*&Ca}7srKc7Dcv~TE&ajDmHi;s@I(6CftQAcs<`sC4bRMzP-A> zsl|hL^oPIJ`?J1O{uizM1HK-PCqw<;UH3g2dLbKtfb56a4ScHlo+%BpgT$cj2m3jj z?D_xt9buy=HhAk=`Qu_@Mm7Y83R(+2g5&VSGfy=ku4^ zgiJgoVzdc07rRl=1-R5IT+CL1Zd;A zR(UtFA_Rc+ztO^YL2;DVgU7uZ@~AfZw%TH1t1ZIeWf*rYwh+S}Xf4&=y5`mzlBPmxn*O*5qyFk=|DKdXKjSt2d1HC&h<2TGpVQZmn8{ka6AEKyZGh)4PF{ zWjR|iSbi3T^Rqby=O#8&Y?D^C3hn)R1FH2_HFyl5uCdlfMjMYAct~Xg8>*_!RLyOx z8o{82&BTKUdIma6KSHq5_hb{4-d4Ud8P_MZfu+{4)Yfy`F-mNq#^$>-@XMqh5AaYH zf!TD*!HFOOD4dJmZ2ac1nT;Nj7{!#QhgY?<%=HJsPLKednQ0vM$g!f$uhF{Hj#{3dZs1slxEm zEo7z&5!*dGl>HoCa8trLp>oX$7jN z$jsD>)1*^oW@xUNnW5Qch8DIvGc#1xOryZfd1Qs^pBd^2?#!$(x@CoyX=YX!J+ead z2*qTF*d#lfYU`k$NA|y{7;OAd>*WkO7yVT{Hj@XSBfp|87_8WoUVp7DSnd!DA{*XB zn94HL@?m@+Op%4wldLePP+r-guALp~O`!$rM#%=to*gPzcBnqtp=QVqEz#^y>9a$n z&j}SZC)B2Sp}g`!dCd*A#N1H!b3@tB4OM$?sM>Qw)t(!w_S{fW=Z1=!nGq^jW=3d% zWM+hlmYESMTV_V6aGB^Bg9|tl{p4Wlh3PH75Wb-~g~}6Zt58#gYga?97p4Ub)8K`+ zZtko(gVtWWUpMIF`s-nXPA^_>3bA{bA`a7)gy|u2LQ5aG zPe=?peb`(2gXX5+j20H0iFwxSL9;S$Zw8mf+(C0R-7_0B4`Wg9Jl)S=qp#PWr#Sj* z?|E`*Z#NbS2hGU5+Qjf(ZZ^LjzYX}U!YtlHS4`bEAiN6G_f?p_*CV_ExK)_OdkBxI z{054fgI^xvi5_&T<|3ZxXiZ=Pi18h7IssJ=@(oCa?|FlU($X5i24a9(iVh;1VFNN+ zp{cLh$h__DRc*Dk9xrRn#5V=S?(;5sbc5B=M)O2a*I3ieyhM)u=z%dpSxjtlpPE{L zT~vHPNnJx7=fqn`hFylPbrtF~%k#@CGu`E$YERvIPZ3|5FycirK~P*-$am{!0xWE( z(L=>pHq?Vf9u8C%FUfHiVjmap!uqP!jDw3jtprrGR<*XZ2vmiqwXms;9wZkqvE;Os zumy?FnJp?SE_Gi=H?2yVHZVW5xNh|t0s6`G{IPX=u^Zf7?XAU)trecemb%uu^>wWq z8IRGa3QMkWL#jfoGp$|d^{iurSX@zDhPO9qJ3raD+C ztF6N7S`90rGH7UVQ%QPrxJBH8u+3XV&p|O)J9;SK@XZ4Q#q|lKqWl7As+;f?f~I;# zi%+bnww5w$YNT@o#Hy;tmkEe3+z4-z8aS_~s>V$NAKiZ{=!r;kxSh>!^sLU#a@S|z zpUtnTsWAXIxx5+90C7v(s(^SiOz{nE^}hI;`an21p7^)b)U6i@YOn$sfPh5A!B0UV z5(Sp;C`l%lnGhIQ0a0zhE%hcDRzYSHTxEb6?QZ-Nh*dEm0mN@^Ygyx_W0 zo12>5RKYodOeF#a3DtjrLB%FoPC{3rpeqs3l`20z=Fqgd%>!gGY>K4ZFvy2IZfc1r zsGER-o(wm&L!2PfO-+$OfQ$?RJ-7h`Xo?I1ot8N0K_Wmq#0ki*I)_Z;B7z&T{W5^S z$N~gL79cRP0D+MO2#hR1U}Qn=re~4m&mz~KMYf+H+fOiu2=s>PdUtX8vc>!%LpV1) zA3Zu=e{o|bCMW`%n)&rjRk~-_tZHdSW9);g0>Sn`ket?_&2$H*&2$H(&2$H(&4h#b z(o#aMlgLwscvfC$X|KEG8Z+xv_*d5Y03y= zbAu%RG$gz~Bn8SntI=qtrdC#A-!i?g5`Ez<9&eMLV-S(ApTqZBXa!rR63LeEr{Ewp zjf`~R13v1)Xr{;Y&2v}b4?Q+?7vWqclA(hrs$0LXs+w-22!BHdQzQCKlQ(9XT@xb$ zb5vklRzO^K00bNR9UMaiGc-E@niBxwW{@e}Tr(7q9VX}|Lag$dp#V`ZZ#TyUh=SD( zb6kKZSplMC1&9)m0oD#pOt5Tdf&%gm$Si<6n7ae#aLiQHVWttF=O4EyKySI0-xdlw z;UiwGSl~YYUtCpFJcaSwYM|(=qxfw#5H`Sw-}VfybP$aAZO?K@z!d+I38wg$O)$m( z!UR+N8zz|Ie`|s%{tqUY;z@2gjQl?kAcrabA10X6e`10Wzg;uIh~I88!4z*d!4w~5 zf)T&#S0)(oyWRFCh;_3)2D`{8|4d8{vA7@2l;>R+d=W~1i`;E!6=X3cTKQE52In>?a@_;Cwti?AwSBZ_kI(+kTLFWSL*TC z049H(r^97{$zKf^-_PX!YQQTPGKctr~2fTw| z90V_6tm6g&a`=mYYfUihv%Sj%?*e?(1b-PYl?NTf?=i-9L<*3@(02#7haUe5;Q6L_ z^c6dLOfcHE9S8id908d8iw^LYQ}l1R8*nDzAM;odUxfDkE)#s6{@HPZ{${|Rn&P+U z-{>~t_v>H7Hei%zCv3_O%Ks_AYfLceYA4e8;!$@xp`#D}2(T$X1@*@;C+VX=pROD~ zy^;mkWr7z1Mj7#g=vM$n9r3}9fKB#OwxRr=r&v+`3T!F*6CH*=qJ0-IgFNEU>+=x9 z%9DZo6}0W5Jr?<^@Ri|F=M(6(= zVE7n6i2u(4|HTCV3Gm-c@V`)>WIwE-@9DOiU?<=>6Pyh=*#x7!y2qGc)U9r$;Ro{9 z>H$wS!M6b}Fv0MpZc}+{4*|a36c2lLSDRq8AKmZ)eh~k+0k1c~7<+YZ^urd|tb4Nw z9s#(+56h@e-JK@52=Hz{Y?%g_+CVyxpJg84I|az$GQfA6V94726%!2Ex*zbvGU{hH zbmRx|L*?lHh6%nG@V87b!rk97!9N82gb98f@DEJzp8!*vO9%MNHv>i*eo%h!$L^o{ zVR;MSQ-0VQ1NcP~JP9y-h#yFAodfty6MPNeUzuPx;CD?h+SBeo`eB*M`_F#Zdb=Lh z`&SkIEXIEdmtTcH?=@&Bf0X}T*o+^5sXpxmPah0f_kPU}TYnAsunGPfV3YlA=vMb0 z@yFW|0He+02l!Kc*lV(vwHx0L`k*~bQZ?1hi|;=O?1@xz)Eu&I99 zcIt7uJ#5fl9RB*g?*qaJ`)D_ye>C?uy8w^WlR$pEs)tSX72|V}-d>3D`c^-^iuPdl zc0Ww^*lqG>vd3DmJddx%A)C1Dwfv_)z}Dw}JDP?R*6&;6b|GxyAy$GMBx!5Hy}(?eP64;LSu+k5qa#7CzYPvyr{Q+q$3 zGiHMSE6zP$U+eo{{9AFy@w((6st4bh@+JRJ{ZHDny0^Z{^0>UpnK8TZBl&_nUm4a) z)Bl}&O?f?8*6xeIp1oBi{*a?L-a5P89Vu@x{Vj*lDI?bxsBG$6v&-n4S&#Rq4gE2= z3qE9cKYY~i_j;}6RgEIPUA(l&ez{UL-IaCKOxJitK#~qub}+4-sh`{cR9qL)f-}V@8kcA zbFHsB%oSQ+&GA}}7zg?D z)3_u~bG|fT`ZLn6g8dlP@@FS}J?wp`y6b<-^WaL(;Gg+ivc~0nTf&PIUJCpE)AE-m z?B*`tXR1G#@JhIbGt}R~rCVPHV2@vG*KqCnv`qO~u1lO1$}e&4`Y`Bj?2R=18rQB* zgT9UH(>V+J{0^?qFuap%*XKds$Mul0{@<6?U?)bpzmIXL;b90K7Tx0^{3$})IU@CRrqn!-gn@2a6i>|!%yL^qH?$9kIl-=hdzJoR{lft z$8zBzjJ*}lQQjQoqUMhmD&zZ=tnt~G%Dlh-o>-=QHQa=LrSe?Z#qell;?w7kQ#j3Eqev z>cbyyy(sJ!eQ1C7FN@GKWx{k-yW!!m8$&@q2lo3VwZ8~nZ}ge)+lFt3d58S@#qbA) z?`Quq)$m#vpXc@);7bhSpNMzDZyEgn+-3MX_(Q|TU}7kgUnCx6|0M5IWLR_@HadMR z`KIcOeaSbKi5JN)mDw*zKB;^G?B)~oUy*l{d{TAh*VV&}el6T)nE6xkN438NzRu{k z!}AO;gYPuF629B;I`|&LFTnIc-ag_{@&PI8`#84 z@fY|-qyGhO?B#mmQSwD8zrF^3!|2WMn}%Cp)BpA3V86fB=b6tWUsRq3^A4eX^~9^> zi>luMe`0j!?|p`sz@Hh$my$2)^Ne@N7nM6)aRMoC7)ErACgZhQ?}%j$~)l0rabya@=4X1?|i;7QTYf=o3aVY zzrijZ$139=*{=&Xmchhu@K<9cOqn?s;iHC6hAA`G8UK=>YI*0u_&C?`pX@(XpAA2T z+@ictS^KwUYgX33 z&bPP3c=X>lb$u$~AIaZFh(0f2){jWPFX7b*Ka()yEqdPhYp-jc*0(d^{Rw}a@UIE~ z8*@`d!o-HHuZi&&acjbD3C~FQ#)OHdsJ!I~GdDy!b9cnVQ^Z>mW;{mv#|a;VyK$%P z*P4ESdkp^!V-w<~c_4fQEJ!^0+zKDGbIYCi1?z&>3jA*6cDtNI7i5_`eNN=G_$aiv z=j;*K+4jo?vGenQ-V1h>i5>6KT+E*fn{gV!y|Vm%VG8ek>NvSqXy(_I#}LdIFFv0N zb@Q(NK0p3&?Q-XEPR6ruqkGQTox~ZAV8?h1cD_jLoD?1I#u!fbOB>ty@#Xmo2OOb1 z#;d;`ApUi}_Wt!o#*T4pD=H47=v#x4{<<=!bGlzW8alFU95EOjPM^hT?4}p9Y_eZ> zjiu9XitQf$mi}POMu)Rw9N6-n-$a_ZG_n$XS!}m?BrdZBKJLV_*9z8vz9;}(s;oi54v)6wG{uweG2Tpqw{s)3Y$;|)& literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Exe/EXT_INT_1PORT.s19 b/4_EXT_INT_1PORT/user/Debug/Exe/EXT_INT_1PORT.s19 new file mode 100644 index 0000000..37677f8 --- /dev/null +++ b/4_EXT_INT_1PORT/user/Debug/Exe/EXT_INT_1PORT.s19 @@ -0,0 +1,321 @@ +S01400004558545F494E545F31504F52542E733139D0 +S11380008200936B820093CE820093CE820093CE43 +S1138010820093CE820092B4820093CE8200928F2B +S1138020820093CE820093CE820093CE820093CEC0 +S1138030820093CE820093CE820093CE820093CEB0 +S1138040820093CE820093CE820093CE820093CEA0 +S113805082008DF0820093CE820093CE820093CE74 +S1138060820093CE820093CE820093CE820093CE80 +S1138070820093CE820093CE820093CE820093CE70 +S1138080C6523181CD8CEA3B000ABF08B70A3F01D2 +S11380903F00BE08A301002731BE08A30277272AA8 +S11380A0BE08A302662723BE08A30205271CBE0838 +S11380B0A302442715BE08A30346270EAE00D8BF6B +S11380C0025FBF00AE8FF8CD88173D0A2714B60AA9 +S11380D0A101270EAE00D9BF025FBF00AE8FF8CD5D +S11380E08817BE084F0141B70141B609A40F5F5C70 +S11380F0CD921041B700413D0A272AB601A10126BD +S11381000AB600CA5234C752342048B601A1022626 +S11381100AB600CA5235C752352038B600CA52379B +S1138120C75237202EB601A101260C3300B600C475 +S11381305234C75234201CB601A102260C3300B6B7 +S113814000C45235C75235200A3300B600C4523732 +S1138150C7523732000ACC8D7D4D2705721B52342D +S113816081721A523481CD8D1BCD8D20883B000441 +S11381703B00053B00063B00075204CD8DD6AE0004 +S1138180001F01AE00001F035FBF0EBF0CBE08A39B +S113819000092605BE0AA38969250EAE0061BF0247 +S11381A05FBF00AE8FF8CD88170D0927147B09A196 +S11381B010270EAE0062BF025FBF00AE8FF8CD88FD +S11381C0170D0827207B08A110271A7B08A1202758 +S11381D0147B08A130270EAE0063BF025FBF00AE60 +S11381E08FF8CD88170D07271A7B07A10427147B66 +S11381F007A106270EAE0064BF025FBF00AE8FF872 +S1138200CD88177B05A108273E7B05A14027387B35 +S113821005A10427327B05A180272C7B05A10C270F +S1138220267B05A10C27207B05A144271A7B05A1E9 +S1138230C027147B05A188270EAE0065BF025FBF6F +S113824000AE8FF8CD88177B06A488A18827187BF9 +S113825006A444A14427107B06A422A12227087B5C +S113826006A411A111260EAE0066BF025FBF00AEC8 +S11382708FF8CD8817721952347B09CA5234C75209 +S113828034C65236A4CFC752367B08CA5236C752B8 +S113829036C65234A4F9C752347B07CA5234C75283 +S11382A034C652326B0135005232C65233A40FC762 +S11382B05233C65233A4F0C75233CD8D95CD8CC002 +S11382C004CD8DE3CD869FCD8DC9CD8C48CD8FBA9D +S11382D001CD8D95CD8CC004CD8DD6CD869FCD8B13 +S11382E0B600000064CD8DBCCD8C48CD8DE3CD8F20 +S11382F08201CD8BB600000064CD8DAFCD8DA2CDB3 +S11383008B9BCD8CC004CD8C4500000064B603A4C7 +S11383100FCA5233C752331E03CD92189FA4F0CA1A +S11383205233C752331E039FCA5232C75232C65207 +S113833035A4F3C75235C65236A4F8C752367B0665 +S1138340A407CA5236C752367B05A404A1002706E7 +S1138350721652352004721752357B05A408A10009 +S11383602706721452352004721552357B06A480F8 +S1138370A100270672175236200A7B06A408CA52A7 +S113838036C752365B09CC8D76C65230B700C6521A +S113839031350052333500523235005234350052F3 +S11383A035350052363500523735005238350052D3 +S11383B0393500523A813B0008B708B608A10127B5 +S11383C00EAE015BBF025FBF00AE90B0CD88173325 +S11383D008B608C75344320008813B0008B7083F79 +S11383E000B608A101270EAE0144BF025FBF00AE74 +S11383F090B0CD8817B608C45344A10027063501B0 +S1138400000020023F00B60032000881C7534681B5 +S11384103B0008B7083D082714B608A101270EAE93 +S11384200054BF025FBF00AE90B0CD88173D08274F +S1138430067210534020047211534032000881CD5B +S11384408CEAB7094500083D092738B609A1012778 +S113845032B609A102272CB609A1032726B609A121 +S1138460042720B609A105271AB609A1062714B6C0 +S113847009A107270EAE0044BF025FBF00AE90B053 +S1138480CD8817B609C75347B608C75348CC8D7D66 +S113849043F4F781FAF781CD8D1BBF08B70A450075 +S11384A00B3D0B2750B60BA140274AB60BA1202742 +S11384B044B60BA160273EB60BA1A02738B60BA18A +S11384C0E02732B60BA180272CB60BA1C02726B615 +S11384D00BA1B02720B60BA1F0271AB60BA1902749 +S11384E014B60BA1D0270EAE004DBF025FBF00AE85 +S11384F09073CD88173D0A260EAE004EBF025FBFB3 +S113850000AE9073CD8817BE081C0004B60A43F46D +S1138510BE081C0004F7B60BA480A100272BB60BE1 +S1138520A410A100270AB60A92CA0892C708200913 +S1138530B60A4392C40892C708BE081C0002B60AD1 +S1138540FABE081C0002F7200FBE081C0002B60A7F +S113855043F4BE081C0002F7B60BA440A100271088 +S1138560BE081C0003B60AFABE081C0003F7200F5D +S1138570BE081C0003B60A43F4BE081C0003F7B689 +S11385800BA420A1002711BE081C0004B60AFABEE1 +S1138590081C0004F7CC8D79BE081C0004330AB60D +S11385A00AF4BE081C0004F7CC8D794FF79093723F +S11385B0A900024F90F7909372A900034F90F71C03 +S11385C000044FF781CD8CEAB7084500093D082720 +S11385D026B608A1012720B608A102271AB608A1C9 +S11385E0032714B608A104270EAE0049BF025FBFDB +S11385F000AE9036CD88173D092720B609A1012782 +S11386001AB609A1022714B609A103270EAE004A1F +S1138610BF025FBF00AE9036CD8817B6084D270F56 +S11386204A271F4A27314A27444A2757CC8D7DC6FB +S113863050A0A4FCC750A0B609CA50A0C750A0CCF3 +S11386408D7DC650A0A4F3C750A0B6094848CA50AF +S1138650A0C750A0CC8D7DC650A0A4CFC750A0B653 +S1138660094EA4F0CA50A0C750A0CC8D7DC650A01E +S1138670A43FC750A0B609CD93BBCA50A0C750A011 +S1138680CC8D7DC650A1A4FCC750A1B609CA50A187 +S1138690C750A1CC8D7D350050A0350050A1815F1D +S11386A0BF02BF0035E100063F053F04C650C3B713 +S11386B006B606A1E1262AC650C6A418B705B60513 +S11386C0444444B7055F41B60541D693C6B7045F39 +S11386D041B60441BF065FBF04CD8C4000F42400C2 +S11386E081B606A1D2260AAEF400BF025F5CBF00C9 +S11386F081AE2400BF02AE00F4BF00813B0008B786 +S1138700083D082720B608A108271AB608A1102793 +S113871014B608A118270EAE01A2BF025FBF00AEB7 +S113872090EDCD8817C650C6A4E7C750C6B608CA90 +S113873050C6C750C632000881CD8CEAB708450040 +S1138740093D092714B609A101270EAE010ABF028B +S11387505FBF00AE90EDCD88173D08275CB608A139 +S1138760012756B608A1032750B608A103274AB625 +S113877008A1032744B608A104273EB608A105278B +S113878038B608A1052732B608A104272CB608A1DB +S1138790062726B608A1072720B608A117271AB668 +S11387A008A1132714B608A112270EAE010BBF02AD +S11387B05FBF00AE90EDCD8817B608A410A10026C7 +S11387C02B3D092713B608A40F5F5CCD92109FCAF6 +S11387D050C7C750C7CC8D7DB608A40F5F5CCD923F +S11387E0109F43C450C7C750C7CC8D7D3D09271384 +S11387F0B608A40F5F5CCD92109FCA50CAC750CA76 +S1138800CC8D7DB608A40F5F5CCD92109F43C450FD +S1138810CAC750CACC8D7D20FECD8CEABF08350175 +S11388200000A604CD873935FA0000A606CD843FA2 +S11388304FCD840CA601CD83B6A601CD8410200EA5 +S1138840A601CD83DAA10027F7A601CD83B6BE0821 +S11388509093905A90BF085D26E64FCD84103F0058 +S1138860A604CD8739CC8D7DCD8389350C000735A1 +S11388708000063F053F044FAE2580BF025FBF0066 +S1138880CD8166A601AE0205CD8084A601CD8159B5 +S11388909A81AE500ACD85ABAE5000CD85AB356024 +S11388A00000A620AE500ACD8497AE5000CD85AB13 +S11388B035600000A608AE5000CD8497CD8696356D +S11388C0010000A602CD85C5350100004FCD85C548 +S11388D09A81AE500FCD85AB35E00000A604AE50B2 +S11388E00FCD849735E00000A608AE500FCD8497D5 +S11388F035E00000A610AE500FCC84974FCC86FC18 +S1138900C6002AA1002713CE0016CD8819A604AEEE +S1138910500FCD84903500002A81C6002BA100277A +S113892012CE0016CD8819A608AE500FCD8490350E +S113893000002B81CD88FCCD88D2CD8892CD88686B +S1138940CD890020FBA610AE500FCC8490A610AEAB +S1138950500FCC8494CD8CEA3B000ABF083F0A2018 +S11389601D5F41B60A4172BB0008F6CD93CAAE0042 +S113897080CD8EE4A10027F6B60AAB01B70A5F41A9 +S1138980B60A4172BB00087D26D732000ACC8D7D21 +S11389902006AE0020CD9162AE0080CD8EE4A10011 +S11389A027F0CC80803F033F02CD8D1B899089CD79 +S11389B08CE0CD8CE5520C1E0D2705160D5F90FF43 +S11389C01E131F01F65F97BF001E015C90BE00726C +S11389D0A9FFF790A3000525E9A12027E5A12D27EC +S11389E004A12B26066B041F012004A62B6B041E76 +S11389F00FA300002E03CC8AD1A300012603CC8A46 +S1138A00D1A300252F03CC8AD11E015C5CBF001EBC +S1138A10015C160F90A300012F1790A300102635B8 +S1138A20160190F6A130262DF6AA20A1782626203C +S1138A3019160190F6A1302705AE000A2015F6AAF2 +S1138A4020A178260BAE00101F0FBE001F012005C9 +S1138A50AE00081F0F1E011F0720035C1F011E012B +S1138A60F6A13027F65FBF0ABF081E011F05203795 +S1138A70CD8FD909909FAE924541B70041B0006BAC +S1138A80035F97BF025FBF00CD8D111E13CD8CD540 +S1138A90CD8DAFCD8D95CD8BC2CD8D4DCD8B80CD74 +S1138AA08DD61E015C1F011E01F6905F9097931CEA +S1138AB0FFBFA3001A240472A900201E0FBF00AE3A +S1138AC09245CD93429093905D26A51E07130126EF +S1138AD00F1E1127031613FF5FBF02BF00CC8B6B61 +S1138AE016051E0190BF0072B00000160F90D692BA +S1138AF06A905F909790BF0072B00000A300002FAF +S1138B0051A300012E347B035F97BF065FBF04CDE2 +S1138B108D95CD8B9BCD8DAFCD8D95CD8CB5251AF7 +S1138B201E0FCD8CD5CD8D11CD8D88CD8D4DCD8C99 +S1138B3048CD8F9E09CD8CB52718AE0022CF0026D4 +S1138B401E0D2706160D5F5C90FF5F5ABF0ABF0813 +S1138B50200F7B04A12D2609CD8D95CD8B70CD8D55 +S1138B60D61E1127031601FFCD8D955B14CC8D798C +S1138B70BE005089BE0250BF028527015ABF008142 +S1138B80AE0004B603EB03B703B602E902B702B6BC +S1138B9001E901B701B600F9B70081AE0004B603DC +S1138BA0E003B703B602E202B702B601E201B7017D +S1138BB0B600F2B70081CD91E789FEBF0485EE02CD +S1138BC0BF06B600BE06429FB700B601BE05429F6F +S1138BD0BB00B700B602BE04429FBB00B700B60399 +S1138BE0BE03429FBB00B700B601BE06423F0172FE +S1138BF0BB0000BF00B602BE054272BB0000BF004E +S1138C00B603BE044272BB0000BF00B602BE0642F9 +S1138C103F0272BB0001BF0124023C00B603BE0543 +S1138C204272BB0001BF0124023C00B603BE0642EF +S1138C303F0372BB0002BF022405BE005CBF00817B +S1138C40CD91CD2003CD91DABE00261E90BE042620 +S1138C500CBE0290BE0665BF0290BF0681BF0445EC +S1138C600206450307BF00BF0281A6203D00260D72 +S1138C70BE01BF004503023F033A03A0085F905FB3 +S1138C80992017905959B304260390B306250B7203 +S1138C90B2000624015A72B00004390339023901C2 +S1138CA039004A2ADEBF0490BF06BE0053BF00BE8F +S1138CB00253BF0281BE00B3042604BE02B3068180 +S1138CC0CD91C6F6AE00004D270A6803690269011A +S1138CD0794A26F681BF025F3D022A0153BF008113 +S1138CE088A600200A88A602200588A608200088F5 +S1138CF07B02887B02891E061F045F97FE1F068580 +S1138D008481891E05BF0820001E031F05855B02A0 +S1138D108188A600200F88A604200A88A6082005BA +S1138D2088A60C200088897B04887B04891E081F80 +S1138D30045F971F08FE1F061E085C5CFE1F088563 +S1138D408481891E05BF001E07BF022021891E05DC +S1138D50BF041E07BF062016891E05BF081E07BFD5 +S1138D600A200B891E05BF0C1E07BF0E20001E0320 +S1138D701F07855B0481CD8D63CD8D5881CD8D0218 +S1138D80814502004503018145040045050145066E +S1138D900245070381450800450901450A02450BC0 +S1138DA00381450C00450D01450E02450F03814525 +S1138DB000044501054502064503078145080445AD +S1138DC00905450A06450B0781450C04450D054573 +S1138DD00E06450F078145000845010945020A456D +S1138DE0030B8145000C45010D45020E45030F811F +S1138DF08A84A4BF8886CD8D11CD8D16CD8990C768 +S1138E000028C60028A10A2703CC8ECAC600295F01 +S1138E10974FD700183500002990AE93DAAE0018AA +S1138E20CD92D95D2615A604AE500FCD8494AE9391 +S1138E3097CD89553501002ACC8EDD90AE93DCAEFA +S1138E400018CD92D95D2615A608AE500FCD849496 +S1138E50AE93A0CD89553501002BCC8EDD90AE9319 +S1138E60DEAE0018CD92D95D260BAE93A9CD8955FF +S1138E70CD894D206890AE93E0AE0018CD92D95DB7 +S1138E80260BAE93B2CD8955CD89452050AE000551 +S1138E90BF0090AE0010AE0018CD91295D263EAE05 +S1138EA00002BF0090AE001EAE0024CD91983500A4 +S1138EB00026CD937ECF002290CE0022AE03E8BFE1 +S1138EC00093CD91F2CF00162013C600295F97C6F8 +S1138ED00028D70018C60029AB01C70029CD8D4D45 +S1138EE0CD8D4280CD8CEABF084FBE08A3008027F9 +S1138EF04DBE08A300402746BE08A30020273FBE5E +S1138F0008A300102738BE08A300082731BE08A311 +S1138F100004272ABE08A300022723BE08A30001D9 +S1138F20271CBE08A301012715BE08A30210270EA3 +S1138F30AE023DBF025FBF00AE8FF8CD8817BE08FA +S1138F40A302102612B609C45237A1002705A601B0 +S1138F50CC8D7D4FCC8D7DBE08A301012612B609B0 +S1138F60C45235A1002705A601CC8D7D4FCC8D7D43 +S1138F70B609C45230A1002705A601CC8D7D4FCC83 +S1138F808D7D855C895AF65F975C5CBF009672BBE9 +S1138F90000089FEBF001E01EE02BF028581855CD0 +S1138FA0895AF65F975C5CBF049672BB000489FE25 +S1138FB0BF041E01EE02BF068581855C895AF65FF7 +S1138FC09789961C000472FB015B02908990BE0095 +S1138FD0FF90BE02EF02908581855C895AF65F9707 +S1138FE089961C000472FB015B02908990BE08FF05 +S1138FF090BE0AEF02908581453A5C53544D385C2B +S1139000345F4558545F494E545F31504F52545C5D +S1139010345F4558545F494E545F31504F52545C4D +S11390206C69625C7372635C73746D38735F7561D1 +S11390307274312E6300453A5C53544D385C345F8E +S11390404558545F494E545F31504F52545C345F1D +S11390504558545F494E545F31504F52545C6C69CB +S1139060625C7372635C73746D38735F6578746982 +S11390702E6300453A5C53544D385C345F45585474 +S11390805F494E545F31504F52545C345F455854DD +S11390905F494E545F31504F52545C6C69625C734B +S11390A072635C73746D38735F6770696F2E6300ED +S11390B0453A5C53544D385C345F4558545F494ECF +S11390C0545F31504F52545C345F4558545F494E9D +S11390D0545F31504F52545C6C69625C7372635CD0 +S11390E073746D38735F74696D342E6300453A5C34 +S11390F053544D385C345F4558545F494E545F3186 +S1139100504F52545C345F4558545F494E545F315C +S1139110504F52545C6C69625C7372635C73746D1F +S113912038735F636C6B2E630090BF0220115C90F8 +S1139130BE02905C90BF0290BE00905A90BF009017 +S1139140BE00271C92C602B705F6B704B605B104E3 +S1139150270AF6B1055F24025A815C813D0426CEBC +S11391605F81CD8CEABF08BE08A300202715BE0886 +S1139170A30210270EAE0288BF025FBF00AE8FF8B5 +S1139180CD8817BE08A30020260735DF5230CC8DCA +S11391907D72195237CC8D7DBF0290BF04BE00CDC5 +S11391A08D81200E92C70090BE04905C90BF04CDC8 +S11391B0938D5D270E92C60426EA4F92C700CD9385 +S11391C08D26F7BE02811E035C1F035A811603938A +S11391D01C0004511703CD8F92811603931C0004C5 +S11391E0511703CD8FAE811E031C00041F031D0005 +S11391F0048188895EB60142891E03B6004272FB6F +S1139200014F02891E05B6014272FB015B0684818F +S11392104D2704584A26FC81545454548189FE90A5 +S113922093855C5C905D271C89FEBF00855C5C892E +S1139230FEBF02855C5C515A92D60092D7025A2A2C +S1139240F75120D9813031323334353637383961EA +S113925062636465666768696A6B6C6D6E6F707172 +S113926072737475767778797A0000002115110E7F +S11392700D0C0B0B0A0A0909090909080808080852 +S11392800808070707070707070707070707078AE5 +S113929084A4BF8886CD8D11CD8D16A604AE500F43 +S11392A0CD8494AE9397CD89553501002ACD8D4D4B +S11392B0CD8D42808A84A4BF8886CD8D11CD8D1634 +S11392C0A608AE500FCD8494AE93A0CD8955350138 +S11392D0002BCD8D4DCD8D428020035C905C90F6AB +S11392E0B701F6B700B601B10026063D0026EC5FD3 +S11392F081F6B1015F24025A815C81930D00140050 +S1139300180000921D000893E30010000089FE90ED +S113931093855C5C905D271289FEBF00855C5C517F +S11393205A926F005A2AFA5120E38190AE92FB20A0 +S11393300A931C000290FE90FD909390A3930D2637 +S1139340F081909F20065C905A90BF0090BE002749 +S113935004F126F2815F81CD8CEA5202BF08BE0877 +S11393601F01965CA601CD93E220F3AE03FF94CDDA +S113937093D15D2703CD932BCD8934CC93D490AE78 +S1139380000A90BF00905FCD89A5BE028190BE0007 +S1139390905C90BF005A816F70656E5F310A0D005A +S11393A06F70656E5F320A0D006F70656E5F330A11 +S11393B00D006F70656E5F340A0D0048484EA4F0CE +S11393C0818985CD935701020408C7523181CC931A +S11393D0D75F5C81CC93C19D20FD31003200330006 +S10E93E034008174646F6F720007D0CA +S903936BFE diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/EXT_INT_1PORT.pbd b/4_EXT_INT_1PORT/user/Debug/Obj/EXT_INT_1PORT.pbd new file mode 100644 index 0000000000000000000000000000000000000000..75f0e05cc931094bb1278d8ece55348795fb1573 GIT binary patch literal 511774 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%0AD{)Edtm9A~-+MQ9V5SK_KSet^CB#){{ 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�=K~OEOQ>EXgeYI_Q0IT7$m%Fx0hZ3sp#+ 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

30ClFnfdDeI=B)veKq%87+# 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 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/EXT_INT_1PORT.pbd.browse b/4_EXT_INT_1PORT/user/Debug/Obj/EXT_INT_1PORT.pbd.browse new file mode 100644 index 0000000000000000000000000000000000000000..75f0e05cc931094bb1278d8ece55348795fb1573 GIT binary patch literal 511774 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%0AD{)Edtm9A~-+MQ9V5SK_KSet^CB#){{ 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�=K~OEOQ>EXgeYI_Q0IT7$m%Fx0hZ3sp#+ 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

30ClFnfdDeI=B)veKq%87+# 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 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/main.o b/4_EXT_INT_1PORT/user/Debug/Obj/main.o new file mode 100644 index 0000000000000000000000000000000000000000..662e08fb8e7ccb1a09a17c1f69d1e13d6ae67f0f GIT binary patch literal 207270 zcmd2^31Ah)`QP1lBzZZ>!F@cggfsB25KxYg1PE6`5(E`}hU5W}9PpBGh;oPrUM&@? z)(a4-^(fk^;8oF9L8(_&T5YSXwN-0x#j{oazi(!CXZF2E|H|>~Lf-CgzB#}7%{Q~N zv$Gp2XHU}&U9%2ddl=W!!I=InCJSm_oQJt?hpf0`Sx0BIvtco=*0%Dqz>V##t&z4) zt+=@%S{&_cZEuRSXvIyD#a&CoEzNBa^SZfhNxN3u7J;v(hRz0YxwxZ)Uxk-+wKW!Z zM%ExE<|*3Fyq#8CIlaz|V@b536%j@wEg}KoKuN19E{(Q#tuO<%v^ScUtqqMl8{Bil z;>FR(Dm6Y;x}s}w8VaDWE3&Er@`Q+&@(h{5EEiTm zF+WxfI<+tV1zAYS8J;C@8axigb+v*Eaa||ysgRGs^+JIs0*}S@Sqk>yda;82xLzvo zB=`^Dx_HNMIN6Xk2d*nDSeU z>njD;9GaGj>+2PqhU;Al_Tc&+1*hZs5d~-9`e_Ac;`$W@XW{zy3eLv$Ulp8#>rWKi z4Gqqz;9TJD3Z4Q?bz~kSC!Mha<;eq{py0|F|0J(cQ0*z>g{NC5pTi@>RfpQ{caRPO^;KppV|<-Y_Nd@|MxCz6*c za@3_`2IOX)l3eA>R^a9M`;!b$_3e0DVkZAkVkZAcVkZBO#7zFV#3XmRB__F(+9e&7 zACiMt>;PtR@W{kW-dkcO?=LZvkC2$jM@r1(WH;zAJ&+LHwLC7zG+$2g$)_ejtA6!ub!#KNU`pyTE5lPGMmK-HR1D_+iO^0eJ{= z)B!svJowBH#Q#g+g^)kaT_}AQ_{0y$QE#qwkRuQ5Ao;h%HQA5f1K*-)DU*d8$$zBC z(Jow1Kn{+ugXFI$a@3{kkC5+I1pOkEIjq>Se$0-9KH|vb#X4@lqUtqM2v_(qz`AT@$@{|bVCTA)98bw|R zyanwtd-xuTy`v>8jj5cUV{B}3sa+0P7wVF$(cHt_EhY_?^pzq6p*G|1nQ@-);b zKOjfDP8$XJyNVn-vE)l3uhz6o@Pr*mFAZV%f$%NBQOIu83MY#HpNf1V>K-r~9AF3J9@IBK5FUB)4AHcl7laeZ zOBMO$z~Fuk+9^9oZgQRU_ibR5vD;`xzEND0{2Itn-`&hG6n?iN{~qxDkYAyMe_D~l zws~HK{9#4@S4F-H^8Y~oXDLrNbxG+%m+4+j%SF2Ez&SlAu1WqwU~o7WJhbEs75R@j zzjDEGQ%?NKJzHYpU+zYUnfxM&)0aUG8^jJu|9o*x>F)!+5^`|VlJ5}LB!3k0doiq5 z+F$yUiX65*{T0Yh5pER!yNdh(@F$R)HW~7a3`PEP;J%O}59}cMSVjIK@D#}R3OAD1 zEAqp@O^|=2$k!OaGg0yk$(VuD&%Vwd5t3f1oCqrzh9AeD)P@Ezer-O7x1+b z8wMW_nl4O!n~5Bn)*JpGl-Nj#@lW!nrCjR+44v}Bp&6)4;+u7l{5=yPe$;K|e1W zh8@h_reL)F?41h6SSR})1(yQ+ww=;12YyG&wW+|LD!2lDDRjUO zgr5dnAh9+B7#uR?+H~NMf~$a$hAB5lK2Kr|y2=SFcs8(U`zU{Nfj3CGLFrv3u~rLw zqk<84&JPt_2mFYFk++;@6pZ$e^DBvsTY�v9Cr5`xLwm_<+R5wZN}Ptbu#E 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 z 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 CE(N3j literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/main.pbi b/4_EXT_INT_1PORT/user/Debug/Obj/main.pbi new file mode 100644 index 0000000000000000000000000000000000000000..dedf6c5dc42acd426f37990680a472185ecba2e8 GIT binary patch literal 364759 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

|Y)q$6xx-taI;oBQP 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 z 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 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.pbi.cout b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.pbi.cout new file mode 100644 index 0000000..65f43e8 --- /dev/null +++ b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.pbi.cout @@ -0,0 +1,281 @@ +"E:\2. DU_AN\huong dan tao project stm8s\project\IAR\4_EXT_INT_1PORT\lib\src\stm8s_clk.c" +-std=c99 +-ferror-limit=100 +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\inc +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\inc\c +-I +E:\2. DU_AN\huong dan tao project stm8s\project\IAR\4_EXT_INT_1PORT\lib\inc +-I +E:\2. DU_AN\huong dan tao project stm8s\project\IAR\4_EXT_INT_1PORT\user +-D__CHAR_BITS__=8 +-D__CHAR_MAX__=0xff +-D__CHAR_MIN__=0 +-D__CHAR_SIZE__=1 +-D__UNSIGNED_CHAR_MAX__=0xff +-D__SIGNED_CHAR_MAX__=127 +-D__SIGNED_CHAR_MIN__=(-__SIGNED_CHAR_MAX__-1) +-D__CHAR_ALIGN__=1 +-D__SHORT_SIZE__=2 +-D__UNSIGNED_SHORT_MAX__=0xffff +-D__SIGNED_SHORT_MAX__=32767 +-D__SIGNED_SHORT_MIN__=(-__SIGNED_SHORT_MAX__-1) +-D__SHORT_ALIGN__=1 +-D__INT_SIZE__=2 +-D__UNSIGNED_INT_MAX__=0xffffU +-D__SIGNED_INT_MAX__=32767 +-D__SIGNED_INT_MIN__=(-__SIGNED_INT_MAX__-1) +-D__INT_ALIGN__=1 +-D__LONG_SIZE__=4 +-D__UNSIGNED_LONG_MAX__=0xffffffffUL +-D__SIGNED_LONG_MAX__=2147483647L +-D__SIGNED_LONG_MIN__=(-__SIGNED_LONG_MAX__-1) +-D__LONG_ALIGN__=1 +-D__LONG_LONG_SIZE__=4 +-D__UNSIGNED_LONG_LONG_MAX__=0xffffffffULL +-D__SIGNED_LONG_LONG_MAX__=2147483647LL +-D__SIGNED_LONG_LONG_MIN__=(-__SIGNED_LONG_LONG_MAX__-1) +-D__LONG_LONG_ALIGN__=1 +-D__INT8_T_TYPE__=signed char +-D__INT8_T_MAX__=127 +-D__INT8_T_MIN__=(-__INT8_T_MAX__-1) +-D__UINT8_T_TYPE__=unsigned char +-D__UINT8_T_MAX__=0xff +-D__INT8_SIZE_PREFIX__="hh" +-D__INT16_T_TYPE__=signed int +-D__INT16_T_MAX__=32767 +-D__INT16_T_MIN__=(-__INT16_T_MAX__-1) +-D__UINT16_T_TYPE__=unsigned int +-D__UINT16_T_MAX__=0xffffU +-D__INT16_SIZE_PREFIX__="" +-D__INT32_T_TYPE__=signed long int +-D__INT32_T_MAX__=2147483647L +-D__INT32_T_MIN__=(-__INT32_T_MAX__-1) +-D__UINT32_T_TYPE__=unsigned long int +-D__UINT32_T_MAX__=0xffffffffUL +-D__INT32_SIZE_PREFIX__="l" +-D__INT_LEAST8_T_TYPE__=signed char +-D__INT_LEAST8_T_MAX__=127 +-D__INT_LEAST8_T_MIN__=(-__INT_LEAST8_T_MAX__-1) +-D__UINT_LEAST8_T_TYPE__=unsigned char +-D__UINT_LEAST8_T_MAX__=0xff +-D__INT8_C_SUFFIX__= +-D__UINT8_C_SUFFIX__= +-D__INT_LEAST8_SIZE_PREFIX__="hh" +-D__INT_LEAST16_T_TYPE__=signed int +-D__INT_LEAST16_T_MAX__=32767 +-D__INT_LEAST16_T_MIN__=(-__INT_LEAST16_T_MAX__-1) +-D__UINT_LEAST16_T_TYPE__=unsigned int +-D__UINT_LEAST16_T_MAX__=0xffffU +-D__INT16_C_SUFFIX__= +-D__UINT16_C_SUFFIX__=U +-D__INT_LEAST16_SIZE_PREFIX__="" +-D__INT_LEAST32_T_TYPE__=signed long int +-D__INT_LEAST32_T_MAX__=2147483647L +-D__INT_LEAST32_T_MIN__=(-__INT_LEAST32_T_MAX__-1) +-D__UINT_LEAST32_T_TYPE__=unsigned long int +-D__UINT_LEAST32_T_MAX__=0xffffffffUL +-D__INT32_C_SUFFIX__=L +-D__UINT32_C_SUFFIX__=UL +-D__INT_LEAST32_SIZE_PREFIX__="l" +-D__INT_FAST8_T_TYPE__=signed char +-D__INT_FAST8_T_MAX__=127 +-D__INT_FAST8_T_MIN__=(-__INT_FAST8_T_MAX__-1) +-D__UINT_FAST8_T_TYPE__=unsigned char +-D__UINT_FAST8_T_MAX__=0xff +-D__INT_FAST8_SIZE_PREFIX__="hh" +-D__INT_FAST16_T_TYPE__=signed int +-D__INT_FAST16_T_MAX__=32767 +-D__INT_FAST16_T_MIN__=(-__INT_FAST16_T_MAX__-1) +-D__UINT_FAST16_T_TYPE__=unsigned int +-D__UINT_FAST16_T_MAX__=0xffffU +-D__INT_FAST16_SIZE_PREFIX__="" +-D__INT_FAST32_T_TYPE__=signed long int +-D__INT_FAST32_T_MAX__=2147483647L +-D__INT_FAST32_T_MIN__=(-__INT_FAST32_T_MAX__-1) +-D__UINT_FAST32_T_TYPE__=unsigned long int +-D__UINT_FAST32_T_MAX__=0xffffffffUL +-D__INT_FAST32_SIZE_PREFIX__="l" +-D__INTMAX_T_TYPE__=signed long int +-D__INTMAX_T_MAX__=2147483647L +-D__INTMAX_T_MIN__=(-__INTMAX_T_MAX__-1) +-D__UINTMAX_T_TYPE__=unsigned long int +-D__UINTMAX_T_MAX__=0xffffffffUL +-D__INTMAX_C_SUFFIX__=L +-D__UINTMAX_C_SUFFIX__=UL +-D__INTMAX_SIZE_PREFIX__="l" +-D__FLOAT_SIZE__=4 +-D__FLOAT_ALIGN__=1 +-D__DOUBLE_SIZE__=4 +-D__DOUBLE_ALIGN__=1 +-D__LONG_DOUBLE_SIZE__=4 +-D__LONG_DOUBLE_ALIGN__=1 +-D__NAN_HAS_HIGH_MANTISSA_BIT_SET__=0 +-D__SUBNORMAL_FLOATING_POINTS__=1 +-D__SIZE_T_TYPE__=unsigned short int +-D__SIZE_T_MAX__=0xffff +-D__PTRDIFF_T_TYPE__=signed short int +-D__PTRDIFF_T_MAX__=32767 +-D__PTRDIFF_T_MIN__=(-__PTRDIFF_T_MAX__-1) +-D__INTPTR_T_TYPE__=signed short int +-D__INTPTR_T_MAX__=32767 +-D__INTPTR_T_MIN__=(-__INTPTR_T_MAX__-1) +-D__UINTPTR_T_TYPE__=unsigned short int +-D__UINTPTR_T_MAX__=0xffff +-D__INTPTR_SIZE_PREFIX__="h" +-D__JMP_BUF_ELEMENT_TYPE__=unsigned char +-D__JMP_BUF_NUM_ELEMENTS__=28 +-D__TID__=0x3800 +-D__VER__=142 +-D__SUBVERSION__=1 +-D__BUILD_NUMBER__=142 +-D__IAR_SYSTEMS_ICC__=8 +-D__VA_STACK_DECREASING__=1 +-D__VA_STACK_ALIGN__=1 +-D__VA_STACK_ALIGN_EXTRA_BEFORE__=1 +-D__LITTLE_ENDIAN__=0 +-D__BOOL_TYPE__=unsigned char +-D__WCHAR_T_TYPE__=unsigned short int +-D__WCHAR_T_SIZE__=2 +-D__WCHAR_T_MAX__=0xffff +-D__DEF_PTR_MEM__=__near +-D__CODE_MEM0__=__near_func +-D__CODE_MEM0_POINTER_OK__=1 +-D__CODE_MEM0_UNIQUE_POINTER__=1 +-D__CODE_MEM0_VAR_OK__=1 +-D__DATA_MEM0__=__tiny +-D__DATA_MEM0_POINTER_OK__=1 +-D__DATA_MEM0_UNIQUE_POINTER__=1 +-D__DATA_MEM0_VAR_OK__=1 +-D__DATA_MEM0_INTPTR_TYPE__=signed char +-D__DATA_MEM0_UINTPTR_TYPE__=unsigned char +-D__DATA_MEM0_INTPTR_SIZE_PREFIX__="hh" +-D__DATA_MEM0_MAX_SIZE__=0xff +-D__DATA_MEM1__=__near +-D__DATA_MEM1_POINTER_OK__=1 +-D__DATA_MEM1_UNIQUE_POINTER__=1 +-D__DATA_MEM1_VAR_OK__=1 +-D__DATA_MEM1_INDEX_TYPE__=short +-D__DATA_MEM1_SIZE_TYPE__=unsigned short +-D__DATA_MEM1_INTPTR_TYPE__=short int +-D__DATA_MEM1_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM1_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM1_MAX_SIZE__=0xffff +-D__DATA_MEM1_HEAP_SEGMENT__="HEAP" +-D__DATA_MEM1_PAGE_SIZE__=0 +-D__DATA_MEM1_HEAP__=1 +-D__DATA_MEM2__=__far +-D__DATA_MEM2_POINTER_OK__=1 +-D__DATA_MEM2_UNIQUE_POINTER__=1 +-D__DATA_MEM2_VAR_OK__=1 +-D__DATA_MEM2_INDEX_TYPE__=short +-D__DATA_MEM2_SIZE_TYPE__=unsigned short +-D__DATA_MEM2_INTPTR_TYPE__=long int +-D__DATA_MEM2_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM2_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM2_MAX_SIZE__=0xffff +-D__DATA_MEM3__=__huge +-D__DATA_MEM3_POINTER_OK__=1 +-D__DATA_MEM3_UNIQUE_POINTER__=1 +-D__DATA_MEM3_VAR_OK__=1 +-D__DATA_MEM3_INDEX_TYPE__=long +-D__DATA_MEM3_SIZE_TYPE__=unsigned long +-D__DATA_MEM3_INTPTR_TYPE__=long int +-D__DATA_MEM3_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM3_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM3_MAX_SIZE__=0xffffffff +-D__DATA_MEM4__=__eeprom +-D__DATA_MEM4_POINTER_OK__=1 +-D__DATA_MEM4_UNIQUE_POINTER__=1 +-D__DATA_MEM4_VAR_OK__=1 +-D__DATA_MEM4_INDEX_TYPE__=short +-D__DATA_MEM4_SIZE_TYPE__=unsigned short +-D__DATA_MEM4_INTPTR_TYPE__=short int +-D__DATA_MEM4_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM4_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM4_MAX_SIZE__=0xffff +-D__HEAP_MEM0__=1 +-D__MULTIPLE_HEAPS__=0 +-D__DEF_HEAP_MEM__=__near +-D__MULTIPLE_INHERITANCE__=1 +-D_RTSL_COMPARE_T=unsigned char +-D__CODE_MODEL__=__SMALL_CODE_MODEL__ +-D__CORE__=__STM8__ +-D__DATA_MODEL__=__MEDIUM_DATA_MODEL__ +-D__ICCSTM8__=1 +-D__LARGE_CODE_MODEL__=3 +-D__LARGE_DATA_MODEL__=3 +-D__MEDIUM_CODE_MODEL__=2 +-D__MEDIUM_DATA_MODEL__=2 +-D__SMALL_CODE_MODEL__=1 +-D__SMALL_DATA_MODEL__=1 +-D__STM8__=1 +-D__PLAIN_INT_BITFIELD_IS_SIGNED__=1 +-D__HAS_WEAK__=1 +-D__HAS_LOCATED_DECLARATION__=1 +-D__HAS_LOCATED_WITH_INIT__=1 +-D__IAR_COMPILERBASE__=593416 +-D__DATE__="Mar 29 2020" +-D__TIME__="21:03:10" +-D__STDC__=1 +-D__STDC_VERSION__=199901L +-D__STDC_HOSTED__=1 +-D__EDG_IA64_ABI=1 +-D__EDG_IA64_ABI_VARIANT_CTORS_AND_DTORS_RETURN_THIS=1 +-D__EDG_IA64_ABI_USE_INT_STATIC_INIT_GUARD=1 +-D__EDG_TYPE_TRAITS_ENABLED=1 +-D__EDG__=1 +-D__EDG_VERSION__=403 +-D__EDG_SIZE_TYPE__=unsigned short +-D__EDG_PTRDIFF_TYPE__=short +-D__EDG_DELTA_TYPE=short +-D__EDG_IA64_VTABLE_ENTRY_TYPE=short +-D__EDG_VIRTUAL_FUNCTION_INDEX_TYPE=unsigned short +-D__EDG_LOWER_VARIABLE_LENGTH_ARRAYS=1 +-D__EDG_IA64_ABI_USE_VARIANT_ARRAY_COOKIES=1 +-D__EDG_ABI_COMPATIBILITY_VERSION=9999 +-D__EDG_ABI_CHANGES_FOR_RTTI=1 +-D__EDG_ABI_CHANGES_FOR_ARRAY_NEW_AND_DELETE=1 +-D__EDG_ABI_CHANGES_FOR_PLACEMENT_DELETE=1 +-D__EDG_BSD=0 +-D__EDG_SYSV=0 +-D__EDG_ANSIC=1 +-D__EDG_CPP0X_IL_EXTENSIONS_SUPPORTED=1 +-D_DLIB_CONFIG_FILE_HEADER_NAME="C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\LIB\dlstm8smn.h" +-D_DLIB_CONFIG_FILE_STRING="C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.5\\stm8\\LIB\\dlstm8smn.h" +-D__VERSION__="IAR C/C++ Compiler V1.42.1.142 for STM8" +-D__CODE_MEMORY_LIST1__()=__CODE_MEM_HELPER1__(__code, 0 ) +-D__CODE_MEMORY_LIST2__(_P1)=__CODE_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_MEMORY_LIST3__(_P1, _P2)=__CODE_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_MEMORY_LIST1__()=__DATA_MEM_HELPER1__(__data, 0 ) +-D__DATA_MEMORY_LIST2__(_P1)=__DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_MEMORY_LIST3__(_P1, _P2)=__DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__CODE_PTR_MEMORY_LIST1__()=__CODE_PTR_MEM_HELPER1__(__code, 0 ) +-D__CODE_PTR_MEMORY_LIST2__(_P1)=__CODE_PTR_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_PTR_MEMORY_LIST3__(_P1, _P2)=__CODE_PTR_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_PTR_MEMORY_LIST1__()=__DATA_PTR_MEM_HELPER1__(__data, 0 ) +-D__DATA_PTR_MEMORY_LIST2__(_P1)=__DATA_PTR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_PTR_MEMORY_LIST3__(_P1, _P2)=__DATA_PTR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VAR_MEMORY_LIST1__()=__VAR_MEM_HELPER1__(__data, 0 ) +-D__VAR_MEMORY_LIST2__(_P1)=__VAR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__VAR_MEMORY_LIST3__(_P1, _P2)=__VAR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VARD_MEMORY_LIST1__()=__VARD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAP_MEMORY_LIST1__()=__HEAP_MEM_HELPER1__(__data, 0 ) +-D__HEAP_MEMORY_LIST2__(_P1)=__HEAP_MEM_HELPER2__(__data, 0 , _P1 ) +-D__HEAP_MEMORY_LIST3__(_P1, _P2)=__HEAP_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__HVAR_MEMORY_LIST1__()=__HVAR_MEM_HELPER1__(__data, 0 ) +-D__HEAPD_MEMORY_LIST1__()=__HEAPD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAPU_MEMORY_LIST1__()=__HEAPU_MEM_HELPER1__(__data, 0 ) +-D__TOPM_DATA_MEMORY_LIST1__()= +-D__TOPM_DATA_MEMORY_LIST2__(_P1)= +-D__TOPM_DATA_MEMORY_LIST3__(_P1, _P2)= +-D__TOPP_DATA_MEMORY_LIST1__()=__TOPP_DATA_MEM_HELPER1__(__data, 0 ) +-D__TOPP_DATA_MEMORY_LIST2__(_P1)=__TOPP_DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__TOPP_DATA_MEMORY_LIST3__(_P1, _P2)=__TOPP_DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__DATA_MEM0_SIZE_TYPE__=unsigned int +-D__DATA_MEM0_INDEX_TYPE__=signed int diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.o b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.o new file mode 100644 index 0000000000000000000000000000000000000000..45235ed6b1fd60dac3fc7ce9e89c891434989e99 GIT binary patch literal 1402 zcmbVM&2AGh5Ozw$g$oilxL8#Vt*UjiRVYz!kfu_kK&mzZ4wfvh*GWv*>y_=TniF>( zfQR96cmtjQ#+%KL0!Xmddi~AM=kd;r_w#Uk)jDXQ&1j)-fOiz_FO{u_Fsw)DG1!P( zIBz{q04?=utz}`fmbphnaZ9Y%CY4#m-+yf)w9(HWV0^iC0C{*pZ>Mkjw8w@Yr)>0Y z%Hr$E&Ga|9bkb7IRZawA3}Q03bY5!L=|Jc*lL(Do-{8UN;N%1kj4o6rEq;GS;x36v z-0S0+u{eZk5)wxeN0SUkQEr%UAOuk6)?~F(<(bNBy?|UWZM-u1%F!pB*Ia9yV}e(- zR3_yd^tC@E5IbF)xaY7%P-&T}Qsc6*qlz1PZT1gnM#;2`Ap66;oyQ^TQj#@ z<15IL!$%MO^J5y)ce~0d9qL4;sZ8+)WA74~iv@l~y3~2yr{mEZnq~nyos-2Ojz*Y} zQ+W1k2tldJ1svdS9#vK0eD_w)9gfcd>Y4cG4-EmF71g;MOQbAFQ?khJ8gu1?SB=T@ zLYc;7uXL|5x#ZTz)pc5xeXJ78?GjxAfIGJBN>p`arLq!*$^%X}9g0>R8gx()HiMpG zsdU1s!W)aaV6dLuOY7i5px*ZSZ_yu>U=II|M_adwe6}O6;S&G{YXR07%r4BpUGtv; oezqe6L|?7-adYd;6M2!`G93sY-q2><{9 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.pbi b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.pbi new file mode 100644 index 0000000000000000000000000000000000000000..1122f0160d3e3d7ba1042a5763263a2bf1b7bbfc GIT binary patch literal 308905 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 Iz7)Uv{|291`Tzg` literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.pbi.cout b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.pbi.cout new file mode 100644 index 0000000..cdb1901 --- /dev/null +++ b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_exti.pbi.cout @@ -0,0 +1,281 @@ +"E:\2. DU_AN\huong dan tao project stm8s\project\IAR\4_EXT_INT_1PORT\lib\src\stm8s_exti.c" +-std=c99 +-ferror-limit=100 +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\inc +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\inc\c +-I +E:\2. DU_AN\huong dan tao project stm8s\project\IAR\4_EXT_INT_1PORT\lib\inc +-I +E:\2. DU_AN\huong dan tao project stm8s\project\IAR\4_EXT_INT_1PORT\user +-D__CHAR_BITS__=8 +-D__CHAR_MAX__=0xff +-D__CHAR_MIN__=0 +-D__CHAR_SIZE__=1 +-D__UNSIGNED_CHAR_MAX__=0xff +-D__SIGNED_CHAR_MAX__=127 +-D__SIGNED_CHAR_MIN__=(-__SIGNED_CHAR_MAX__-1) +-D__CHAR_ALIGN__=1 +-D__SHORT_SIZE__=2 +-D__UNSIGNED_SHORT_MAX__=0xffff +-D__SIGNED_SHORT_MAX__=32767 +-D__SIGNED_SHORT_MIN__=(-__SIGNED_SHORT_MAX__-1) +-D__SHORT_ALIGN__=1 +-D__INT_SIZE__=2 +-D__UNSIGNED_INT_MAX__=0xffffU +-D__SIGNED_INT_MAX__=32767 +-D__SIGNED_INT_MIN__=(-__SIGNED_INT_MAX__-1) +-D__INT_ALIGN__=1 +-D__LONG_SIZE__=4 +-D__UNSIGNED_LONG_MAX__=0xffffffffUL +-D__SIGNED_LONG_MAX__=2147483647L +-D__SIGNED_LONG_MIN__=(-__SIGNED_LONG_MAX__-1) +-D__LONG_ALIGN__=1 +-D__LONG_LONG_SIZE__=4 +-D__UNSIGNED_LONG_LONG_MAX__=0xffffffffULL +-D__SIGNED_LONG_LONG_MAX__=2147483647LL +-D__SIGNED_LONG_LONG_MIN__=(-__SIGNED_LONG_LONG_MAX__-1) +-D__LONG_LONG_ALIGN__=1 +-D__INT8_T_TYPE__=signed char +-D__INT8_T_MAX__=127 +-D__INT8_T_MIN__=(-__INT8_T_MAX__-1) +-D__UINT8_T_TYPE__=unsigned char +-D__UINT8_T_MAX__=0xff +-D__INT8_SIZE_PREFIX__="hh" +-D__INT16_T_TYPE__=signed int +-D__INT16_T_MAX__=32767 +-D__INT16_T_MIN__=(-__INT16_T_MAX__-1) +-D__UINT16_T_TYPE__=unsigned int +-D__UINT16_T_MAX__=0xffffU +-D__INT16_SIZE_PREFIX__="" +-D__INT32_T_TYPE__=signed long int +-D__INT32_T_MAX__=2147483647L +-D__INT32_T_MIN__=(-__INT32_T_MAX__-1) +-D__UINT32_T_TYPE__=unsigned long int +-D__UINT32_T_MAX__=0xffffffffUL +-D__INT32_SIZE_PREFIX__="l" +-D__INT_LEAST8_T_TYPE__=signed char +-D__INT_LEAST8_T_MAX__=127 +-D__INT_LEAST8_T_MIN__=(-__INT_LEAST8_T_MAX__-1) +-D__UINT_LEAST8_T_TYPE__=unsigned char +-D__UINT_LEAST8_T_MAX__=0xff +-D__INT8_C_SUFFIX__= +-D__UINT8_C_SUFFIX__= +-D__INT_LEAST8_SIZE_PREFIX__="hh" +-D__INT_LEAST16_T_TYPE__=signed int +-D__INT_LEAST16_T_MAX__=32767 +-D__INT_LEAST16_T_MIN__=(-__INT_LEAST16_T_MAX__-1) +-D__UINT_LEAST16_T_TYPE__=unsigned int +-D__UINT_LEAST16_T_MAX__=0xffffU +-D__INT16_C_SUFFIX__= +-D__UINT16_C_SUFFIX__=U +-D__INT_LEAST16_SIZE_PREFIX__="" +-D__INT_LEAST32_T_TYPE__=signed long int +-D__INT_LEAST32_T_MAX__=2147483647L +-D__INT_LEAST32_T_MIN__=(-__INT_LEAST32_T_MAX__-1) +-D__UINT_LEAST32_T_TYPE__=unsigned long int +-D__UINT_LEAST32_T_MAX__=0xffffffffUL +-D__INT32_C_SUFFIX__=L +-D__UINT32_C_SUFFIX__=UL +-D__INT_LEAST32_SIZE_PREFIX__="l" +-D__INT_FAST8_T_TYPE__=signed char +-D__INT_FAST8_T_MAX__=127 +-D__INT_FAST8_T_MIN__=(-__INT_FAST8_T_MAX__-1) +-D__UINT_FAST8_T_TYPE__=unsigned char +-D__UINT_FAST8_T_MAX__=0xff +-D__INT_FAST8_SIZE_PREFIX__="hh" +-D__INT_FAST16_T_TYPE__=signed int +-D__INT_FAST16_T_MAX__=32767 +-D__INT_FAST16_T_MIN__=(-__INT_FAST16_T_MAX__-1) +-D__UINT_FAST16_T_TYPE__=unsigned int +-D__UINT_FAST16_T_MAX__=0xffffU +-D__INT_FAST16_SIZE_PREFIX__="" +-D__INT_FAST32_T_TYPE__=signed long int +-D__INT_FAST32_T_MAX__=2147483647L +-D__INT_FAST32_T_MIN__=(-__INT_FAST32_T_MAX__-1) +-D__UINT_FAST32_T_TYPE__=unsigned long int +-D__UINT_FAST32_T_MAX__=0xffffffffUL +-D__INT_FAST32_SIZE_PREFIX__="l" +-D__INTMAX_T_TYPE__=signed long int +-D__INTMAX_T_MAX__=2147483647L +-D__INTMAX_T_MIN__=(-__INTMAX_T_MAX__-1) +-D__UINTMAX_T_TYPE__=unsigned long int +-D__UINTMAX_T_MAX__=0xffffffffUL +-D__INTMAX_C_SUFFIX__=L +-D__UINTMAX_C_SUFFIX__=UL +-D__INTMAX_SIZE_PREFIX__="l" +-D__FLOAT_SIZE__=4 +-D__FLOAT_ALIGN__=1 +-D__DOUBLE_SIZE__=4 +-D__DOUBLE_ALIGN__=1 +-D__LONG_DOUBLE_SIZE__=4 +-D__LONG_DOUBLE_ALIGN__=1 +-D__NAN_HAS_HIGH_MANTISSA_BIT_SET__=0 +-D__SUBNORMAL_FLOATING_POINTS__=1 +-D__SIZE_T_TYPE__=unsigned short int +-D__SIZE_T_MAX__=0xffff +-D__PTRDIFF_T_TYPE__=signed short int +-D__PTRDIFF_T_MAX__=32767 +-D__PTRDIFF_T_MIN__=(-__PTRDIFF_T_MAX__-1) +-D__INTPTR_T_TYPE__=signed short int +-D__INTPTR_T_MAX__=32767 +-D__INTPTR_T_MIN__=(-__INTPTR_T_MAX__-1) +-D__UINTPTR_T_TYPE__=unsigned short int +-D__UINTPTR_T_MAX__=0xffff +-D__INTPTR_SIZE_PREFIX__="h" +-D__JMP_BUF_ELEMENT_TYPE__=unsigned char +-D__JMP_BUF_NUM_ELEMENTS__=28 +-D__TID__=0x3800 +-D__VER__=142 +-D__SUBVERSION__=1 +-D__BUILD_NUMBER__=142 +-D__IAR_SYSTEMS_ICC__=8 +-D__VA_STACK_DECREASING__=1 +-D__VA_STACK_ALIGN__=1 +-D__VA_STACK_ALIGN_EXTRA_BEFORE__=1 +-D__LITTLE_ENDIAN__=0 +-D__BOOL_TYPE__=unsigned char +-D__WCHAR_T_TYPE__=unsigned short int +-D__WCHAR_T_SIZE__=2 +-D__WCHAR_T_MAX__=0xffff +-D__DEF_PTR_MEM__=__near +-D__CODE_MEM0__=__near_func +-D__CODE_MEM0_POINTER_OK__=1 +-D__CODE_MEM0_UNIQUE_POINTER__=1 +-D__CODE_MEM0_VAR_OK__=1 +-D__DATA_MEM0__=__tiny +-D__DATA_MEM0_POINTER_OK__=1 +-D__DATA_MEM0_UNIQUE_POINTER__=1 +-D__DATA_MEM0_VAR_OK__=1 +-D__DATA_MEM0_INTPTR_TYPE__=signed char +-D__DATA_MEM0_UINTPTR_TYPE__=unsigned char +-D__DATA_MEM0_INTPTR_SIZE_PREFIX__="hh" +-D__DATA_MEM0_MAX_SIZE__=0xff +-D__DATA_MEM1__=__near +-D__DATA_MEM1_POINTER_OK__=1 +-D__DATA_MEM1_UNIQUE_POINTER__=1 +-D__DATA_MEM1_VAR_OK__=1 +-D__DATA_MEM1_INDEX_TYPE__=short +-D__DATA_MEM1_SIZE_TYPE__=unsigned short +-D__DATA_MEM1_INTPTR_TYPE__=short int +-D__DATA_MEM1_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM1_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM1_MAX_SIZE__=0xffff +-D__DATA_MEM1_HEAP_SEGMENT__="HEAP" +-D__DATA_MEM1_PAGE_SIZE__=0 +-D__DATA_MEM1_HEAP__=1 +-D__DATA_MEM2__=__far +-D__DATA_MEM2_POINTER_OK__=1 +-D__DATA_MEM2_UNIQUE_POINTER__=1 +-D__DATA_MEM2_VAR_OK__=1 +-D__DATA_MEM2_INDEX_TYPE__=short +-D__DATA_MEM2_SIZE_TYPE__=unsigned short +-D__DATA_MEM2_INTPTR_TYPE__=long int +-D__DATA_MEM2_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM2_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM2_MAX_SIZE__=0xffff +-D__DATA_MEM3__=__huge +-D__DATA_MEM3_POINTER_OK__=1 +-D__DATA_MEM3_UNIQUE_POINTER__=1 +-D__DATA_MEM3_VAR_OK__=1 +-D__DATA_MEM3_INDEX_TYPE__=long +-D__DATA_MEM3_SIZE_TYPE__=unsigned long +-D__DATA_MEM3_INTPTR_TYPE__=long int +-D__DATA_MEM3_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM3_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM3_MAX_SIZE__=0xffffffff +-D__DATA_MEM4__=__eeprom +-D__DATA_MEM4_POINTER_OK__=1 +-D__DATA_MEM4_UNIQUE_POINTER__=1 +-D__DATA_MEM4_VAR_OK__=1 +-D__DATA_MEM4_INDEX_TYPE__=short +-D__DATA_MEM4_SIZE_TYPE__=unsigned short +-D__DATA_MEM4_INTPTR_TYPE__=short int +-D__DATA_MEM4_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM4_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM4_MAX_SIZE__=0xffff +-D__HEAP_MEM0__=1 +-D__MULTIPLE_HEAPS__=0 +-D__DEF_HEAP_MEM__=__near +-D__MULTIPLE_INHERITANCE__=1 +-D_RTSL_COMPARE_T=unsigned char +-D__CODE_MODEL__=__SMALL_CODE_MODEL__ +-D__CORE__=__STM8__ +-D__DATA_MODEL__=__MEDIUM_DATA_MODEL__ +-D__ICCSTM8__=1 +-D__LARGE_CODE_MODEL__=3 +-D__LARGE_DATA_MODEL__=3 +-D__MEDIUM_CODE_MODEL__=2 +-D__MEDIUM_DATA_MODEL__=2 +-D__SMALL_CODE_MODEL__=1 +-D__SMALL_DATA_MODEL__=1 +-D__STM8__=1 +-D__PLAIN_INT_BITFIELD_IS_SIGNED__=1 +-D__HAS_WEAK__=1 +-D__HAS_LOCATED_DECLARATION__=1 +-D__HAS_LOCATED_WITH_INIT__=1 +-D__IAR_COMPILERBASE__=593416 +-D__DATE__="Mar 29 2020" +-D__TIME__="21:03:10" +-D__STDC__=1 +-D__STDC_VERSION__=199901L +-D__STDC_HOSTED__=1 +-D__EDG_IA64_ABI=1 +-D__EDG_IA64_ABI_VARIANT_CTORS_AND_DTORS_RETURN_THIS=1 +-D__EDG_IA64_ABI_USE_INT_STATIC_INIT_GUARD=1 +-D__EDG_TYPE_TRAITS_ENABLED=1 +-D__EDG__=1 +-D__EDG_VERSION__=403 +-D__EDG_SIZE_TYPE__=unsigned short +-D__EDG_PTRDIFF_TYPE__=short +-D__EDG_DELTA_TYPE=short +-D__EDG_IA64_VTABLE_ENTRY_TYPE=short +-D__EDG_VIRTUAL_FUNCTION_INDEX_TYPE=unsigned short +-D__EDG_LOWER_VARIABLE_LENGTH_ARRAYS=1 +-D__EDG_IA64_ABI_USE_VARIANT_ARRAY_COOKIES=1 +-D__EDG_ABI_COMPATIBILITY_VERSION=9999 +-D__EDG_ABI_CHANGES_FOR_RTTI=1 +-D__EDG_ABI_CHANGES_FOR_ARRAY_NEW_AND_DELETE=1 +-D__EDG_ABI_CHANGES_FOR_PLACEMENT_DELETE=1 +-D__EDG_BSD=0 +-D__EDG_SYSV=0 +-D__EDG_ANSIC=1 +-D__EDG_CPP0X_IL_EXTENSIONS_SUPPORTED=1 +-D_DLIB_CONFIG_FILE_HEADER_NAME="C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\LIB\dlstm8smn.h" +-D_DLIB_CONFIG_FILE_STRING="C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 6.5\\stm8\\LIB\\dlstm8smn.h" +-D__VERSION__="IAR C/C++ Compiler V1.42.1.142 for STM8" +-D__CODE_MEMORY_LIST1__()=__CODE_MEM_HELPER1__(__code, 0 ) +-D__CODE_MEMORY_LIST2__(_P1)=__CODE_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_MEMORY_LIST3__(_P1, _P2)=__CODE_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_MEMORY_LIST1__()=__DATA_MEM_HELPER1__(__data, 0 ) +-D__DATA_MEMORY_LIST2__(_P1)=__DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_MEMORY_LIST3__(_P1, _P2)=__DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__CODE_PTR_MEMORY_LIST1__()=__CODE_PTR_MEM_HELPER1__(__code, 0 ) +-D__CODE_PTR_MEMORY_LIST2__(_P1)=__CODE_PTR_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_PTR_MEMORY_LIST3__(_P1, _P2)=__CODE_PTR_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_PTR_MEMORY_LIST1__()=__DATA_PTR_MEM_HELPER1__(__data, 0 ) +-D__DATA_PTR_MEMORY_LIST2__(_P1)=__DATA_PTR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_PTR_MEMORY_LIST3__(_P1, _P2)=__DATA_PTR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VAR_MEMORY_LIST1__()=__VAR_MEM_HELPER1__(__data, 0 ) +-D__VAR_MEMORY_LIST2__(_P1)=__VAR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__VAR_MEMORY_LIST3__(_P1, _P2)=__VAR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VARD_MEMORY_LIST1__()=__VARD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAP_MEMORY_LIST1__()=__HEAP_MEM_HELPER1__(__data, 0 ) +-D__HEAP_MEMORY_LIST2__(_P1)=__HEAP_MEM_HELPER2__(__data, 0 , _P1 ) +-D__HEAP_MEMORY_LIST3__(_P1, _P2)=__HEAP_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__HVAR_MEMORY_LIST1__()=__HVAR_MEM_HELPER1__(__data, 0 ) +-D__HEAPD_MEMORY_LIST1__()=__HEAPD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAPU_MEMORY_LIST1__()=__HEAPU_MEM_HELPER1__(__data, 0 ) +-D__TOPM_DATA_MEMORY_LIST1__()= +-D__TOPM_DATA_MEMORY_LIST2__(_P1)= +-D__TOPM_DATA_MEMORY_LIST3__(_P1, _P2)= +-D__TOPP_DATA_MEMORY_LIST1__()=__TOPP_DATA_MEM_HELPER1__(__data, 0 ) +-D__TOPP_DATA_MEMORY_LIST2__(_P1)=__TOPP_DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__TOPP_DATA_MEMORY_LIST3__(_P1, _P2)=__TOPP_DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__DATA_MEM0_SIZE_TYPE__=unsigned int +-D__DATA_MEM0_INDEX_TYPE__=signed int diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_gpio.o b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_gpio.o new file mode 100644 index 0000000000000000000000000000000000000000..45235ed6b1fd60dac3fc7ce9e89c891434989e99 GIT binary patch literal 1402 zcmbVM&2AGh5Ozw$g$oilxL8#Vt*UjiRVYz!kfu_kK&mzZ4wfvh*GWv*>y_=TniF>( zfQR96cmtjQ#+%KL0!Xmddi~AM=kd;r_w#Uk)jDXQ&1j)-fOiz_FO{u_Fsw)DG1!P( zIBz{q04?=utz}`fmbphnaZ9Y%CY4#m-+yf)w9(HWV0^iC0C{*pZ>Mkjw8w@Yr)>0Y z%Hr$E&Ga|9bkb7IRZawA3}Q03bY5!L=|Jc*lL(Do-{8UN;N%1kj4o6rEq;GS;x36v z-0S0+u{eZk5)wxeN0SUkQEr%UAOuk6)?~F(<(bNBy?|UWZM-u1%F!pB*Ia9yV}e(- zR3_yd^tC@E5IbF)xaY7%P-&T}Qsc6*qlz1PZT1gnM#;2`Ap66;oyQ^TQj#@ z<15IL!$%MO^J5y)ce~0d9qL4;sZ8+)WA74~iv@l~y3~2yr{mEZnq~nyos-2Ojz*Y} zQ+W1k2tldJ1svdS9#vK0eD_w)9gfcd>Y4cG4-EmF71g;MOQbAFQ?khJ8gu1?SB=T@ zLYc;7uXL|5x#ZTz)pc5xeXJ78?GjxAfIGJBN>p`arLq!*$^%X}9g0>R8gx()HiMpG zsdU1s!W)aaV6dLuOY7i5px*ZSZ_yu>U=II|M_adwe6}O6;S&G{YXR07%r4BpUGtv; oezqe6L|?7-adYd;6M2!`G93sY-q2><{9 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_gpio.pbi b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_gpio.pbi new file mode 100644 index 0000000000000000000000000000000000000000..3355707c5e877d130050a4d9689eb4e35ebda937 GIT binary patch literal 309413 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 z�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

C0^npTV?KoL;nJ$u_Qq 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 oezqe6L|?7-adYd;6M2!`G93sY-q2><{9 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_tim4.pbi b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_tim4.pbi new file mode 100644 index 0000000000000000000000000000000000000000..a12cea576e993bfed29c876eed28d0b7acb4364f GIT binary patch literal 3022 zcmaJ@U1(cn82+9w$(Pf!|NnMd|8%pf`%Bw2O{UePU0b4V>raGT6l#_pXH1%ClGY1v zHU~OUWW#MYopX9qrlPRwycrC|3l*U-gjP`m9Wpw+5QT||_8lA=OU+FXOdWl#i zDAqiS$1qR44HB_>Bbx_4Bi=kZ)lCwyMo_G29=%v3-e!qdyM-+RKND|}c=ZyoPEc&y zA|9frqiTahte3IgMLdgT(r%TA4cpi<@E2*9v4>_R#704}?aK(#6$`Lc4S~K?Vdf>g zhD(^kC%B34@dqyOkN8b~i~qwfdEWEf@ciQW&2z$g!F$d7mG@WgUGFQtcYIfT*L~ml zZu$Q7y&*1(>taFN5r2y}{crg{^nd9umZrkRiBfthxbGR3h#v}09Ms~ubcxO6(~~W> zz%ChR*C~ngl-8Flx{3Diu5_-nr-h&*87^qWR5Gg-7{&A|!&)JopVUA1Pfgl7(v#G; zv%}g8W2IzC(@F6}e?Iqg`nZj0gxu}o30?B!bCV=Lm@X!dWwk1GjjZ0cd~Q8Esy#og z6-)QfIoh@pI@{^kF7}ZHzts}!_c6laqjaBowGPZ@7 znabM7`bV{FJ~?Ssjg5{HNye(mx>L5fhP0ekpzRLKX!J_0`{Ib(_+_4RCA8M*T!}7) zr5@9ape{8S<>ON_HeJf=vpPjqT-RC8`mu-1y7C6Ll*?H$`|YNvwK6-`jJnu^+2nC~ zO{a^F(pK2Eg#N6SEXa&)dNXF@4L%VYG6#<*YLqvEx=8+8Vp!k))H%G1ukj;Z<=6PP z{B^R0JD$_t&%Hl*&-xa8%f7e8r{Z_~qvgd^ zJirRrzuLsJxkf7584PtALOV|{WiG8s)*a~hADM0r)&$Za+>IkWW(7(|O}DUAhCjHa zT|HePqq)J+=OyQGwdv{!nQcsNjb1g}#9b=b6$%?|YtU<*pq2}{2J8+5x|~%Vwxpj+ zuT%N@SqrLm9{0@MA?x_nY`u8JqO7v!Tdx?3YvNF(yW5!9MU9%z?m!n_KIZI1J8REZh+>U$KLzZ^~|h)`XVnRh0{M1&l*mtf=9NjuJM@ zbL~59+qc6*qYjPH$nr%R#}>4|8e7;hIvd?IHTQ`+0>QAkA(N$Vr|f!;mWIp8U)!9m ze*EEdZYG(fpC;LS>Jc_@V0y_=TniF>( zfQR96cmtjQ#+%KL0!Xmddi~AM=kd;r_w#Uk)jDXQ&1j)-fOiz_FO{u_Fsw)DG1!P( zIBz{q04?=utz}`fmbphnaZ9Y%CY4#m-+yf)w9(HWV0^iC0C{*pZ>Mkjw8w@Yr)>0Y z%Hr$E&Ga|9bkb7IRZawA3}Q03bY5!L=|Jc*lL(Do-{8UN;N%1kj4o6rEq;GS;x36v z-0S0+u{eZk5)wxeN0SUkQEr%UAOuk6)?~F(<(bNBy?|UWZM-u1%F!pB*Ia9yV}e(- zR3_yd^tC@E5IbF)xaY7%P-&T}Qsc6*qlz1PZT1gnM#;2`Ap66;oyQ^TQj#@ z<15IL!$%MO^J5y)ce~0d9qL4;sZ8+)WA74~iv@l~y3~2yr{mEZnq~nyos-2Ojz*Y} zQ+W1k2tldJ1svdS9#vK0eD_w)9gfcd>Y4cG4-EmF71g;MOQbAFQ?khJ8gu1?SB=T@ zLYc;7uXL|5x#ZTz)pc5xeXJ78?GjxAfIGJBN>p`arLq!*$^%X}9g0>R8gx()HiMpG zsdU1s!W)aaV6dLuOY7i5px*ZSZ_yu>U=II|M_adwe6}O6;S&G{YXR07%r4BpUGtv; oezqe6L|?7-adYd;6M2!`G93sY-q2><{9 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart1.pbi b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart1.pbi new file mode 100644 index 0000000000000000000000000000000000000000..406552fcf27d0a787322f1c4dac2ed6e85dba6db GIT binary patch literal 874 zcmZ{iv2W905XJ8~t?N1vh?oFHih#k95K7XzO(LjFAw-dyP$fY{wk6BhR%QQ{Ou ztgLLT3@|V;bj--W!oreQOU-%%L3qJ&M8rl;rxkR!u-@$1lGjO!6T3KD( zi5=Qv?zFYKy=+Zvl{W9zm(7d4Q`UN=x@^5jCT&z#d;ZNXZLP2LoTr<}Cysda)~>qq z?*TSw$-D*19o+YWGkeHC$}n{HsM#?4gHFxdwwlieR=Yc}Du+*dgOncnFU;}CF_)63 E--;dZSO5S3 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart1.pbi.cout b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart1.pbi.cout new file mode 100644 index 0000000..701eaa9 --- /dev/null +++ b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart1.pbi.cout @@ -0,0 +1,284 @@ +"E:\STM8\4_EXT_INT_1PORT\4_EXT_INT_1PORT\lib\src\stm8s_uart1.c" +-std=c99 +-ferror-limit=100 +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\inc +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\inc\c +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-D__CHAR_BITS__=8 +-D__CHAR_MAX__=0xff +-D__CHAR_MIN__=0 +-D__CHAR_SIZE__=1 +-D__UNSIGNED_CHAR_MAX__=0xff +-D__SIGNED_CHAR_MAX__=127 +-D__SIGNED_CHAR_MIN__=(-__SIGNED_CHAR_MAX__-1) +-D__CHAR_ALIGN__=1 +-D__SHORT_SIZE__=2 +-D__UNSIGNED_SHORT_MAX__=0xffffU +-D__SIGNED_SHORT_MAX__=32767 +-D__SIGNED_SHORT_MIN__=(-__SIGNED_SHORT_MAX__-1) +-D__SHORT_ALIGN__=1 +-D__INT_SIZE__=2 +-D__UNSIGNED_INT_MAX__=0xffffU +-D__SIGNED_INT_MAX__=32767 +-D__SIGNED_INT_MIN__=(-__SIGNED_INT_MAX__-1) +-D__INT_ALIGN__=1 +-D__LONG_SIZE__=4 +-D__UNSIGNED_LONG_MAX__=0xffffffffUL +-D__SIGNED_LONG_MAX__=2147483647L +-D__SIGNED_LONG_MIN__=(-__SIGNED_LONG_MAX__-1) +-D__LONG_ALIGN__=1 +-D__LONG_LONG_SIZE__=4 +-D__UNSIGNED_LONG_LONG_MAX__=0xffffffffULL +-D__SIGNED_LONG_LONG_MAX__=2147483647LL +-D__SIGNED_LONG_LONG_MIN__=(-__SIGNED_LONG_LONG_MAX__-1) +-D__LONG_LONG_ALIGN__=1 +-D__INT8_T_TYPE__=signed char +-D__INT8_T_MAX__=127 +-D__INT8_T_MIN__=(-__INT8_T_MAX__-1) +-D__UINT8_T_TYPE__=unsigned char +-D__UINT8_T_MAX__=0xff +-D__INT8_SIZE_PREFIX__="hh" +-D__INT16_T_TYPE__=signed int +-D__INT16_T_MAX__=32767 +-D__INT16_T_MIN__=(-__INT16_T_MAX__-1) +-D__UINT16_T_TYPE__=unsigned int +-D__UINT16_T_MAX__=0xffffU +-D__INT16_SIZE_PREFIX__="" +-D__INT32_T_TYPE__=signed long int +-D__INT32_T_MAX__=2147483647L +-D__INT32_T_MIN__=(-__INT32_T_MAX__-1) +-D__UINT32_T_TYPE__=unsigned long int +-D__UINT32_T_MAX__=0xffffffffUL +-D__INT32_SIZE_PREFIX__="l" +-D__INT_LEAST8_T_TYPE__=signed char +-D__INT_LEAST8_T_MAX__=127 +-D__INT_LEAST8_T_MIN__=(-__INT_LEAST8_T_MAX__-1) +-D__UINT_LEAST8_T_TYPE__=unsigned char +-D__UINT_LEAST8_T_MAX__=0xff +-D__INT8_C_SUFFIX__= +-D__UINT8_C_SUFFIX__= +-D__INT_LEAST8_SIZE_PREFIX__="hh" +-D__INT_LEAST16_T_TYPE__=signed int +-D__INT_LEAST16_T_MAX__=32767 +-D__INT_LEAST16_T_MIN__=(-__INT_LEAST16_T_MAX__-1) +-D__UINT_LEAST16_T_TYPE__=unsigned int +-D__UINT_LEAST16_T_MAX__=0xffffU +-D__INT16_C_SUFFIX__= +-D__UINT16_C_SUFFIX__=U +-D__INT_LEAST16_SIZE_PREFIX__="" +-D__INT_LEAST32_T_TYPE__=signed long int +-D__INT_LEAST32_T_MAX__=2147483647L +-D__INT_LEAST32_T_MIN__=(-__INT_LEAST32_T_MAX__-1) +-D__UINT_LEAST32_T_TYPE__=unsigned long int +-D__UINT_LEAST32_T_MAX__=0xffffffffUL +-D__INT32_C_SUFFIX__=L +-D__UINT32_C_SUFFIX__=UL +-D__INT_LEAST32_SIZE_PREFIX__="l" +-D__INT_FAST8_T_TYPE__=signed char +-D__INT_FAST8_T_MAX__=127 +-D__INT_FAST8_T_MIN__=(-__INT_FAST8_T_MAX__-1) +-D__UINT_FAST8_T_TYPE__=unsigned char +-D__UINT_FAST8_T_MAX__=0xff +-D__INT_FAST8_SIZE_PREFIX__="hh" +-D__INT_FAST16_T_TYPE__=signed int +-D__INT_FAST16_T_MAX__=32767 +-D__INT_FAST16_T_MIN__=(-__INT_FAST16_T_MAX__-1) +-D__UINT_FAST16_T_TYPE__=unsigned int +-D__UINT_FAST16_T_MAX__=0xffffU +-D__INT_FAST16_SIZE_PREFIX__="" +-D__INT_FAST32_T_TYPE__=signed long int +-D__INT_FAST32_T_MAX__=2147483647L +-D__INT_FAST32_T_MIN__=(-__INT_FAST32_T_MAX__-1) +-D__UINT_FAST32_T_TYPE__=unsigned long int +-D__UINT_FAST32_T_MAX__=0xffffffffUL +-D__INT_FAST32_SIZE_PREFIX__="l" +-D__INTMAX_T_TYPE__=signed long int +-D__INTMAX_T_MAX__=2147483647L +-D__INTMAX_T_MIN__=(-__INTMAX_T_MAX__-1) +-D__UINTMAX_T_TYPE__=unsigned long int +-D__UINTMAX_T_MAX__=0xffffffffUL +-D__INTMAX_C_SUFFIX__=L +-D__UINTMAX_C_SUFFIX__=UL +-D__INTMAX_SIZE_PREFIX__="l" +-D__FLOAT_SIZE__=4 +-D__FLOAT_ALIGN__=1 +-D__DOUBLE_SIZE__=4 +-D__DOUBLE_ALIGN__=1 +-D__LONG_DOUBLE_SIZE__=4 +-D__LONG_DOUBLE_ALIGN__=1 +-D__NAN_HAS_HIGH_MANTISSA_BIT_SET__=0 +-D__SUBNORMAL_FLOATING_POINTS__=1 +-D__SIZE_T_TYPE__=unsigned short int +-D__SIZE_T_MAX__=0xffffU +-D__PTRDIFF_T_TYPE__=signed short int +-D__PTRDIFF_T_MAX__=32767 +-D__PTRDIFF_T_MIN__=(-__PTRDIFF_T_MAX__-1) +-D__INTPTR_T_TYPE__=signed short int +-D__INTPTR_T_MAX__=32767 +-D__INTPTR_T_MIN__=(-__INTPTR_T_MAX__-1) +-D__UINTPTR_T_TYPE__=unsigned short int +-D__UINTPTR_T_MAX__=0xffffU +-D__INTPTR_SIZE_PREFIX__="h" +-D__JMP_BUF_ELEMENT_TYPE__=unsigned char +-D__JMP_BUF_NUM_ELEMENTS__=28 +-D__TID__=0x3800 +-D__VER__=210 +-D__SUBVERSION__=1 +-D__BUILD_NUMBER__=148 +-D__IAR_SYSTEMS_ICC__=8 +-D__VA_STACK_DECREASING__=1 +-D__VA_STACK_ALIGN__=1 +-D__VA_STACK_ALIGN_EXTRA_BEFORE__=1 +-D__LITTLE_ENDIAN__=0 +-D__BOOL_TYPE__=unsigned char +-D__WCHAR_T_TYPE__=unsigned short int +-D__WCHAR_T_SIZE__=2 +-D__WCHAR_T_MAX__=0xffffU +-D__DEF_PTR_MEM__=__near +-D__CODE_MEM0__=__near_func +-D__CODE_MEM0_POINTER_OK__=1 +-D__CODE_MEM0_UNIQUE_POINTER__=1 +-D__CODE_MEM0_VAR_OK__=1 +-D__DATA_MEM0__=__tiny +-D__DATA_MEM0_POINTER_OK__=1 +-D__DATA_MEM0_UNIQUE_POINTER__=1 +-D__DATA_MEM0_VAR_OK__=1 +-D__DATA_MEM0_INTPTR_TYPE__=signed char +-D__DATA_MEM0_UINTPTR_TYPE__=unsigned char +-D__DATA_MEM0_INTPTR_SIZE_PREFIX__="hh" +-D__DATA_MEM0_MAX_SIZE__=0xff +-D__DATA_MEM1__=__near +-D__DATA_MEM1_POINTER_OK__=1 +-D__DATA_MEM1_UNIQUE_POINTER__=1 +-D__DATA_MEM1_VAR_OK__=1 +-D__DATA_MEM1_INDEX_TYPE__=short +-D__DATA_MEM1_SIZE_TYPE__=unsigned short +-D__DATA_MEM1_INTPTR_TYPE__=short int +-D__DATA_MEM1_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM1_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM1_MAX_SIZE__=0xffff +-D__DATA_MEM1_HEAP_SEGMENT__="HEAP" +-D__DATA_MEM1_PAGE_SIZE__=0 +-D__DATA_MEM1_HEAP__=1 +-D__DATA_MEM2__=__far +-D__DATA_MEM2_POINTER_OK__=1 +-D__DATA_MEM2_UNIQUE_POINTER__=1 +-D__DATA_MEM2_VAR_OK__=1 +-D__DATA_MEM2_INDEX_TYPE__=short +-D__DATA_MEM2_SIZE_TYPE__=unsigned short +-D__DATA_MEM2_INTPTR_TYPE__=long int +-D__DATA_MEM2_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM2_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM2_MAX_SIZE__=0xffff +-D__DATA_MEM3__=__huge +-D__DATA_MEM3_POINTER_OK__=1 +-D__DATA_MEM3_UNIQUE_POINTER__=1 +-D__DATA_MEM3_VAR_OK__=1 +-D__DATA_MEM3_INDEX_TYPE__=long +-D__DATA_MEM3_SIZE_TYPE__=unsigned long +-D__DATA_MEM3_INTPTR_TYPE__=long int +-D__DATA_MEM3_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM3_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM3_MAX_SIZE__=0xffffffff +-D__DATA_MEM4__=__eeprom +-D__DATA_MEM4_POINTER_OK__=1 +-D__DATA_MEM4_UNIQUE_POINTER__=1 +-D__DATA_MEM4_VAR_OK__=1 +-D__DATA_MEM4_INDEX_TYPE__=short +-D__DATA_MEM4_SIZE_TYPE__=unsigned short +-D__DATA_MEM4_INTPTR_TYPE__=short int +-D__DATA_MEM4_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM4_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM4_MAX_SIZE__=0xffff +-D__HEAP_MEM0__=1 +-D__MULTIPLE_HEAPS__=0 +-D__DEF_HEAP_MEM__=__near +-D__MULTIPLE_INHERITANCE__=1 +-D_RTSL_COMPARE_T=unsigned char +-D__CODE_MODEL__=__SMALL_CODE_MODEL__ +-D__CORE__=__STM8__ +-D__DATA_MODEL__=__MEDIUM_DATA_MODEL__ +-D__ICCSTM8__=1 +-D__LARGE_CODE_MODEL__=3 +-D__LARGE_DATA_MODEL__=3 +-D__MEDIUM_CODE_MODEL__=2 +-D__MEDIUM_DATA_MODEL__=2 +-D__SMALL_CODE_MODEL__=1 +-D__SMALL_DATA_MODEL__=1 +-D__STM8__=1 +-D__PLAIN_INT_BITFIELD_IS_SIGNED__=1 +-D__HAS_WEAK__=1 +-D__HAS_LOCATED_DECLARATION__=1 +-D__HAS_LOCATED_WITH_INIT__=1 +-D__IAR_COMPILERBASE__=594179 +-D_GOANNA=1 +-D__DATE__="May 10 2022" +-D__TIME__="14:41:16" +-D__STDC__=1 +-D__STDC_VERSION__=199901L +-D__STDC_HOSTED__=1 +-D__STDC_NO_VLA__=1 +-D__STDC_NO_ATOMICS__=1 +-D__EDG_IA64_ABI=1 +-D__EDG_IA64_ABI_VARIANT_CTORS_AND_DTORS_RETURN_THIS=1 +-D__EDG_IA64_ABI_USE_INT_STATIC_INIT_GUARD=1 +-D__EDG_TYPE_TRAITS_ENABLED=1 +-D__EDG__=1 +-D__EDG_VERSION__=409 +-D__EDG_SIZE_TYPE__=unsigned short +-D__EDG_PTRDIFF_TYPE__=short +-D__EDG_DELTA_TYPE=short +-D__EDG_IA64_VTABLE_ENTRY_TYPE=short +-D__EDG_VIRTUAL_FUNCTION_INDEX_TYPE=unsigned short +-D__EDG_LOWER_VARIABLE_LENGTH_ARRAYS=1 +-D__EDG_IA64_ABI_USE_VARIANT_ARRAY_COOKIES=1 +-D__EDG_ABI_COMPATIBILITY_VERSION=9999 +-D__EDG_ABI_CHANGES_FOR_RTTI=1 +-D__EDG_ABI_CHANGES_FOR_ARRAY_NEW_AND_DELETE=1 +-D__EDG_ABI_CHANGES_FOR_PLACEMENT_DELETE=1 +-D__EDG_BSD=0 +-D__EDG_SYSV=0 +-D__EDG_ANSIC=1 +-D__EDG_CPP11_IL_EXTENSIONS_SUPPORTED=1 +-D_DLIB_CONFIG_FILE_HEADER_NAME="C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\LIB\dlstm8smn.h" +-D_DLIB_CONFIG_FILE_STRING="C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 7.0\\stm8\\LIB\\dlstm8smn.h" +-D__VERSION__="IAR C/C++ Compiler V2.10.1.148 for STM8" +-D__CODE_MEMORY_LIST1__()=__CODE_MEM_HELPER1__(__code, 0 ) +-D__CODE_MEMORY_LIST2__(_P1)=__CODE_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_MEMORY_LIST3__(_P1, _P2)=__CODE_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_MEMORY_LIST1__()=__DATA_MEM_HELPER1__(__data, 0 ) +-D__DATA_MEMORY_LIST2__(_P1)=__DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_MEMORY_LIST3__(_P1, _P2)=__DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__CODE_PTR_MEMORY_LIST1__()=__CODE_PTR_MEM_HELPER1__(__code, 0 ) +-D__CODE_PTR_MEMORY_LIST2__(_P1)=__CODE_PTR_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_PTR_MEMORY_LIST3__(_P1, _P2)=__CODE_PTR_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_PTR_MEMORY_LIST1__()=__DATA_PTR_MEM_HELPER1__(__data, 0 ) +-D__DATA_PTR_MEMORY_LIST2__(_P1)=__DATA_PTR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_PTR_MEMORY_LIST3__(_P1, _P2)=__DATA_PTR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VAR_MEMORY_LIST1__()=__VAR_MEM_HELPER1__(__data, 0 ) +-D__VAR_MEMORY_LIST2__(_P1)=__VAR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__VAR_MEMORY_LIST3__(_P1, _P2)=__VAR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VARD_MEMORY_LIST1__()=__VARD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAP_MEMORY_LIST1__()=__HEAP_MEM_HELPER1__(__data, 0 ) +-D__HEAP_MEMORY_LIST2__(_P1)=__HEAP_MEM_HELPER2__(__data, 0 , _P1 ) +-D__HEAP_MEMORY_LIST3__(_P1, _P2)=__HEAP_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__HVAR_MEMORY_LIST1__()=__HVAR_MEM_HELPER1__(__data, 0 ) +-D__HEAPD_MEMORY_LIST1__()=__HEAPD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAPU_MEMORY_LIST1__()=__HEAPU_MEM_HELPER1__(__data, 0 ) +-D__TOPM_DATA_MEMORY_LIST1__()= +-D__TOPM_DATA_MEMORY_LIST2__(_P1)= +-D__TOPM_DATA_MEMORY_LIST3__(_P1, _P2)= +-D__TOPP_DATA_MEMORY_LIST1__()=__TOPP_DATA_MEM_HELPER1__(__data, 0 ) +-D__TOPP_DATA_MEMORY_LIST2__(_P1)=__TOPP_DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__TOPP_DATA_MEMORY_LIST3__(_P1, _P2)=__TOPP_DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__DATA_MEM0_SIZE_TYPE__=unsigned int +-D__DATA_MEM0_INDEX_TYPE__=signed int diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart2.pbi.cout b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart2.pbi.cout new file mode 100644 index 0000000..bf35af4 --- /dev/null +++ b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_uart2.pbi.cout @@ -0,0 +1,284 @@ +"E:\STM8\4_EXT_INT_1PORT\4_EXT_INT_1PORT\lib\src\stm8s_uart2.c" +-std=c99 +-ferror-limit=100 +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\inc +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\inc\c +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-D__CHAR_BITS__=8 +-D__CHAR_MAX__=0xff +-D__CHAR_MIN__=0 +-D__CHAR_SIZE__=1 +-D__UNSIGNED_CHAR_MAX__=0xff +-D__SIGNED_CHAR_MAX__=127 +-D__SIGNED_CHAR_MIN__=(-__SIGNED_CHAR_MAX__-1) +-D__CHAR_ALIGN__=1 +-D__SHORT_SIZE__=2 +-D__UNSIGNED_SHORT_MAX__=0xffffU +-D__SIGNED_SHORT_MAX__=32767 +-D__SIGNED_SHORT_MIN__=(-__SIGNED_SHORT_MAX__-1) +-D__SHORT_ALIGN__=1 +-D__INT_SIZE__=2 +-D__UNSIGNED_INT_MAX__=0xffffU +-D__SIGNED_INT_MAX__=32767 +-D__SIGNED_INT_MIN__=(-__SIGNED_INT_MAX__-1) +-D__INT_ALIGN__=1 +-D__LONG_SIZE__=4 +-D__UNSIGNED_LONG_MAX__=0xffffffffUL +-D__SIGNED_LONG_MAX__=2147483647L +-D__SIGNED_LONG_MIN__=(-__SIGNED_LONG_MAX__-1) +-D__LONG_ALIGN__=1 +-D__LONG_LONG_SIZE__=4 +-D__UNSIGNED_LONG_LONG_MAX__=0xffffffffULL +-D__SIGNED_LONG_LONG_MAX__=2147483647LL +-D__SIGNED_LONG_LONG_MIN__=(-__SIGNED_LONG_LONG_MAX__-1) +-D__LONG_LONG_ALIGN__=1 +-D__INT8_T_TYPE__=signed char +-D__INT8_T_MAX__=127 +-D__INT8_T_MIN__=(-__INT8_T_MAX__-1) +-D__UINT8_T_TYPE__=unsigned char +-D__UINT8_T_MAX__=0xff +-D__INT8_SIZE_PREFIX__="hh" +-D__INT16_T_TYPE__=signed int +-D__INT16_T_MAX__=32767 +-D__INT16_T_MIN__=(-__INT16_T_MAX__-1) +-D__UINT16_T_TYPE__=unsigned int +-D__UINT16_T_MAX__=0xffffU +-D__INT16_SIZE_PREFIX__="" +-D__INT32_T_TYPE__=signed long int +-D__INT32_T_MAX__=2147483647L +-D__INT32_T_MIN__=(-__INT32_T_MAX__-1) +-D__UINT32_T_TYPE__=unsigned long int +-D__UINT32_T_MAX__=0xffffffffUL +-D__INT32_SIZE_PREFIX__="l" +-D__INT_LEAST8_T_TYPE__=signed char +-D__INT_LEAST8_T_MAX__=127 +-D__INT_LEAST8_T_MIN__=(-__INT_LEAST8_T_MAX__-1) +-D__UINT_LEAST8_T_TYPE__=unsigned char +-D__UINT_LEAST8_T_MAX__=0xff +-D__INT8_C_SUFFIX__= +-D__UINT8_C_SUFFIX__= +-D__INT_LEAST8_SIZE_PREFIX__="hh" +-D__INT_LEAST16_T_TYPE__=signed int +-D__INT_LEAST16_T_MAX__=32767 +-D__INT_LEAST16_T_MIN__=(-__INT_LEAST16_T_MAX__-1) +-D__UINT_LEAST16_T_TYPE__=unsigned int +-D__UINT_LEAST16_T_MAX__=0xffffU +-D__INT16_C_SUFFIX__= +-D__UINT16_C_SUFFIX__=U +-D__INT_LEAST16_SIZE_PREFIX__="" +-D__INT_LEAST32_T_TYPE__=signed long int +-D__INT_LEAST32_T_MAX__=2147483647L +-D__INT_LEAST32_T_MIN__=(-__INT_LEAST32_T_MAX__-1) +-D__UINT_LEAST32_T_TYPE__=unsigned long int +-D__UINT_LEAST32_T_MAX__=0xffffffffUL +-D__INT32_C_SUFFIX__=L +-D__UINT32_C_SUFFIX__=UL +-D__INT_LEAST32_SIZE_PREFIX__="l" +-D__INT_FAST8_T_TYPE__=signed char +-D__INT_FAST8_T_MAX__=127 +-D__INT_FAST8_T_MIN__=(-__INT_FAST8_T_MAX__-1) +-D__UINT_FAST8_T_TYPE__=unsigned char +-D__UINT_FAST8_T_MAX__=0xff +-D__INT_FAST8_SIZE_PREFIX__="hh" +-D__INT_FAST16_T_TYPE__=signed int +-D__INT_FAST16_T_MAX__=32767 +-D__INT_FAST16_T_MIN__=(-__INT_FAST16_T_MAX__-1) +-D__UINT_FAST16_T_TYPE__=unsigned int +-D__UINT_FAST16_T_MAX__=0xffffU +-D__INT_FAST16_SIZE_PREFIX__="" +-D__INT_FAST32_T_TYPE__=signed long int +-D__INT_FAST32_T_MAX__=2147483647L +-D__INT_FAST32_T_MIN__=(-__INT_FAST32_T_MAX__-1) +-D__UINT_FAST32_T_TYPE__=unsigned long int +-D__UINT_FAST32_T_MAX__=0xffffffffUL +-D__INT_FAST32_SIZE_PREFIX__="l" +-D__INTMAX_T_TYPE__=signed long int +-D__INTMAX_T_MAX__=2147483647L +-D__INTMAX_T_MIN__=(-__INTMAX_T_MAX__-1) +-D__UINTMAX_T_TYPE__=unsigned long int +-D__UINTMAX_T_MAX__=0xffffffffUL +-D__INTMAX_C_SUFFIX__=L +-D__UINTMAX_C_SUFFIX__=UL +-D__INTMAX_SIZE_PREFIX__="l" +-D__FLOAT_SIZE__=4 +-D__FLOAT_ALIGN__=1 +-D__DOUBLE_SIZE__=4 +-D__DOUBLE_ALIGN__=1 +-D__LONG_DOUBLE_SIZE__=4 +-D__LONG_DOUBLE_ALIGN__=1 +-D__NAN_HAS_HIGH_MANTISSA_BIT_SET__=0 +-D__SUBNORMAL_FLOATING_POINTS__=1 +-D__SIZE_T_TYPE__=unsigned short int +-D__SIZE_T_MAX__=0xffffU +-D__PTRDIFF_T_TYPE__=signed short int +-D__PTRDIFF_T_MAX__=32767 +-D__PTRDIFF_T_MIN__=(-__PTRDIFF_T_MAX__-1) +-D__INTPTR_T_TYPE__=signed short int +-D__INTPTR_T_MAX__=32767 +-D__INTPTR_T_MIN__=(-__INTPTR_T_MAX__-1) +-D__UINTPTR_T_TYPE__=unsigned short int +-D__UINTPTR_T_MAX__=0xffffU +-D__INTPTR_SIZE_PREFIX__="h" +-D__JMP_BUF_ELEMENT_TYPE__=unsigned char +-D__JMP_BUF_NUM_ELEMENTS__=28 +-D__TID__=0x3800 +-D__VER__=210 +-D__SUBVERSION__=1 +-D__BUILD_NUMBER__=148 +-D__IAR_SYSTEMS_ICC__=8 +-D__VA_STACK_DECREASING__=1 +-D__VA_STACK_ALIGN__=1 +-D__VA_STACK_ALIGN_EXTRA_BEFORE__=1 +-D__LITTLE_ENDIAN__=0 +-D__BOOL_TYPE__=unsigned char +-D__WCHAR_T_TYPE__=unsigned short int +-D__WCHAR_T_SIZE__=2 +-D__WCHAR_T_MAX__=0xffffU +-D__DEF_PTR_MEM__=__near +-D__CODE_MEM0__=__near_func +-D__CODE_MEM0_POINTER_OK__=1 +-D__CODE_MEM0_UNIQUE_POINTER__=1 +-D__CODE_MEM0_VAR_OK__=1 +-D__DATA_MEM0__=__tiny +-D__DATA_MEM0_POINTER_OK__=1 +-D__DATA_MEM0_UNIQUE_POINTER__=1 +-D__DATA_MEM0_VAR_OK__=1 +-D__DATA_MEM0_INTPTR_TYPE__=signed char +-D__DATA_MEM0_UINTPTR_TYPE__=unsigned char +-D__DATA_MEM0_INTPTR_SIZE_PREFIX__="hh" +-D__DATA_MEM0_MAX_SIZE__=0xff +-D__DATA_MEM1__=__near +-D__DATA_MEM1_POINTER_OK__=1 +-D__DATA_MEM1_UNIQUE_POINTER__=1 +-D__DATA_MEM1_VAR_OK__=1 +-D__DATA_MEM1_INDEX_TYPE__=short +-D__DATA_MEM1_SIZE_TYPE__=unsigned short +-D__DATA_MEM1_INTPTR_TYPE__=short int +-D__DATA_MEM1_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM1_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM1_MAX_SIZE__=0xffff +-D__DATA_MEM1_HEAP_SEGMENT__="HEAP" +-D__DATA_MEM1_PAGE_SIZE__=0 +-D__DATA_MEM1_HEAP__=1 +-D__DATA_MEM2__=__far +-D__DATA_MEM2_POINTER_OK__=1 +-D__DATA_MEM2_UNIQUE_POINTER__=1 +-D__DATA_MEM2_VAR_OK__=1 +-D__DATA_MEM2_INDEX_TYPE__=short +-D__DATA_MEM2_SIZE_TYPE__=unsigned short +-D__DATA_MEM2_INTPTR_TYPE__=long int +-D__DATA_MEM2_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM2_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM2_MAX_SIZE__=0xffff +-D__DATA_MEM3__=__huge +-D__DATA_MEM3_POINTER_OK__=1 +-D__DATA_MEM3_UNIQUE_POINTER__=1 +-D__DATA_MEM3_VAR_OK__=1 +-D__DATA_MEM3_INDEX_TYPE__=long +-D__DATA_MEM3_SIZE_TYPE__=unsigned long +-D__DATA_MEM3_INTPTR_TYPE__=long int +-D__DATA_MEM3_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM3_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM3_MAX_SIZE__=0xffffffff +-D__DATA_MEM4__=__eeprom +-D__DATA_MEM4_POINTER_OK__=1 +-D__DATA_MEM4_UNIQUE_POINTER__=1 +-D__DATA_MEM4_VAR_OK__=1 +-D__DATA_MEM4_INDEX_TYPE__=short +-D__DATA_MEM4_SIZE_TYPE__=unsigned short +-D__DATA_MEM4_INTPTR_TYPE__=short int +-D__DATA_MEM4_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM4_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM4_MAX_SIZE__=0xffff +-D__HEAP_MEM0__=1 +-D__MULTIPLE_HEAPS__=0 +-D__DEF_HEAP_MEM__=__near +-D__MULTIPLE_INHERITANCE__=1 +-D_RTSL_COMPARE_T=unsigned char +-D__CODE_MODEL__=__SMALL_CODE_MODEL__ +-D__CORE__=__STM8__ +-D__DATA_MODEL__=__MEDIUM_DATA_MODEL__ +-D__ICCSTM8__=1 +-D__LARGE_CODE_MODEL__=3 +-D__LARGE_DATA_MODEL__=3 +-D__MEDIUM_CODE_MODEL__=2 +-D__MEDIUM_DATA_MODEL__=2 +-D__SMALL_CODE_MODEL__=1 +-D__SMALL_DATA_MODEL__=1 +-D__STM8__=1 +-D__PLAIN_INT_BITFIELD_IS_SIGNED__=1 +-D__HAS_WEAK__=1 +-D__HAS_LOCATED_DECLARATION__=1 +-D__HAS_LOCATED_WITH_INIT__=1 +-D__IAR_COMPILERBASE__=594179 +-D_GOANNA=1 +-D__DATE__="May 5 2022" +-D__TIME__="21:50:38" +-D__STDC__=1 +-D__STDC_VERSION__=199901L +-D__STDC_HOSTED__=1 +-D__STDC_NO_VLA__=1 +-D__STDC_NO_ATOMICS__=1 +-D__EDG_IA64_ABI=1 +-D__EDG_IA64_ABI_VARIANT_CTORS_AND_DTORS_RETURN_THIS=1 +-D__EDG_IA64_ABI_USE_INT_STATIC_INIT_GUARD=1 +-D__EDG_TYPE_TRAITS_ENABLED=1 +-D__EDG__=1 +-D__EDG_VERSION__=409 +-D__EDG_SIZE_TYPE__=unsigned short +-D__EDG_PTRDIFF_TYPE__=short +-D__EDG_DELTA_TYPE=short +-D__EDG_IA64_VTABLE_ENTRY_TYPE=short +-D__EDG_VIRTUAL_FUNCTION_INDEX_TYPE=unsigned short +-D__EDG_LOWER_VARIABLE_LENGTH_ARRAYS=1 +-D__EDG_IA64_ABI_USE_VARIANT_ARRAY_COOKIES=1 +-D__EDG_ABI_COMPATIBILITY_VERSION=9999 +-D__EDG_ABI_CHANGES_FOR_RTTI=1 +-D__EDG_ABI_CHANGES_FOR_ARRAY_NEW_AND_DELETE=1 +-D__EDG_ABI_CHANGES_FOR_PLACEMENT_DELETE=1 +-D__EDG_BSD=0 +-D__EDG_SYSV=0 +-D__EDG_ANSIC=1 +-D__EDG_CPP11_IL_EXTENSIONS_SUPPORTED=1 +-D_DLIB_CONFIG_FILE_HEADER_NAME="C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\LIB\dlstm8smn.h" +-D_DLIB_CONFIG_FILE_STRING="C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 7.0\\stm8\\LIB\\dlstm8smn.h" +-D__VERSION__="IAR C/C++ Compiler V2.10.1.148 for STM8" +-D__CODE_MEMORY_LIST1__()=__CODE_MEM_HELPER1__(__code, 0 ) +-D__CODE_MEMORY_LIST2__(_P1)=__CODE_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_MEMORY_LIST3__(_P1, _P2)=__CODE_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_MEMORY_LIST1__()=__DATA_MEM_HELPER1__(__data, 0 ) +-D__DATA_MEMORY_LIST2__(_P1)=__DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_MEMORY_LIST3__(_P1, _P2)=__DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__CODE_PTR_MEMORY_LIST1__()=__CODE_PTR_MEM_HELPER1__(__code, 0 ) +-D__CODE_PTR_MEMORY_LIST2__(_P1)=__CODE_PTR_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_PTR_MEMORY_LIST3__(_P1, _P2)=__CODE_PTR_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_PTR_MEMORY_LIST1__()=__DATA_PTR_MEM_HELPER1__(__data, 0 ) +-D__DATA_PTR_MEMORY_LIST2__(_P1)=__DATA_PTR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_PTR_MEMORY_LIST3__(_P1, _P2)=__DATA_PTR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VAR_MEMORY_LIST1__()=__VAR_MEM_HELPER1__(__data, 0 ) +-D__VAR_MEMORY_LIST2__(_P1)=__VAR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__VAR_MEMORY_LIST3__(_P1, _P2)=__VAR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VARD_MEMORY_LIST1__()=__VARD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAP_MEMORY_LIST1__()=__HEAP_MEM_HELPER1__(__data, 0 ) +-D__HEAP_MEMORY_LIST2__(_P1)=__HEAP_MEM_HELPER2__(__data, 0 , _P1 ) +-D__HEAP_MEMORY_LIST3__(_P1, _P2)=__HEAP_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__HVAR_MEMORY_LIST1__()=__HVAR_MEM_HELPER1__(__data, 0 ) +-D__HEAPD_MEMORY_LIST1__()=__HEAPD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAPU_MEMORY_LIST1__()=__HEAPU_MEM_HELPER1__(__data, 0 ) +-D__TOPM_DATA_MEMORY_LIST1__()= +-D__TOPM_DATA_MEMORY_LIST2__(_P1)= +-D__TOPM_DATA_MEMORY_LIST3__(_P1, _P2)= +-D__TOPP_DATA_MEMORY_LIST1__()=__TOPP_DATA_MEM_HELPER1__(__data, 0 ) +-D__TOPP_DATA_MEMORY_LIST2__(_P1)=__TOPP_DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__TOPP_DATA_MEMORY_LIST3__(_P1, _P2)=__TOPP_DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__DATA_MEM0_SIZE_TYPE__=unsigned int +-D__DATA_MEM0_INDEX_TYPE__=signed int diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/uart.pbi.cout b/4_EXT_INT_1PORT/user/Debug/Obj/uart.pbi.cout new file mode 100644 index 0000000..3e9a420 --- /dev/null +++ b/4_EXT_INT_1PORT/user/Debug/Obj/uart.pbi.cout @@ -0,0 +1,284 @@ +"E:\STM8\4_EXT_INT_1PORT\4_EXT_INT_1PORT\user\uart.c" +-std=c99 +-ferror-limit=100 +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\inc +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\inc\c +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-D__CHAR_BITS__=8 +-D__CHAR_MAX__=0xff +-D__CHAR_MIN__=0 +-D__CHAR_SIZE__=1 +-D__UNSIGNED_CHAR_MAX__=0xff +-D__SIGNED_CHAR_MAX__=127 +-D__SIGNED_CHAR_MIN__=(-__SIGNED_CHAR_MAX__-1) +-D__CHAR_ALIGN__=1 +-D__SHORT_SIZE__=2 +-D__UNSIGNED_SHORT_MAX__=0xffffU +-D__SIGNED_SHORT_MAX__=32767 +-D__SIGNED_SHORT_MIN__=(-__SIGNED_SHORT_MAX__-1) +-D__SHORT_ALIGN__=1 +-D__INT_SIZE__=2 +-D__UNSIGNED_INT_MAX__=0xffffU +-D__SIGNED_INT_MAX__=32767 +-D__SIGNED_INT_MIN__=(-__SIGNED_INT_MAX__-1) +-D__INT_ALIGN__=1 +-D__LONG_SIZE__=4 +-D__UNSIGNED_LONG_MAX__=0xffffffffUL +-D__SIGNED_LONG_MAX__=2147483647L +-D__SIGNED_LONG_MIN__=(-__SIGNED_LONG_MAX__-1) +-D__LONG_ALIGN__=1 +-D__LONG_LONG_SIZE__=4 +-D__UNSIGNED_LONG_LONG_MAX__=0xffffffffULL +-D__SIGNED_LONG_LONG_MAX__=2147483647LL +-D__SIGNED_LONG_LONG_MIN__=(-__SIGNED_LONG_LONG_MAX__-1) +-D__LONG_LONG_ALIGN__=1 +-D__INT8_T_TYPE__=signed char +-D__INT8_T_MAX__=127 +-D__INT8_T_MIN__=(-__INT8_T_MAX__-1) +-D__UINT8_T_TYPE__=unsigned char +-D__UINT8_T_MAX__=0xff +-D__INT8_SIZE_PREFIX__="hh" +-D__INT16_T_TYPE__=signed int +-D__INT16_T_MAX__=32767 +-D__INT16_T_MIN__=(-__INT16_T_MAX__-1) +-D__UINT16_T_TYPE__=unsigned int +-D__UINT16_T_MAX__=0xffffU +-D__INT16_SIZE_PREFIX__="" +-D__INT32_T_TYPE__=signed long int +-D__INT32_T_MAX__=2147483647L +-D__INT32_T_MIN__=(-__INT32_T_MAX__-1) +-D__UINT32_T_TYPE__=unsigned long int +-D__UINT32_T_MAX__=0xffffffffUL +-D__INT32_SIZE_PREFIX__="l" +-D__INT_LEAST8_T_TYPE__=signed char +-D__INT_LEAST8_T_MAX__=127 +-D__INT_LEAST8_T_MIN__=(-__INT_LEAST8_T_MAX__-1) +-D__UINT_LEAST8_T_TYPE__=unsigned char +-D__UINT_LEAST8_T_MAX__=0xff +-D__INT8_C_SUFFIX__= +-D__UINT8_C_SUFFIX__= +-D__INT_LEAST8_SIZE_PREFIX__="hh" +-D__INT_LEAST16_T_TYPE__=signed int +-D__INT_LEAST16_T_MAX__=32767 +-D__INT_LEAST16_T_MIN__=(-__INT_LEAST16_T_MAX__-1) +-D__UINT_LEAST16_T_TYPE__=unsigned int +-D__UINT_LEAST16_T_MAX__=0xffffU +-D__INT16_C_SUFFIX__= +-D__UINT16_C_SUFFIX__=U +-D__INT_LEAST16_SIZE_PREFIX__="" +-D__INT_LEAST32_T_TYPE__=signed long int +-D__INT_LEAST32_T_MAX__=2147483647L +-D__INT_LEAST32_T_MIN__=(-__INT_LEAST32_T_MAX__-1) +-D__UINT_LEAST32_T_TYPE__=unsigned long int +-D__UINT_LEAST32_T_MAX__=0xffffffffUL +-D__INT32_C_SUFFIX__=L +-D__UINT32_C_SUFFIX__=UL +-D__INT_LEAST32_SIZE_PREFIX__="l" +-D__INT_FAST8_T_TYPE__=signed char +-D__INT_FAST8_T_MAX__=127 +-D__INT_FAST8_T_MIN__=(-__INT_FAST8_T_MAX__-1) +-D__UINT_FAST8_T_TYPE__=unsigned char +-D__UINT_FAST8_T_MAX__=0xff +-D__INT_FAST8_SIZE_PREFIX__="hh" +-D__INT_FAST16_T_TYPE__=signed int +-D__INT_FAST16_T_MAX__=32767 +-D__INT_FAST16_T_MIN__=(-__INT_FAST16_T_MAX__-1) +-D__UINT_FAST16_T_TYPE__=unsigned int +-D__UINT_FAST16_T_MAX__=0xffffU +-D__INT_FAST16_SIZE_PREFIX__="" +-D__INT_FAST32_T_TYPE__=signed long int +-D__INT_FAST32_T_MAX__=2147483647L +-D__INT_FAST32_T_MIN__=(-__INT_FAST32_T_MAX__-1) +-D__UINT_FAST32_T_TYPE__=unsigned long int +-D__UINT_FAST32_T_MAX__=0xffffffffUL +-D__INT_FAST32_SIZE_PREFIX__="l" +-D__INTMAX_T_TYPE__=signed long int +-D__INTMAX_T_MAX__=2147483647L +-D__INTMAX_T_MIN__=(-__INTMAX_T_MAX__-1) +-D__UINTMAX_T_TYPE__=unsigned long int +-D__UINTMAX_T_MAX__=0xffffffffUL +-D__INTMAX_C_SUFFIX__=L +-D__UINTMAX_C_SUFFIX__=UL +-D__INTMAX_SIZE_PREFIX__="l" +-D__FLOAT_SIZE__=4 +-D__FLOAT_ALIGN__=1 +-D__DOUBLE_SIZE__=4 +-D__DOUBLE_ALIGN__=1 +-D__LONG_DOUBLE_SIZE__=4 +-D__LONG_DOUBLE_ALIGN__=1 +-D__NAN_HAS_HIGH_MANTISSA_BIT_SET__=0 +-D__SUBNORMAL_FLOATING_POINTS__=1 +-D__SIZE_T_TYPE__=unsigned short int +-D__SIZE_T_MAX__=0xffffU +-D__PTRDIFF_T_TYPE__=signed short int +-D__PTRDIFF_T_MAX__=32767 +-D__PTRDIFF_T_MIN__=(-__PTRDIFF_T_MAX__-1) +-D__INTPTR_T_TYPE__=signed short int +-D__INTPTR_T_MAX__=32767 +-D__INTPTR_T_MIN__=(-__INTPTR_T_MAX__-1) +-D__UINTPTR_T_TYPE__=unsigned short int +-D__UINTPTR_T_MAX__=0xffffU +-D__INTPTR_SIZE_PREFIX__="h" +-D__JMP_BUF_ELEMENT_TYPE__=unsigned char +-D__JMP_BUF_NUM_ELEMENTS__=28 +-D__TID__=0x3800 +-D__VER__=210 +-D__SUBVERSION__=1 +-D__BUILD_NUMBER__=148 +-D__IAR_SYSTEMS_ICC__=8 +-D__VA_STACK_DECREASING__=1 +-D__VA_STACK_ALIGN__=1 +-D__VA_STACK_ALIGN_EXTRA_BEFORE__=1 +-D__LITTLE_ENDIAN__=0 +-D__BOOL_TYPE__=unsigned char +-D__WCHAR_T_TYPE__=unsigned short int +-D__WCHAR_T_SIZE__=2 +-D__WCHAR_T_MAX__=0xffffU +-D__DEF_PTR_MEM__=__near +-D__CODE_MEM0__=__near_func +-D__CODE_MEM0_POINTER_OK__=1 +-D__CODE_MEM0_UNIQUE_POINTER__=1 +-D__CODE_MEM0_VAR_OK__=1 +-D__DATA_MEM0__=__tiny +-D__DATA_MEM0_POINTER_OK__=1 +-D__DATA_MEM0_UNIQUE_POINTER__=1 +-D__DATA_MEM0_VAR_OK__=1 +-D__DATA_MEM0_INTPTR_TYPE__=signed char +-D__DATA_MEM0_UINTPTR_TYPE__=unsigned char +-D__DATA_MEM0_INTPTR_SIZE_PREFIX__="hh" +-D__DATA_MEM0_MAX_SIZE__=0xff +-D__DATA_MEM1__=__near +-D__DATA_MEM1_POINTER_OK__=1 +-D__DATA_MEM1_UNIQUE_POINTER__=1 +-D__DATA_MEM1_VAR_OK__=1 +-D__DATA_MEM1_INDEX_TYPE__=short +-D__DATA_MEM1_SIZE_TYPE__=unsigned short +-D__DATA_MEM1_INTPTR_TYPE__=short int +-D__DATA_MEM1_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM1_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM1_MAX_SIZE__=0xffff +-D__DATA_MEM1_HEAP_SEGMENT__="HEAP" +-D__DATA_MEM1_PAGE_SIZE__=0 +-D__DATA_MEM1_HEAP__=1 +-D__DATA_MEM2__=__far +-D__DATA_MEM2_POINTER_OK__=1 +-D__DATA_MEM2_UNIQUE_POINTER__=1 +-D__DATA_MEM2_VAR_OK__=1 +-D__DATA_MEM2_INDEX_TYPE__=short +-D__DATA_MEM2_SIZE_TYPE__=unsigned short +-D__DATA_MEM2_INTPTR_TYPE__=long int +-D__DATA_MEM2_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM2_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM2_MAX_SIZE__=0xffff +-D__DATA_MEM3__=__huge +-D__DATA_MEM3_POINTER_OK__=1 +-D__DATA_MEM3_UNIQUE_POINTER__=1 +-D__DATA_MEM3_VAR_OK__=1 +-D__DATA_MEM3_INDEX_TYPE__=long +-D__DATA_MEM3_SIZE_TYPE__=unsigned long +-D__DATA_MEM3_INTPTR_TYPE__=long int +-D__DATA_MEM3_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM3_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM3_MAX_SIZE__=0xffffffff +-D__DATA_MEM4__=__eeprom +-D__DATA_MEM4_POINTER_OK__=1 +-D__DATA_MEM4_UNIQUE_POINTER__=1 +-D__DATA_MEM4_VAR_OK__=1 +-D__DATA_MEM4_INDEX_TYPE__=short +-D__DATA_MEM4_SIZE_TYPE__=unsigned short +-D__DATA_MEM4_INTPTR_TYPE__=short int +-D__DATA_MEM4_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM4_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM4_MAX_SIZE__=0xffff +-D__HEAP_MEM0__=1 +-D__MULTIPLE_HEAPS__=0 +-D__DEF_HEAP_MEM__=__near +-D__MULTIPLE_INHERITANCE__=1 +-D_RTSL_COMPARE_T=unsigned char +-D__CODE_MODEL__=__SMALL_CODE_MODEL__ +-D__CORE__=__STM8__ +-D__DATA_MODEL__=__MEDIUM_DATA_MODEL__ +-D__ICCSTM8__=1 +-D__LARGE_CODE_MODEL__=3 +-D__LARGE_DATA_MODEL__=3 +-D__MEDIUM_CODE_MODEL__=2 +-D__MEDIUM_DATA_MODEL__=2 +-D__SMALL_CODE_MODEL__=1 +-D__SMALL_DATA_MODEL__=1 +-D__STM8__=1 +-D__PLAIN_INT_BITFIELD_IS_SIGNED__=1 +-D__HAS_WEAK__=1 +-D__HAS_LOCATED_DECLARATION__=1 +-D__HAS_LOCATED_WITH_INIT__=1 +-D__IAR_COMPILERBASE__=594179 +-D_GOANNA=1 +-D__DATE__="May 5 2022" +-D__TIME__="22:01:56" +-D__STDC__=1 +-D__STDC_VERSION__=199901L +-D__STDC_HOSTED__=1 +-D__STDC_NO_VLA__=1 +-D__STDC_NO_ATOMICS__=1 +-D__EDG_IA64_ABI=1 +-D__EDG_IA64_ABI_VARIANT_CTORS_AND_DTORS_RETURN_THIS=1 +-D__EDG_IA64_ABI_USE_INT_STATIC_INIT_GUARD=1 +-D__EDG_TYPE_TRAITS_ENABLED=1 +-D__EDG__=1 +-D__EDG_VERSION__=409 +-D__EDG_SIZE_TYPE__=unsigned short +-D__EDG_PTRDIFF_TYPE__=short +-D__EDG_DELTA_TYPE=short +-D__EDG_IA64_VTABLE_ENTRY_TYPE=short +-D__EDG_VIRTUAL_FUNCTION_INDEX_TYPE=unsigned short +-D__EDG_LOWER_VARIABLE_LENGTH_ARRAYS=1 +-D__EDG_IA64_ABI_USE_VARIANT_ARRAY_COOKIES=1 +-D__EDG_ABI_COMPATIBILITY_VERSION=9999 +-D__EDG_ABI_CHANGES_FOR_RTTI=1 +-D__EDG_ABI_CHANGES_FOR_ARRAY_NEW_AND_DELETE=1 +-D__EDG_ABI_CHANGES_FOR_PLACEMENT_DELETE=1 +-D__EDG_BSD=0 +-D__EDG_SYSV=0 +-D__EDG_ANSIC=1 +-D__EDG_CPP11_IL_EXTENSIONS_SUPPORTED=1 +-D_DLIB_CONFIG_FILE_HEADER_NAME="C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\LIB\dlstm8smn.h" +-D_DLIB_CONFIG_FILE_STRING="C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 7.0\\stm8\\LIB\\dlstm8smn.h" +-D__VERSION__="IAR C/C++ Compiler V2.10.1.148 for STM8" +-D__CODE_MEMORY_LIST1__()=__CODE_MEM_HELPER1__(__code, 0 ) +-D__CODE_MEMORY_LIST2__(_P1)=__CODE_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_MEMORY_LIST3__(_P1, _P2)=__CODE_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_MEMORY_LIST1__()=__DATA_MEM_HELPER1__(__data, 0 ) +-D__DATA_MEMORY_LIST2__(_P1)=__DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_MEMORY_LIST3__(_P1, _P2)=__DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__CODE_PTR_MEMORY_LIST1__()=__CODE_PTR_MEM_HELPER1__(__code, 0 ) +-D__CODE_PTR_MEMORY_LIST2__(_P1)=__CODE_PTR_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_PTR_MEMORY_LIST3__(_P1, _P2)=__CODE_PTR_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_PTR_MEMORY_LIST1__()=__DATA_PTR_MEM_HELPER1__(__data, 0 ) +-D__DATA_PTR_MEMORY_LIST2__(_P1)=__DATA_PTR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_PTR_MEMORY_LIST3__(_P1, _P2)=__DATA_PTR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VAR_MEMORY_LIST1__()=__VAR_MEM_HELPER1__(__data, 0 ) +-D__VAR_MEMORY_LIST2__(_P1)=__VAR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__VAR_MEMORY_LIST3__(_P1, _P2)=__VAR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VARD_MEMORY_LIST1__()=__VARD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAP_MEMORY_LIST1__()=__HEAP_MEM_HELPER1__(__data, 0 ) +-D__HEAP_MEMORY_LIST2__(_P1)=__HEAP_MEM_HELPER2__(__data, 0 , _P1 ) +-D__HEAP_MEMORY_LIST3__(_P1, _P2)=__HEAP_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__HVAR_MEMORY_LIST1__()=__HVAR_MEM_HELPER1__(__data, 0 ) +-D__HEAPD_MEMORY_LIST1__()=__HEAPD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAPU_MEMORY_LIST1__()=__HEAPU_MEM_HELPER1__(__data, 0 ) +-D__TOPM_DATA_MEMORY_LIST1__()= +-D__TOPM_DATA_MEMORY_LIST2__(_P1)= +-D__TOPM_DATA_MEMORY_LIST3__(_P1, _P2)= +-D__TOPP_DATA_MEMORY_LIST1__()=__TOPP_DATA_MEM_HELPER1__(__data, 0 ) +-D__TOPP_DATA_MEMORY_LIST2__(_P1)=__TOPP_DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__TOPP_DATA_MEMORY_LIST3__(_P1, _P2)=__TOPP_DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__DATA_MEM0_SIZE_TYPE__=unsigned int +-D__DATA_MEM0_INDEX_TYPE__=signed int diff --git a/4_EXT_INT_1PORT/user/EXT_INT_1PORT.dep b/4_EXT_INT_1PORT/user/EXT_INT_1PORT.dep new file mode 100644 index 0000000..83edf6a --- /dev/null +++ b/4_EXT_INT_1PORT/user/EXT_INT_1PORT.dep @@ -0,0 +1,274 @@ + + + + 2 + 227320415 + + Debug + + $PROJ_DIR$\Debug\Obj\uart.o + $PROJ_DIR$\uart.c + $PROJ_DIR$\..\lib\src\stm8s_uart2.c + $PROJ_DIR$\Debug\Exe\EXT_INT_1PORT.out + $PROJ_DIR$\Debug\Obj\stm8s_uart2.o + $PROJ_DIR$\Debug\Obj\stm8s_uart1.o + $TOOLKIT_DIR$\inc\c\stdio.h + $PROJ_DIR$\Debug\Obj\EXT_INT_1PORT.pbd + $PROJ_DIR$\Debug\Obj\stm8s_beep.pbi + $PROJ_DIR$\..\lib\inc\stm8s_spi.h + $PROJ_DIR$\..\lib\inc\stm8s_rst.h + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\..\lib\inc\stm8s_iwdg.h + $PROJ_DIR$\Debug\Obj\stm8s_uart2.pbi + $PROJ_DIR$\..\lib\inc\stm8s_tim2.h + $PROJ_DIR$\Debug\Obj\stm8s_exti.pbi + $PROJ_DIR$\Debug\Obj\stm8s_uart1.pbi + $PROJ_DIR$\..\lib\inc\stm8s_gpio.h + $PROJ_DIR$\..\lib\inc\stm8s_i2c.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\..\lib\inc\stm8s_tim1.h + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\stdbool.h + $PROJ_DIR$\stm8s103_serial.h + $TOOLKIT_DIR$\lib\dlstm8smn.a + $PROJ_DIR$\..\lib\inc\stm8s_awu.h + $PROJ_DIR$\Debug\Obj\stm8s_tim4.o + $PROJ_DIR$\..\lib\inc\stm8s_uart2.h + $PROJ_DIR$\Debug\Obj\main.pbi + $PROJ_DIR$\..\lib\inc\stm8s_wwdg.h + $PROJ_DIR$\Debug\Obj\stm8s_gpio.o + $PROJ_DIR$\Debug\Obj\stm8s_it.pbi + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\main.c + $PROJ_DIR$\Debug\Obj\stm8s_beep.o + $PROJ_DIR$\..\lib\src\stm8s_exti.c + $PROJ_DIR$\stm8s_conf.h + $PROJ_DIR$\..\lib\src\stm8s_clk.c + $PROJ_DIR$\..\lib\src\stm8s_beep.c + $PROJ_DIR$\..\lib\src\stm8s_gpio.c + $PROJ_DIR$\stm8s_it.h + $PROJ_DIR$\..\lib\src\stm8s_tim4.c + $PROJ_DIR$\..\lib\src\stm8s_uart1.c + $PROJ_DIR$\Debug\Obj\stm8s_clk.pbi + $TOOLKIT_DIR$\inc\c\ystdio.h + $PROJ_DIR$\..\lib\inc\stm8s_clk.h + $PROJ_DIR$\..\lib\inc\stm8s_adc1.h + $PROJ_DIR$\..\lib\inc\stm8s_itc.h + $PROJ_DIR$\Debug\Obj\main.o + $TOOLKIT_DIR$\lib\dbgstm8smd.a + $PROJ_DIR$\Debug\Obj\uart.pbi + $PROJ_DIR$\Debug\Obj\stm8s_exti.o + $PROJ_DIR$\..\lib\inc\stm8s_tim4.h + $PROJ_DIR$\Debug\Obj\stm8s_clk.o + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\uart.h + $PROJ_DIR$\Debug\Exe\EXT_INT_1PORT.s19 + $TOOLKIT_DIR$\lib\dlstm8smn.h + $PROJ_DIR$\Debug\Obj\stm8s_tim4.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\..\lib\inc\stm8s_exti.h + $PROJ_DIR$\stm8s_it.c + $PROJ_DIR$\Debug\Obj\stm8s_gpio.pbi + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\..\lib\inc\stm8s.h + $TOOLKIT_DIR$\config\lnkstm8s003f3.icf + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\..\lib\inc\stm8s_beep.h + $PROJ_DIR$\..\lib\inc\stm8s_uart1.h + $PROJ_DIR$\..\lib\inc\stm8s_flash.h + + + $PROJ_DIR$\uart.c + + + BICOMP + 50 + + + ICCSTM8 + 0 + + + + + BICOMP + 52 65 17 68 10 27 36 59 46 61 47 20 69 45 25 70 18 12 9 14 29 55 + + + + + $PROJ_DIR$\..\lib\src\stm8s_uart2.c + + + BICOMP + 13 + + + ICCSTM8 + 4 + + + + + $PROJ_DIR$\Debug\Exe\EXT_INT_1PORT.out + + + OBJCOPY + 56 + + + + + ILINK + 66 48 34 53 51 30 26 5 24 49 + + + + + [ROOT_NODE] + + + ILINK + 3 + + + + + $PROJ_DIR$\main.c + + + BICOMP + 28 + + + ICCSTM8 + 48 34 53 51 30 26 5 + + + + + BICOMP + 65 47 19 55 46 69 57 27 61 20 21 11 67 22 6 64 36 59 68 17 10 52 54 60 45 25 70 18 12 9 14 29 44 32 + + + ICCSTM8 + 65 36 46 25 68 45 61 70 17 18 47 12 10 9 20 14 52 69 29 59 22 27 6 19 67 54 57 60 32 11 21 44 55 64 38 37 35 39 41 42 + + + + + $PROJ_DIR$\..\lib\src\stm8s_exti.c + + + BICOMP + 15 + + + + + BICOMP + 61 65 36 46 25 68 45 70 17 18 47 12 10 9 20 14 52 69 29 59 + + + + + $PROJ_DIR$\..\lib\src\stm8s_clk.c + + + BICOMP + 43 + + + + + BICOMP + 45 65 36 46 25 68 61 70 17 18 47 12 10 9 20 14 52 69 29 59 + + + + + $PROJ_DIR$\..\lib\src\stm8s_beep.c + + + BICOMP + 8 + + + + + $PROJ_DIR$\..\lib\src\stm8s_gpio.c + + + BICOMP + 63 + + + + + BICOMP + 17 65 36 46 25 68 45 61 70 18 47 12 10 9 20 14 52 69 29 59 + + + + + $PROJ_DIR$\..\lib\src\stm8s_tim4.c + + + BICOMP + 58 + + + + + $PROJ_DIR$\..\lib\src\stm8s_uart1.c + + + BICOMP + 16 + + + + + $PROJ_DIR$\stm8s_it.c + + + BICOMP + 31 + + + + + BICOMP + 19 29 25 65 12 70 14 40 45 18 9 54 60 23 36 59 46 68 61 17 47 10 20 52 69 21 11 57 67 6 44 32 + + + + + $PROJ_DIR$\..\lib\src\stm8s_exti.c + ICCSTM8 + + + $PROJ_DIR$\..\lib\src\stm8s_clk.c + ICCSTM8 + + + $PROJ_DIR$\..\lib\src\stm8s_gpio.c + ICCSTM8 + + + $PROJ_DIR$\stm8s_it.c + ICCSTM8 + + + + Release + + + [MULTI_TOOL] + ILINK + + + + + diff --git a/4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewd b/4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewd new file mode 100644 index 0000000..e54f91e --- /dev/null +++ b/4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewd @@ -0,0 +1,465 @@ + + + + 2 + + Debug + + STM8 + + 1 + + C-SPY + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + SIMULATOR_STM8 + 1 + + 0 + 1 + 1 + + + + + STICE_STM8 + 3 + + 2 + 1 + 1 + + + + + + + + + + + + + STLINK_STM8 + 3 + + 2 + 1 + 1 + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + STM8 + + 0 + + C-SPY + 1 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + SIMULATOR_STM8 + 1 + + 0 + 1 + 0 + + + + + STICE_STM8 + 3 + + 2 + 1 + 0 + + + + + + + + + + + + + STLINK_STM8 + 3 + + 2 + 1 + 0 + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + + diff --git a/4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewp b/4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewp new file mode 100644 index 0000000..320c956 --- /dev/null +++ b/4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewp @@ -0,0 +1,1628 @@ + + + + 2 + + Debug + + STM8 + + 1 + + General + 4 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCSTM8 + 3 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ASTM8 + 3 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 0 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 3 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 3 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + STM8 + + 0 + + General + 4 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCSTM8 + 3 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ASTM8 + 3 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 0 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 3 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 3 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Debug + + + lib + + $PROJ_DIR$\..\lib\src\stm8s_clk.c + + + $PROJ_DIR$\..\lib\src\stm8s_exti.c + + + $PROJ_DIR$\..\lib\src\stm8s_gpio.c + + + + user + + $PROJ_DIR$\main.c + + + $PROJ_DIR$\stm8s_conf.h + + + $PROJ_DIR$\stm8s_it.h + + + + $PROJ_DIR$\..\lib\src\stm8s_beep.c + + + $PROJ_DIR$\..\lib\src\stm8s_tim4.c + + + $PROJ_DIR$\..\lib\src\stm8s_uart1.c + + + + diff --git a/4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewt b/4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewt new file mode 100644 index 0000000..6eded9e --- /dev/null +++ b/4_EXT_INT_1PORT/user/EXT_INT_1PORT.ewt @@ -0,0 +1,64 @@ + + + + 2 + + Debug + + STM8 + + 1 + + C-STAT + 1 + + + + + Release + + STM8 + + 0 + + C-STAT + 1 + + + + + lib + + $PROJ_DIR$\..\lib\src\stm8s_clk.c + + + $PROJ_DIR$\..\lib\src\stm8s_exti.c + + + $PROJ_DIR$\..\lib\src\stm8s_gpio.c + + + + user + + $PROJ_DIR$\main.c + + + $PROJ_DIR$\stm8s_conf.h + + + $PROJ_DIR$\stm8s_it.h + + + + $PROJ_DIR$\..\lib\src\stm8s_beep.c + + + $PROJ_DIR$\..\lib\src\stm8s_tim4.c + + + $PROJ_DIR$\..\lib\src\stm8s_uart1.c + + + + diff --git a/4_EXT_INT_1PORT/user/EXT_IN_1PORT.eww b/4_EXT_INT_1PORT/user/EXT_IN_1PORT.eww new file mode 100644 index 0000000..3a71c89 --- /dev/null +++ b/4_EXT_INT_1PORT/user/EXT_IN_1PORT.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\EXT_INT_1PORT.ewp + + + + + diff --git a/4_EXT_INT_1PORT/user/main.c b/4_EXT_INT_1PORT/user/main.c new file mode 100644 index 0000000..217988d --- /dev/null +++ b/4_EXT_INT_1PORT/user/main.c @@ -0,0 +1,233 @@ +//===============> Version lockBF version 1.0 26/5/2022 stm8s Suported by Thaonv <=====================// +#include "stm8s.h" +#include "stdbool.h" +#include "stm8s_uart2.h" +#include "stdio.h" +#include "uart.h" +#include +#define relay GPIOD,GPIO_PIN_2 //Set Relay 1 Pin +#define relay_2 GPIOD,GPIO_PIN_3 //Set Relay 1 Pin +#define Light GPIOD,GPIO_PIN_4 //Set light 1 Pin +#define button GPIOC,GPIO_PIN_5 //set button pin +#define button_2 GPIOA,GPIO_PIN_3 //set button pin +uint16_t time_delay =2000; +char input; +char rx_indx; +char rx_buffer[10]; +char str3[]="tdoor"; +int t1; +// char c[10]; +char t[2]; +/* Private defines -----------------------------------------------------------*/ +bool relay_stt = false; +bool relay_stt2 = false; +bool test2 = false; + +void Delayms_timer4(uint16_t time_delay); +void CLK_Cofiguration(void); +void GPIO_Configuration(void); +void Exint_Cofiguration(void); +void control(void); +void ngat(void); +void test(void); +void readbt(void); +void onled(void); +void offled(void); +char Serial_read_char(void); +char Serial_print (char string[]); +//void S erial_print_string (char string[]) +void Serial_print_string (char[]); +void Serial_print_int (int number) ; +void UART_Configuration(void); +void UARTPrintf(char *message); +void uart_isr(void); +void empty_buffer(uint8_t *buffer,uint16_t size); +void test1(void); +void gets_UART1(unsigned char *string); +/* Private functions -- +-------------------------------------------------------*/ +INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5) +{ + GPIO_WriteHigh(relay); + Serial_print_string("open_1\n\r"); + relay_stt=true; +} +INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3) +{ + GPIO_WriteHigh(relay_2); + Serial_print_string("open_2\n\r"); + relay_stt2=true; +} +INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) +{ + input=Serial_read_char(); + if(input=='\n') { + rx_buffer[rx_indx] = '\0'; + rx_indx = 0; + // Serial_print_string(rx_buffer); + if(strcmp(rx_buffer,"1")==0){ + GPIO_WriteHigh(GPIOD,GPIO_PIN_2); // on relay1 + Serial_print_string("open_1\n\r"); + relay_stt=true; + }else if(strcmp(rx_buffer,"2")==0){ + GPIO_WriteHigh(GPIOD,GPIO_PIN_3); // on relay2 + Serial_print_string("open_2\n\r"); + relay_stt2=true; + }else if(strcmp(rx_buffer,"3")==0){ + Serial_print_string("open_3\n\r"); // on led + onled(); + }else if(strcmp(rx_buffer,"4")==0){ + Serial_print_string("open_4\n\r"); + offled(); // off led + } + else if(strncmp(rx_buffer,str3,5)==0){ + strncpy( t, rx_buffer+6, 2 ); + t[2]='\0'; + // Serial_print_string(t); + t1 = atoi(t); + time_delay=t1*1000; + // Serial_print_int(time_delay); + } + + } else { + rx_buffer[rx_indx]=input; + rx_indx++; + } +} + void Serial_print_int (int number) //Funtion to print int value to serial monitor + { + char count = 0; + char digit[5] = ""; + + while (number != 0) //split the int to char array + { + digit[count] = number%10; + count++; + number = number/10; + } + + while (count !=0) //print char array in correct direction + { + UART1_SendData8(digit[count-1] + 0x30); + while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); //wait for sending + count--; + } + } +char Serial_read_char(void) + { + + while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET) + UART1_ClearFlag(UART1_FLAG_RXNE); + return (UART1_ReceiveData8()); + } + + void Serial_print_string (char string[]) + { + char i=0; + while (string[i] != 0x00) + { + UART1_SendData8(string[i]); + while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); + i++; + } + } + void onled(){ + GPIO_WriteHigh(Light); + } + void offled(){ + GPIO_WriteLow(Light); + } +void main(void) +{ + CLK_Cofiguration(); + GPIO_Configuration(); + Exint_Cofiguration(); + UART_Configuration(); + while (1) + { + control(); + } +} +void control(){ + if(relay_stt==true){ + Delayms_timer4(time_delay); + GPIO_WriteLow(relay); + relay_stt = false; + } + else if(relay_stt2==true){ + Delayms_timer4(time_delay); + GPIO_WriteLow(relay_2); + relay_stt2 = false; + } +} +void CLK_Cofiguration(void) +{ +CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); +} +void GPIO_Configuration(void) +{ + GPIO_DeInit(GPIOD); // reset all register port D + GPIO_Init(relay, GPIO_MODE_OUT_PP_LOW_FAST); //config pin PD2 of portD with mode push pull speed 2Mhz + GPIO_Init(relay_2, GPIO_MODE_OUT_PP_LOW_FAST);//config pin PD3 of portD with mode push pull speed 2Mhz + GPIO_Init(Light, GPIO_MODE_OUT_PP_LOW_FAST); +} +void Exint_Cofiguration(void) +{ + GPIO_DeInit(GPIOC); + GPIO_DeInit(GPIOA); // reset all register port c + GPIO_Init(button, GPIO_MODE_IN_PU_IT); // config pin PC5 is input, pull up , interupt + GPIO_DeInit(GPIOA); // reset all register port A + GPIO_Init(button_2, GPIO_MODE_IN_PU_IT); // config pin PA3 is input, pull up , interupt + EXTI_DeInit(); // reset all register interupt + EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC,EXTI_SENSITIVITY_RISE_ONLY); // set interupt is edge up or edge down + EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA,EXTI_SENSITIVITY_RISE_ONLY); // set interupt is edge up or edge down + enableInterrupts(); // Enable interrupt. +} +void UART_Configuration(void) +{ + UART1_DeInit(); // reset lai toan bo thanh ghi trong uart + UART1_Init((u32)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, + UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE); // cai dat toc do baund la , 1bit stop, k su dung nit chan le, khong su dung chan clock, su dung ca 2 chan Tx,Rx + UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE); // cau hinh la ngat nhan UART + UART1_Cmd(ENABLE); // cho phep chay UART. + enableInterrupts(); // cho phep ngat toan cuc + +} +void Delayms_timer4(uint16_t time_delay) +{ + /* Init TIMER 4 */ + CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, ENABLE); // enable clock timer 4 + TIM4_TimeBaseInit(TIM4_PRESCALER_64, 250); // set frequence timer 4 la 16*10^6/64/250 = 1000Hz + TIM4_SetCounter(0); // set counter value = 0 //set counter ve gia tri ban dau =0 + TIM4_ClearFlag(TIM4_FLAG_UPDATE); // clear flag update timer4(when over timer = 1) clear 0 + TIM4_Cmd(ENABLE); // enable timer // enable timer hoat dong + while(time_delay--) // tan so la 1000Hz -> khi lap lai 1000 lan la 1Hz = 1s + { + while(TIM4_GetFlagStatus(TIM4_FLAG_UPDATE)== 0) ; // watting over timer exit whiles + TIM4_ClearFlag(TIM4_FLAG_UPDATE); // clear timer for next counter + } +/* Disable Counter */ + TIM4_Cmd(DISABLE); // sau khi delay xong, disable timer. + CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4, DISABLE);// Disable clock for timer when finish delay +} +#ifdef USE_FULL_ASSERT + +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval : None + */ +void assert_failed(u8* file, u32 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 + diff --git a/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.Debug.cspy.bat b/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.Debug.cspy.bat new file mode 100644 index 0000000..8d7c39c --- /dev/null +++ b/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.Debug.cspy.bat @@ -0,0 +1,24 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\common\bin\cspybat" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\bin\stm8proc.dll" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\bin\stm8stlink.dll" %1 --plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\bin\stm8bat.dll" --backend -B "-p" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\config\ddf\iostm8s003f3.ddf" "-d" "stlink" "--mcuname" "STM8S003F3" + + diff --git a/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.cspy.bat b/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.cspy.bat new file mode 100644 index 0000000..0646f43 --- /dev/null +++ b/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.cspy.bat @@ -0,0 +1,24 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM +@REM Read about available command line parameters in the C-SPY Debugging +@REM Guide. Hints about additional command line parameters that may be +@REM useful in specific cases: +@REM --download_only Downloads a code image without starting a debug +@REM session afterwards. +@REM --silent Omits the sign-on message. +@REM --timeout Limits the maximum allowed execution time. +@REM + + +"C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\common\bin\cspybat" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\bin\stm8proc.dll" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\bin\stm8stlink.dll" %1 --plugin "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\bin\stm8bat.dll" --backend -B "-p" "C:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\stm8\config\ddf\iostm8s003f3.ddf" "-d" "stlink" "--mcuname" "STM8S003F3" + + diff --git a/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.dbgdt b/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.dbgdt new file mode 100644 index 0000000..93f9d62 --- /dev/null +++ b/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.dbgdt @@ -0,0 +1,81 @@ + + + + + + + + + 300201307 + + + + + + 2098026165300Debug-Log + + + + + + + 204272727 + + + + + + Disassembly_I0 + + + + 50020 + + + + 11 + + + + + + + + + TabID-20595-11599 + Workspace + Workspace + + + EXT_INT_1PORTEXT_INT_1PORT/OutputEXT_INT_1PORT/libEXT_INT_1PORT/user + + + + 0 + + + TabID-31344-11602 + Disassembly + Disassembly + + + + + 0TabID-25806-9770Debug LogDebug-Log0 + + + + + + TextEditor$WS_DIR$\main.c00000139000TextEditor$WS_DIR$\..\lib\src\stm8s_gpio.c0000017467876827TextEditor$WS_DIR$\..\lib\src\stm8s_uart1.c0000019913287132870100000010000001 + + + + + + + iaridepm.enu1debuggergui.enu1-2-2729278-2-2280291145833291876145833733200-2-2729278-2-2280291145833291876145833733200-2-21991922-2-219242011002083201605104167201605 + + + + diff --git a/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.dni b/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.dni new file mode 100644 index 0000000..87923f8 --- /dev/null +++ b/4_EXT_INT_1PORT/user/settings/EXT_INT_1PORT.dni @@ -0,0 +1,66 @@ +[InterruptLog] +LogEnabled=0 +SumEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +ShowTimeSum=1 +SumSortOrder=0 +[DataLog] +LogEnabled=0 +SumEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +ShowTimeSum=1 +[Stack] +FillEnabled=0 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnLogOnly=1 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[Breakpoints2] +Count=0 +[Interrupts] +Enabled=1 +[MemoryMap] +Enabled=0 +Base=0 +UseAuto=0 +TypeViolation=1 +UnspecRange=1 +ActionState=1 +[Trace1] +Enabled=0 +ShowSource=1 +[DebugChecksum] +Checksum=680895150 +[CallStack] +ShowArgs=0 +[Disassembly] +MixedMode=1 +[DataSample] +LogEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +ShowTimeSum=1 +[Log file] +LoggingEnabled=_ 0 +LogFile=_ "" +Category=_ 0 +[TermIOLog] +LoggingEnabled=_ 0 +LogFile=_ "" +[Breakpoints] +Bp0=_ "STD_CODE" "{$PROJ_DIR$\stm8s_it.c}.1.1" 0 0 0 0 "" 0 "" +Count=1 +[Aliases] +A0=_ "E:\2. DU_AN\huong dan tao project stm8s\project\IAR\4_EXT_INT_1PORT\lib\src\stm8s_gpio.c" "" +A1=_ "E:\2. DU_AN\huong dan tao project stm8s\project\IAR\4_EXT_INT_1PORT\user\main.c" "" +A2=_ "E:\2. DU_AN\huong dan tao project stm8s\project\IAR\4_EXT_INT_1PORT\user\stm8s_it.c" "" +Count=3 +SuppressDialog=0 +[DebuggerSettings] +DisableInterruptsWhenStepping=0 diff --git a/4_EXT_INT_1PORT/user/settings/EXT_IN_1PORT.wsdt b/4_EXT_INT_1PORT/user/settings/EXT_IN_1PORT.wsdt new file mode 100644 index 0000000..d176766 --- /dev/null +++ b/4_EXT_INT_1PORT/user/settings/EXT_IN_1PORT.wsdt @@ -0,0 +1,67 @@ + + + + + + EXT_INT_1PORT/Debug + + + + + + + + + 118272727 + + + + + + + 2098026165 + + 191862 + + + + + + + TabID-14112-8650 + Workspace + Workspace + + + EXT_INT_1PORTEXT_INT_1PORT/libEXT_INT_1PORT/user + + + + 0 + + + TabID-19236-9577 + Build + Build + + + TabID-21356-2533Debug LogDebug-Log + + 0 + + + + + + TextEditor$WS_DIR$\main.c00000139000TextEditor$WS_DIR$\..\lib\src\stm8s_gpio.c0000017467876827TextEditor$WS_DIR$\..\lib\src\stm8s_uart1.c0000019913287132870100000010000001 + + + + + + + iaridepm.enu1-2-2710192-2-215414680208146439101042714142-2-22421922-2-21924244100208324473480208146439 + + + + diff --git a/4_EXT_INT_1PORT/user/settings/EXT_IN_1PORT.wspos b/4_EXT_INT_1PORT/user/settings/EXT_IN_1PORT.wspos new file mode 100644 index 0000000..5085261 --- /dev/null +++ b/4_EXT_INT_1PORT/user/settings/EXT_IN_1PORT.wspos @@ -0,0 +1,2 @@ +[MainWindow] +WindowPlacement=_ 1948 -2 3884 1054 3 diff --git a/stm8s103_Serial.h b/4_EXT_INT_1PORT/user/stm8s103_Serial.h similarity index 100% rename from stm8s103_Serial.h rename to 4_EXT_INT_1PORT/user/stm8s103_Serial.h diff --git a/4_EXT_INT_1PORT/user/stm8s_conf.h b/4_EXT_INT_1PORT/user/stm8s_conf.h new file mode 100644 index 0000000..c62d826 --- /dev/null +++ b/4_EXT_INT_1PORT/user/stm8s_conf.h @@ -0,0 +1,113 @@ +/** + ****************************************************************************** + * @file stm8s_conf.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file is used to configure the Library. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_CONF_H +#define __STM8S_CONF_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Uncomment the line below to enable peripheral header file inclusion */ +#if defined(STM8S105) || defined(STM8S005) || defined(STM8S103) || defined(STM8S003) ||\ + defined(STM8S903) || defined (STM8AF626x) +#include "stm8s_adc1.h" +#endif /* (STM8S105) ||(STM8S103) || (STM8S903) || STM8AF626x*/ +#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) || defined (STM8AF52Ax) ||\ + defined (STM8AF62Ax) + #include "stm8s_adc2.h" +#endif /* (STM8S208) || (STM8S207) || (STM8AF62Ax) || (STM8AF52Ax) */ +#include "stm8s_awu.h" +#include "stm8s_beep.h" +#if defined (STM8S208) || defined (STM8AF52Ax) + #include "stm8s_can.h" +#endif /* STM8S208 || STM8AF52Ax */ +#include "stm8s_clk.h" +#include "stm8s_exti.h" +#include "stm8s_flash.h" +#include "stm8s_gpio.h" +#include "stm8s_i2c.h" +#include "stm8s_itc.h" +#include "stm8s_iwdg.h" +#include "stm8s_rst.h" +#include "stm8s_spi.h" +#include "stm8s_tim1.h" +#ifndef STM8S903 + #include "stm8s_tim2.h" +#endif /* STM8S903 */ +#if defined(STM8S208) || defined(STM8S207) || defined(STM8S007) ||defined(STM8S105) ||\ + defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined (STM8AF626x) + #include "stm8s_tim3.h" +#endif /* (STM8S208) ||defined(STM8S207) || defined(STM8S007) ||defined(STM8S105) */ +#ifndef STM8S903 + #include "stm8s_tim4.h" +#endif /* STM8S903 */ +#ifdef STM8S903 + #include "stm8s_tim5.h" + #include "stm8s_tim6.h" +#endif /* STM8S903 */ +#if defined(STM8S208) ||defined(STM8S207) || defined(STM8S007) ||defined(STM8S103) ||\ + defined(STM8S003) || defined(STM8S903) || defined (STM8AF52Ax) || defined (STM8AF62Ax) + #include "stm8s_uart1.h" +#endif /* STM8S208 || STM8S207 || STM8S103 ||STM8S903 || STM8AF52Ax || STM8AF62Ax */ +#if defined(STM8S105) || defined(STM8S005) || defined (STM8AF626x) + #include "stm8s_uart2.h" +#endif /* STM8S105 || STM8AF626x */ +#if defined(STM8S208) ||defined(STM8S207) || defined(STM8S007) || defined (STM8AF52Ax) ||\ + defined (STM8AF62Ax) + #include "stm8s_uart3.h" +#endif /* STM8S208 || STM8S207 || STM8AF52Ax || STM8AF62Ax */ +#include "stm8s_wwdg.h" + +/* 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 /* __STM8S_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/user/stm8s_it.c b/4_EXT_INT_1PORT/user/stm8s_it.c new file mode 100644 index 0000000..e8fe143 --- /dev/null +++ b/4_EXT_INT_1PORT/user/stm8s_it.c @@ -0,0 +1,530 @@ +/** + ****************************************************************************** + * @file stm8s_it.c + * @author Minh Nguyen + * @version V2.2.0 + * @date 22-March-2020 + * @brief Main Interrupt Service Routines. + * This file provides template for all peripherals interrupt service + * routine. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s_it.h" +#include "stm8s103_serial.h" +void control(void); +void test(void); +void Delayms_timer4(uint16_t time_delay); +void readbt(void); +void Delay(uint16_t nCount); +void Delay(uint16_t nCount) +{ + /* Decrement nCount value */ + while (nCount != 0) + { + nCount--; + } +} +extern uint8_t flag_exint; +/** @addtogroup Template_Project + * @{ + */ + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ +/* Public functions ----------------------------------------------------------*/ + +#ifdef _COSMIC_ +/** + * @brief Dummy Interrupt routine + * @par Parameters: + * None + * @retval + * None +*/ +87 +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} +#endif /*_COSMIC_*/ + +/** + * @brief TRAP Interrupt routine + * @param None + * @retval None + */ +INTERRUPT_HANDLER_TRAP(TRAP_IRQHandler) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +/** + * @brief Top Level Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(TLI_IRQHandler, 0) + +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +/** + * @brief Auto Wake Up Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(AWU_IRQHandler, 1) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +/** + * @brief Clock Controller Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(CLK_IRQHandler, 2) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +/** + * @brief External Interrupt PORTA Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(EXTI_PORTA_IRQHandler, 3) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + //flag_exint ^= 0xFF; +} + +/** + * @brief External Interrupt PORTB Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(EXTI_PORTB_IRQHandler, 4) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +/** + * @brief External Interrupt PORTC Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(EXTI_PORTC_IRQHandler, 5) +{ + + if (GPIO_ReadInputPin(GPIOC, GPIO_PIN_5)==0){ + Serial_print_string("open_2"); + + } + // readbt(); +} + +/** + * @brief External Interrupt PORTD Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(EXTI_PORTD_IRQHandler, 6) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +/** + * @brief External Interrupt PORTE Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(EXTI_PORTE_IRQHandler, 7) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +#if defined (STM8S903) || defined (STM8AF622x) +/** + * @brief External Interrupt PORTF Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(EXTI_PORTF_IRQHandler, 8) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8S903) || (STM8AF622x) */ + +#if defined (STM8S208) || defined (STM8AF52Ax) +/** + * @brief CAN RX Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(CAN_RX_IRQHandler, 8) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } + +/** + * @brief CAN TX Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(CAN_TX_IRQHandler, 9) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8S208) || (STM8AF52Ax) */ + +/** + * @brief SPI Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(SPI_IRQHandler, 10) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +/** + * @brief Timer1 Update/Overflow/Trigger/Break Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +/** + * @brief Timer1 Capture/Compare Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(TIM1_CAP_COM_IRQHandler, 12) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +#if defined (STM8S903) || defined (STM8AF622x) +/** + * @brief Timer5 Update/Overflow/Break/Trigger Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(TIM5_UPD_OVF_BRK_TRG_IRQHandler, 13) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } + +/** + * @brief Timer5 Capture/Compare Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(TIM5_CAP_COM_IRQHandler, 14) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } + +#else /* (STM8S208) || (STM8S207) || (STM8S105) || (STM8S103) || (STM8AF62Ax) || (STM8AF52Ax) || (STM8AF626x) */ +/** + * @brief Timer2 Update/Overflow/Break Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } + +/** + * @brief Timer2 Capture/Compare Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(TIM2_CAP_COM_IRQHandler, 14) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8S903) || (STM8AF622x) */ + +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ + defined(STM8S005) || defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8AF626x) +/** + * @brief Timer3 Update/Overflow/Break Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(TIM3_UPD_OVF_BRK_IRQHandler, 15) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } + +/** + * @brief Timer3 Capture/Compare Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(TIM3_CAP_COM_IRQHandler, 16) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8S208) || (STM8S207) || (STM8S105) || (STM8AF62Ax) || (STM8AF52Ax) || (STM8AF626x) */ + +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S103) || \ + defined(STM8S003) || defined (STM8AF62Ax) || defined (STM8AF52Ax) || defined (STM8S903) +/** + * @brief UART1 TX Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(UART1_TX_IRQHandler, 17) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } + +/** + * @brief UART1 RX Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8S208) || (STM8S207) || (STM8S103) || (STM8S903) || (STM8AF62Ax) || (STM8AF52Ax) */ + +#if defined(STM8AF622x) +/** + * @brief UART4 TX Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(UART4_TX_IRQHandler, 17) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } + +/** + * @brief UART4 RX Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(UART4_RX_IRQHandler, 18) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8AF622x) */ + +/** + * @brief I2C Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(I2C_IRQHandler, 19) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +#if defined(STM8S105) || defined(STM8S005) || defined (STM8AF626x) +/** + * @brief UART2 TX interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(UART2_TX_IRQHandler, 20) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } + +/** + * @brief UART2 RX interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(UART2_RX_IRQHandler, 21) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8S105) || (STM8AF626x) */ + +#if defined(STM8S207) || defined(STM8S007) || defined(STM8S208) || defined (STM8AF52Ax) || defined (STM8AF62Ax) +/** + * @brief UART3 TX interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(UART3_TX_IRQHandler, 20) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } + +/** + * @brief UART3 RX interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(UART3_RX_IRQHandler, 21) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8S208) || (STM8S207) || (STM8AF52Ax) || (STM8AF62Ax) */ + +#if defined(STM8S207) || defined(STM8S007) || defined(STM8S208) || defined (STM8AF52Ax) || defined (STM8AF62Ax) +/** + * @brief ADC2 interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(ADC2_IRQHandler, 22) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#else /* STM8S105 or STM8S103 or STM8S903 or STM8AF626x or STM8AF622x */ +/** + * @brief ADC1 interrupt routine. + * @par Parameters: + * None + * @retval + * None + */ + INTERRUPT_HANDLER(ADC1_IRQHandler, 22) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8S208) || (STM8S207) || (STM8AF52Ax) || (STM8AF62Ax) */ + +#if defined (STM8S903) || defined (STM8AF622x) +/** + * @brief Timer6 Update/Overflow/Trigger Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(TIM6_UPD_OVF_TRG_IRQHandler, 23) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#else /* STM8S208 or STM8S207 or STM8S105 or STM8S103 or STM8AF52Ax or STM8AF62Ax or STM8AF626x */ +/** + * @brief Timer4 Update/Overflow Interrupt routine. + * @param None + * @retval None + */ + INTERRUPT_HANDLER(TIM4_UPD_OVF_IRQHandler, 23) + { + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ + } +#endif /* (STM8S903) || (STM8AF622x)*/ + +/** + * @brief Eeprom EEC Interrupt routine. + * @param None + * @retval None + */ +INTERRUPT_HANDLER(EEPROM_EEC_IRQHandler, 24) +{ + /* In order to detect unexpected events during development, + it is recommended to set a breakpoint on the following instruction. + */ +} + +/** + * @} + */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \ No newline at end of file diff --git a/4_EXT_INT_1PORT/user/stm8s_it.h b/4_EXT_INT_1PORT/user/stm8s_it.h new file mode 100644 index 0000000..5db1b02 --- /dev/null +++ b/4_EXT_INT_1PORT/user/stm8s_it.h @@ -0,0 +1,117 @@ +/** + ****************************************************************************** + * @file stm8s_it.h + * @author MCD Application Team + * @version V2.2.0 + * @date 30-September-2014 + * @brief This file contains the headers of the interrupt handlers + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8S_IT_H +#define __STM8S_IT_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8s.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +#ifdef _COSMIC_ + void _stext(void); /* RESET startup routine */ + INTERRUPT void NonHandledInterrupt(void); +#endif /* _COSMIC_ */ + +#ifndef _RAISONANCE_ + INTERRUPT void TRAP_IRQHandler(void); /* TRAP */ + INTERRUPT void TLI_IRQHandler(void); /* TLI */ + INTERRUPT void AWU_IRQHandler(void); /* AWU */ + INTERRUPT void CLK_IRQHandler(void); /* CLOCK */ + INTERRUPT void EXTI_PORTA_IRQHandler(void); /* EXTI PORTA */ + INTERRUPT void EXTI_PORTB_IRQHandler(void); /* EXTI PORTB */ + INTERRUPT void EXTI_PORTC_IRQHandler(void); /* EXTI PORTC */ + INTERRUPT void EXTI_PORTD_IRQHandler(void); /* EXTI PORTD */ + INTERRUPT void EXTI_PORTE_IRQHandler(void); /* EXTI PORTE */ + +#ifdef STM8S903 + INTERRUPT void EXTI_PORTF_IRQHandler(void); /* EXTI PORTF */ +#endif /*STM8S903*/ + +#if defined (STM8S208) || defined (STM8AF52Ax) + INTERRUPT void CAN_RX_IRQHandler(void); /* CAN RX */ + INTERRUPT void CAN_TX_IRQHandler(void); /* CAN TX/ER/SC */ +#endif /* STM8S208 || STM8AF52Ax */ + + INTERRUPT void SPI_IRQHandler(void); /* SPI */ + INTERRUPT void TIM1_CAP_COM_IRQHandler(void); /* TIM1 CAP/COM */ + INTERRUPT void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void); /* TIM1 UPD/OVF/TRG/BRK */ + +#ifdef STM8S903 + INTERRUPT void TIM5_UPD_OVF_BRK_TRG_IRQHandler(void); /* TIM5 UPD/OVF/BRK/TRG */ + INTERRUPT void TIM5_CAP_COM_IRQHandler(void); /* TIM5 CAP/COM */ +#else /*STM8S208, STM8S207, STM8S105 or STM8S103 or STM8AF52Ax or STM8AF62Ax or STM8A626x*/ + INTERRUPT void TIM2_UPD_OVF_BRK_IRQHandler(void); /* TIM2 UPD/OVF/BRK */ + INTERRUPT void TIM2_CAP_COM_IRQHandler(void); /* TIM2 CAP/COM */ +#endif /*STM8S903*/ + +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S105) || \ + defined(STM8S005) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined (STM8AF626x) + INTERRUPT void TIM3_UPD_OVF_BRK_IRQHandler(void); /* TIM3 UPD/OVF/BRK */ + INTERRUPT void TIM3_CAP_COM_IRQHandler(void); /* TIM3 CAP/COM */ +#endif /*STM8S208, STM8S207 or STM8S105 or STM8AF52Ax or STM8AF62Ax or STM8A626x */ + +#if defined (STM8S208) || defined(STM8S207) || defined(STM8S007) || defined(STM8S103) || \ + defined(STM8S003) || defined (STM8AF52Ax) || defined (STM8AF62Ax) || defined (STM8S903) + INTERRUPT void UART1_TX_IRQHandler(void); /* UART1 TX */ + INTERRUPT void UART1_RX_IRQHandler(void); /* UART1 RX */ +#endif /*STM8S208, STM8S207, STM8S903 or STM8S103 or STM8AF52Ax or STM8AF62Ax */ + + INTERRUPT void I2C_IRQHandler(void); /* I2C */ + +#if defined(STM8S105) || defined(STM8S005) || defined (STM8AF626x) + INTERRUPT void UART2_RX_IRQHandler(void); /* UART2 RX */ + INTERRUPT void UART2_TX_IRQHandler(void); /* UART2 TX */ +#endif /* STM8S105 or STM8AF626x */ + +#if defined(STM8S207) || defined(STM8S007) || defined(STM8S208) || defined (STM8AF52Ax) || defined (STM8AF62Ax) + INTERRUPT void UART3_RX_IRQHandler(void); /* UART3 RX */ + INTERRUPT void UART3_TX_IRQHandler(void); /* UART3 TX */ +#endif /*STM8S207, STM8S208, STM8AF62Ax or STM8AF52Ax */ + +#if defined(STM8S207) || defined(STM8S007) || defined(STM8S208) || defined (STM8AF52Ax) || defined (STM8AF62Ax) + INTERRUPT void ADC2_IRQHandler(void); /* ADC2 */ +#else /*STM8S105, STM8S103 or STM8S903*/ + INTERRUPT void ADC1_IRQHandler(void); /* ADC1 */ +#endif /*STM8S207, STM8S208, STM8AF62Ax or STM8AF52Ax */ + +#ifdef STM8S903 + INTERRUPT void TIM6_UPD_OVF_TRG_IRQHandler(void); /* TIM6 UPD/OVF/TRG */ +#else /*STM8S208, STM8S207, STM8S105 or STM8S103 or STM8AF62Ax or STM8AF52Ax or STM8AF626x */ + INTERRUPT void TIM4_UPD_OVF_IRQHandler(void); /* TIM4 UPD/OVF */ +#endif /*STM8S903*/ + INTERRUPT void EEPROM_EEC_IRQHandler(void); /* EEPROM ECC CORRECTION */ +#endif /* _RAISONANCE_ */ + +#endif /* __STM8S_IT_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/4_EXT_INT_1PORT/user/uart.c b/4_EXT_INT_1PORT/user/uart.c new file mode 100644 index 0000000..7956134 --- /dev/null +++ b/4_EXT_INT_1PORT/user/uart.c @@ -0,0 +1,49 @@ +#include "uart.h" + +/* Private typedef -----------------------------------------------------------*/ +/* Private define ------------------------------------------------------------*/ +/* Private macro -------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +/* Private function prototypes -----------------------------------------------*/ +/* Private functions ---------------------------------------------------------*/ + +/** +* @brief uart send a string +* @param str: a pointer is pointed to string address +* @retval None +*/ +void sendUartFn(char *str) +{ + while(*str != '\0') { + UART2_SendData8(*str); + while (UART2_GetFlagStatus(UART2_FLAG_TXE) == RESET); + str++; + } +} + +/** +* @brief uart configuration +* @param None +* @retval 0 +*/ +int UART2_config(void) +{ + /* Enable UART clock source */ + CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART2, ENABLE); + + /* Init peripheral with some parameters: + * - Baudrate: 115200 + * - Frame: 8 + * - Stop bit: 1 + * - No parity check + * - Disable synchronous mode clock + * - Enable TX and RX + */ + UART2_Init(BAUDRATE, UART2_WORDLENGTH_8D, UART2_STOPBITS_1, + UART2_PARITY_NO, UART2_SYNCMODE_CLOCK_DISABLE, + UART2_MODE_TXRX_ENABLE); + /* Enable UART2 */ + UART2_Cmd(ENABLE); + + return 0; +} \ No newline at end of file diff --git a/4_EXT_INT_1PORT/user/uart.h b/4_EXT_INT_1PORT/user/uart.h new file mode 100644 index 0000000..34e20c5 --- /dev/null +++ b/4_EXT_INT_1PORT/user/uart.h @@ -0,0 +1,19 @@ +#ifndef INC_UART_H_ +#define INC_UART_H_ + +#include "stm8s.h" +#include "stm8s_gpio.h" +#include "stm8s_clk.h" +#include "stm8s_uart2.h" + +/* Exported types ------------------------------------------------------------*/ +/* Exported defines ----------------------------------------------------------*/ +#define BAUDRATE 115200 + +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ +void sendUartFn(char *str); +int UART2_config(void); + +#endif /* INC_UART_H_ */ \ No newline at end of file diff --git a/Debug/Exe/serial.hex b/Serial/Debug/Exe/serial.hex similarity index 100% rename from Debug/Exe/serial.hex rename to Serial/Debug/Exe/serial.hex diff --git a/Debug/Exe/templproj.out b/Serial/Debug/Exe/templproj.out similarity index 100% rename from Debug/Exe/templproj.out rename to Serial/Debug/Exe/templproj.out diff --git a/Debug/Obj/main.o b/Serial/Debug/Obj/main.o similarity index 100% rename from Debug/Obj/main.o rename to Serial/Debug/Obj/main.o diff --git a/Debug/Obj/main.pbi b/Serial/Debug/Obj/main.pbi similarity index 100% rename from Debug/Obj/main.pbi rename to Serial/Debug/Obj/main.pbi diff --git a/Debug/Obj/main.pbi.cout b/Serial/Debug/Obj/main.pbi.cout similarity index 100% rename from Debug/Obj/main.pbi.cout rename to Serial/Debug/Obj/main.pbi.cout diff --git a/Debug/Obj/serial.pbd b/Serial/Debug/Obj/serial.pbd similarity index 100% rename from Debug/Obj/serial.pbd rename to Serial/Debug/Obj/serial.pbd diff --git a/Debug/Obj/serial.pbd.browse b/Serial/Debug/Obj/serial.pbd.browse similarity index 100% rename from Debug/Obj/serial.pbd.browse rename to Serial/Debug/Obj/serial.pbd.browse diff --git a/Debug/Obj/stm8s_clk.o b/Serial/Debug/Obj/stm8s_clk.o similarity index 100% rename from Debug/Obj/stm8s_clk.o rename to Serial/Debug/Obj/stm8s_clk.o diff --git a/Debug/Obj/stm8s_clk.pbi b/Serial/Debug/Obj/stm8s_clk.pbi similarity index 100% rename from Debug/Obj/stm8s_clk.pbi rename to Serial/Debug/Obj/stm8s_clk.pbi diff --git a/Debug/Obj/stm8s_clk.pbi.cout b/Serial/Debug/Obj/stm8s_clk.pbi.cout similarity index 100% rename from Debug/Obj/stm8s_clk.pbi.cout rename to Serial/Debug/Obj/stm8s_clk.pbi.cout diff --git a/Debug/Obj/stm8s_gpio.o b/Serial/Debug/Obj/stm8s_gpio.o similarity index 100% rename from Debug/Obj/stm8s_gpio.o rename to Serial/Debug/Obj/stm8s_gpio.o diff --git a/Debug/Obj/stm8s_gpio.pbi b/Serial/Debug/Obj/stm8s_gpio.pbi similarity index 100% rename from Debug/Obj/stm8s_gpio.pbi rename to Serial/Debug/Obj/stm8s_gpio.pbi diff --git a/Debug/Obj/stm8s_gpio.pbi.cout b/Serial/Debug/Obj/stm8s_gpio.pbi.cout similarity index 100% rename from Debug/Obj/stm8s_gpio.pbi.cout rename to Serial/Debug/Obj/stm8s_gpio.pbi.cout diff --git a/Debug/Obj/stm8s_it.o b/Serial/Debug/Obj/stm8s_it.o similarity index 100% rename from Debug/Obj/stm8s_it.o rename to Serial/Debug/Obj/stm8s_it.o diff --git a/Debug/Obj/stm8s_it.pbi b/Serial/Debug/Obj/stm8s_it.pbi similarity index 100% rename from Debug/Obj/stm8s_it.pbi rename to Serial/Debug/Obj/stm8s_it.pbi diff --git a/Debug/Obj/stm8s_it.pbi.cout b/Serial/Debug/Obj/stm8s_it.pbi.cout similarity index 100% rename from Debug/Obj/stm8s_it.pbi.cout rename to Serial/Debug/Obj/stm8s_it.pbi.cout diff --git a/Debug/Obj/stm8s_tim4.o b/Serial/Debug/Obj/stm8s_tim4.o similarity index 100% rename from Debug/Obj/stm8s_tim4.o rename to Serial/Debug/Obj/stm8s_tim4.o diff --git a/Debug/Obj/stm8s_tim4.pbi b/Serial/Debug/Obj/stm8s_tim4.pbi similarity index 100% rename from Debug/Obj/stm8s_tim4.pbi rename to Serial/Debug/Obj/stm8s_tim4.pbi diff --git a/Debug/Obj/stm8s_tim4.pbi.cout b/Serial/Debug/Obj/stm8s_tim4.pbi.cout similarity index 100% rename from Debug/Obj/stm8s_tim4.pbi.cout rename to Serial/Debug/Obj/stm8s_tim4.pbi.cout diff --git a/Debug/Obj/stm8s_uart1.o b/Serial/Debug/Obj/stm8s_uart1.o similarity index 100% rename from Debug/Obj/stm8s_uart1.o rename to Serial/Debug/Obj/stm8s_uart1.o diff --git a/Debug/Obj/stm8s_uart1.pbi b/Serial/Debug/Obj/stm8s_uart1.pbi similarity index 100% rename from Debug/Obj/stm8s_uart1.pbi rename to Serial/Debug/Obj/stm8s_uart1.pbi diff --git a/Debug/Obj/stm8s_uart1.pbi.cout b/Serial/Debug/Obj/stm8s_uart1.pbi.cout similarity index 100% rename from Debug/Obj/stm8s_uart1.pbi.cout rename to Serial/Debug/Obj/stm8s_uart1.pbi.cout diff --git a/Debug/Obj/truyen.pbd b/Serial/Debug/Obj/truyen.pbd similarity index 100% rename from Debug/Obj/truyen.pbd rename to Serial/Debug/Obj/truyen.pbd diff --git a/Debug/Obj/truyen.pbd.browse b/Serial/Debug/Obj/truyen.pbd.browse similarity index 100% rename from Debug/Obj/truyen.pbd.browse rename to Serial/Debug/Obj/truyen.pbd.browse diff --git a/EW1C93.tmp b/Serial/EW1C93.tmp similarity index 100% rename from EW1C93.tmp rename to Serial/EW1C93.tmp diff --git a/inc/stm8s.h b/Serial/inc/stm8s.h similarity index 100% rename from inc/stm8s.h rename to Serial/inc/stm8s.h diff --git a/inc/stm8s_adc1.h b/Serial/inc/stm8s_adc1.h similarity index 100% rename from inc/stm8s_adc1.h rename to Serial/inc/stm8s_adc1.h diff --git a/inc/stm8s_adc2.h b/Serial/inc/stm8s_adc2.h similarity index 100% rename from inc/stm8s_adc2.h rename to Serial/inc/stm8s_adc2.h diff --git a/inc/stm8s_awu.h b/Serial/inc/stm8s_awu.h similarity index 100% rename from inc/stm8s_awu.h rename to Serial/inc/stm8s_awu.h diff --git a/inc/stm8s_beep.h b/Serial/inc/stm8s_beep.h similarity index 100% rename from inc/stm8s_beep.h rename to Serial/inc/stm8s_beep.h diff --git a/inc/stm8s_can.h b/Serial/inc/stm8s_can.h similarity index 100% rename from inc/stm8s_can.h rename to Serial/inc/stm8s_can.h diff --git a/inc/stm8s_clk.h b/Serial/inc/stm8s_clk.h similarity index 100% rename from inc/stm8s_clk.h rename to Serial/inc/stm8s_clk.h diff --git a/inc/stm8s_exti.h b/Serial/inc/stm8s_exti.h similarity index 100% rename from inc/stm8s_exti.h rename to Serial/inc/stm8s_exti.h diff --git a/inc/stm8s_flash.h b/Serial/inc/stm8s_flash.h similarity index 100% rename from inc/stm8s_flash.h rename to Serial/inc/stm8s_flash.h diff --git a/inc/stm8s_gpio.h b/Serial/inc/stm8s_gpio.h similarity index 100% rename from inc/stm8s_gpio.h rename to Serial/inc/stm8s_gpio.h diff --git a/inc/stm8s_i2c.h b/Serial/inc/stm8s_i2c.h similarity index 100% rename from inc/stm8s_i2c.h rename to Serial/inc/stm8s_i2c.h diff --git a/inc/stm8s_itc.h b/Serial/inc/stm8s_itc.h similarity index 100% rename from inc/stm8s_itc.h rename to Serial/inc/stm8s_itc.h diff --git a/inc/stm8s_iwdg.h b/Serial/inc/stm8s_iwdg.h similarity index 100% rename from inc/stm8s_iwdg.h rename to Serial/inc/stm8s_iwdg.h diff --git a/inc/stm8s_rst.h b/Serial/inc/stm8s_rst.h similarity index 100% rename from inc/stm8s_rst.h rename to Serial/inc/stm8s_rst.h diff --git a/inc/stm8s_spi.h b/Serial/inc/stm8s_spi.h similarity index 100% rename from inc/stm8s_spi.h rename to Serial/inc/stm8s_spi.h diff --git a/inc/stm8s_tim1.h b/Serial/inc/stm8s_tim1.h similarity index 100% rename from inc/stm8s_tim1.h rename to Serial/inc/stm8s_tim1.h diff --git a/inc/stm8s_tim2.h b/Serial/inc/stm8s_tim2.h similarity index 100% rename from inc/stm8s_tim2.h rename to Serial/inc/stm8s_tim2.h diff --git a/inc/stm8s_tim3.h b/Serial/inc/stm8s_tim3.h similarity index 100% rename from inc/stm8s_tim3.h rename to Serial/inc/stm8s_tim3.h diff --git a/inc/stm8s_tim4.h b/Serial/inc/stm8s_tim4.h similarity index 100% rename from inc/stm8s_tim4.h rename to Serial/inc/stm8s_tim4.h diff --git a/inc/stm8s_tim5.h b/Serial/inc/stm8s_tim5.h similarity index 100% rename from inc/stm8s_tim5.h rename to Serial/inc/stm8s_tim5.h diff --git a/inc/stm8s_tim6.h b/Serial/inc/stm8s_tim6.h similarity index 100% rename from inc/stm8s_tim6.h rename to Serial/inc/stm8s_tim6.h diff --git a/inc/stm8s_uart1.h b/Serial/inc/stm8s_uart1.h similarity index 100% rename from inc/stm8s_uart1.h rename to Serial/inc/stm8s_uart1.h diff --git a/inc/stm8s_uart2.h b/Serial/inc/stm8s_uart2.h similarity index 100% rename from inc/stm8s_uart2.h rename to Serial/inc/stm8s_uart2.h diff --git a/inc/stm8s_uart3.h b/Serial/inc/stm8s_uart3.h similarity index 100% rename from inc/stm8s_uart3.h rename to Serial/inc/stm8s_uart3.h diff --git a/inc/stm8s_uart4.h b/Serial/inc/stm8s_uart4.h similarity index 100% rename from inc/stm8s_uart4.h rename to Serial/inc/stm8s_uart4.h diff --git a/inc/stm8s_wwdg.h b/Serial/inc/stm8s_wwdg.h similarity index 100% rename from inc/stm8s_wwdg.h rename to Serial/inc/stm8s_wwdg.h diff --git a/main.c b/Serial/main.c similarity index 100% rename from main.c rename to Serial/main.c diff --git a/serial.dep b/Serial/serial.dep similarity index 100% rename from serial.dep rename to Serial/serial.dep diff --git a/serial.ewd b/Serial/serial.ewd similarity index 100% rename from serial.ewd rename to Serial/serial.ewd diff --git a/serial.ewp b/Serial/serial.ewp similarity index 100% rename from serial.ewp rename to Serial/serial.ewp diff --git a/serial.ewt b/Serial/serial.ewt similarity index 100% rename from serial.ewt rename to Serial/serial.ewt diff --git a/serial1.eww b/Serial/serial1.eww similarity index 100% rename from serial1.eww rename to Serial/serial1.eww diff --git a/settings/serial.Debug.cspy.bat b/Serial/settings/serial.Debug.cspy.bat similarity index 100% rename from settings/serial.Debug.cspy.bat rename to Serial/settings/serial.Debug.cspy.bat diff --git a/settings/serial.dbgdt b/Serial/settings/serial.dbgdt similarity index 100% rename from settings/serial.dbgdt rename to Serial/settings/serial.dbgdt diff --git a/settings/serial.dni b/Serial/settings/serial.dni similarity index 100% rename from settings/serial.dni rename to Serial/settings/serial.dni diff --git a/settings/serial1.wsdt b/Serial/settings/serial1.wsdt similarity index 100% rename from settings/serial1.wsdt rename to Serial/settings/serial1.wsdt diff --git a/settings/serial1.wspos b/Serial/settings/serial1.wspos similarity index 100% rename from settings/serial1.wspos rename to Serial/settings/serial1.wspos diff --git a/settings/truyen.Debug.cspy.bat b/Serial/settings/truyen.Debug.cspy.bat similarity index 100% rename from settings/truyen.Debug.cspy.bat rename to Serial/settings/truyen.Debug.cspy.bat diff --git a/settings/truyen.dbgdt b/Serial/settings/truyen.dbgdt similarity index 100% rename from settings/truyen.dbgdt rename to Serial/settings/truyen.dbgdt diff --git a/settings/truyen.dni b/Serial/settings/truyen.dni similarity index 100% rename from settings/truyen.dni rename to Serial/settings/truyen.dni diff --git a/src/stm8s_adc1.c b/Serial/src/stm8s_adc1.c similarity index 100% rename from src/stm8s_adc1.c rename to Serial/src/stm8s_adc1.c diff --git a/src/stm8s_adc2.c b/Serial/src/stm8s_adc2.c similarity index 100% rename from src/stm8s_adc2.c rename to Serial/src/stm8s_adc2.c diff --git a/src/stm8s_awu.c b/Serial/src/stm8s_awu.c similarity index 100% rename from src/stm8s_awu.c rename to Serial/src/stm8s_awu.c diff --git a/src/stm8s_beep.c b/Serial/src/stm8s_beep.c similarity index 100% rename from src/stm8s_beep.c rename to Serial/src/stm8s_beep.c diff --git a/src/stm8s_can.c b/Serial/src/stm8s_can.c similarity index 100% rename from src/stm8s_can.c rename to Serial/src/stm8s_can.c diff --git a/src/stm8s_clk.c b/Serial/src/stm8s_clk.c similarity index 100% rename from src/stm8s_clk.c rename to Serial/src/stm8s_clk.c diff --git a/src/stm8s_exti.c b/Serial/src/stm8s_exti.c similarity index 100% rename from src/stm8s_exti.c rename to Serial/src/stm8s_exti.c diff --git a/src/stm8s_flash.c b/Serial/src/stm8s_flash.c similarity index 100% rename from src/stm8s_flash.c rename to Serial/src/stm8s_flash.c diff --git a/src/stm8s_gpio.c b/Serial/src/stm8s_gpio.c similarity index 100% rename from src/stm8s_gpio.c rename to Serial/src/stm8s_gpio.c diff --git a/src/stm8s_i2c.c b/Serial/src/stm8s_i2c.c similarity index 100% rename from src/stm8s_i2c.c rename to Serial/src/stm8s_i2c.c diff --git a/src/stm8s_itc.c b/Serial/src/stm8s_itc.c similarity index 100% rename from src/stm8s_itc.c rename to Serial/src/stm8s_itc.c diff --git a/src/stm8s_iwdg.c b/Serial/src/stm8s_iwdg.c similarity index 100% rename from src/stm8s_iwdg.c rename to Serial/src/stm8s_iwdg.c diff --git a/src/stm8s_rst.c b/Serial/src/stm8s_rst.c similarity index 100% rename from src/stm8s_rst.c rename to Serial/src/stm8s_rst.c diff --git a/src/stm8s_spi.c b/Serial/src/stm8s_spi.c similarity index 100% rename from src/stm8s_spi.c rename to Serial/src/stm8s_spi.c diff --git a/src/stm8s_tim1.c b/Serial/src/stm8s_tim1.c similarity index 100% rename from src/stm8s_tim1.c rename to Serial/src/stm8s_tim1.c diff --git a/src/stm8s_tim2.c b/Serial/src/stm8s_tim2.c similarity index 100% rename from src/stm8s_tim2.c rename to Serial/src/stm8s_tim2.c diff --git a/src/stm8s_tim3.c b/Serial/src/stm8s_tim3.c similarity index 100% rename from src/stm8s_tim3.c rename to Serial/src/stm8s_tim3.c diff --git a/src/stm8s_tim4.c b/Serial/src/stm8s_tim4.c similarity index 100% rename from src/stm8s_tim4.c rename to Serial/src/stm8s_tim4.c diff --git a/src/stm8s_tim5.c b/Serial/src/stm8s_tim5.c similarity index 100% rename from src/stm8s_tim5.c rename to Serial/src/stm8s_tim5.c diff --git a/src/stm8s_tim6.c b/Serial/src/stm8s_tim6.c similarity index 100% rename from src/stm8s_tim6.c rename to Serial/src/stm8s_tim6.c diff --git a/src/stm8s_uart1.c b/Serial/src/stm8s_uart1.c similarity index 100% rename from src/stm8s_uart1.c rename to Serial/src/stm8s_uart1.c diff --git a/src/stm8s_uart2.c b/Serial/src/stm8s_uart2.c similarity index 100% rename from src/stm8s_uart2.c rename to Serial/src/stm8s_uart2.c diff --git a/src/stm8s_uart3.c b/Serial/src/stm8s_uart3.c similarity index 100% rename from src/stm8s_uart3.c rename to Serial/src/stm8s_uart3.c diff --git a/src/stm8s_uart4.c b/Serial/src/stm8s_uart4.c similarity index 100% rename from src/stm8s_uart4.c rename to Serial/src/stm8s_uart4.c diff --git a/src/stm8s_wwdg.c b/Serial/src/stm8s_wwdg.c similarity index 100% rename from src/stm8s_wwdg.c rename to Serial/src/stm8s_wwdg.c diff --git a/Serial/stm8s103_Serial.h b/Serial/stm8s103_Serial.h new file mode 100644 index 0000000..c4b933e --- /dev/null +++ b/Serial/stm8s103_Serial.h @@ -0,0 +1,104 @@ + /*Header file for Arduino like Serial commands on STM8S + * Website: https://circuitdigest.com/search/node/STM8S + * Code by: Aswinth Raj + * Github: https://github.com/CircuitDigest/STM8S103F3_SPL + */ + + /*Control on-board LED through USART + * PD5 - UART1-Tx + * PD6 - UART1-Rx + */ + + #include "stm8s.h" + #include "stdio.h" + +//Funtion Declarations + void Serial_begin(uint32_t); //pass baug rate and start serial communiaction + void Serial_print_int (int); //pass integer value to print it on screen + void Serial_print_char (char); //pass char value to print it on screen + void Serial_print_string (char[]); //pass string value to print it + void Serial_newline(void); //move to next line + bool Serial_available(void); //check if input serial data available return 1 is yes + char Serial_read_char(void); //read the incoming char byte and return it + + + char Serial_read_char(void) + { + while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); + UART1_ClearFlag(UART1_FLAG_RXNE); + return (UART1_ReceiveData8()); + } + + void Serial_print_char (char value) + { + UART1_SendData8(value); + while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); //wait for sending + } + + void Serial_begin(uint32_t baud_rate) + { + GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); + GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); + + UART1_DeInit(); //Deinitialize UART peripherals + + + UART1_Init(baud_rate, + UART1_WORDLENGTH_8D, + UART1_STOPBITS_1, + UART1_PARITY_NO, + UART1_SYNCMODE_CLOCK_DISABLE, + UART1_MODE_TXRX_ENABLE); //(BaudRate, Wordlegth, StopBits, Parity, SyncMode, Mode) + + UART1_Cmd(ENABLE); + } + + void Serial_print_int (int number) //Funtion to print int value to serial monitor + { + char count = 0; + char digit[5] = ""; + + while (number != 0) //split the int to char array + { + digit[count] = number%10; + count++; + number = number/10; + } + + while (count !=0) //print char array in correct direction + { + UART1_SendData8(digit[count-1] + 0x30); + while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); //wait for sending + count--; + } + } + + void Serial_newline(void) + { + UART1_SendData8(0x0a); + while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); //wait for sending + } + + void Serial_print_string (char string[]) + { + + char i=0; + + while (string[i] != 0x00) + { + UART1_SendData8(string[i]); + while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); + i++; + } + } + + bool Serial_available() + { + if(UART1_GetFlagStatus(UART1_FLAG_RXNE) == TRUE) + return TRUE; + else + return FALSE; + } + + + \ No newline at end of file diff --git a/stm8s_conf.h b/Serial/stm8s_conf.h similarity index 100% rename from stm8s_conf.h rename to Serial/stm8s_conf.h diff --git a/stm8s_it.c b/Serial/stm8s_it.c similarity index 100% rename from stm8s_it.c rename to Serial/stm8s_it.c diff --git a/stm8s_it.h b/Serial/stm8s_it.h similarity index 100% rename from stm8s_it.h rename to Serial/stm8s_it.h diff --git a/truyen.dep b/Serial/truyen.dep similarity index 100% rename from truyen.dep rename to Serial/truyen.dep diff --git a/truyen.ewd b/Serial/truyen.ewd similarity index 100% rename from truyen.ewd rename to Serial/truyen.ewd diff --git a/truyen.ewp b/Serial/truyen.ewp similarity index 100% rename from truyen.ewp rename to Serial/truyen.ewp diff --git a/truyen.ewt b/Serial/truyen.ewt similarity index 100% rename from truyen.ewt rename to Serial/truyen.ewt

^DM^436YPbS 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 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/main.pbi.cout b/4_EXT_INT_1PORT/user/Debug/Obj/main.pbi.cout new file mode 100644 index 0000000..849ec69 --- /dev/null +++ b/4_EXT_INT_1PORT/user/Debug/Obj/main.pbi.cout @@ -0,0 +1,284 @@ +"E:\STM8\4_EXT_INT_1PORT\4_EXT_INT_1PORT\user\main.c" +-std=c99 +-ferror-limit=100 +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\inc +-I +C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\inc\c +-I +../../4_EXT_INT_1PORT\lib\inc +-I +../../4_EXT_INT_1PORT\user +-D__CHAR_BITS__=8 +-D__CHAR_MAX__=0xff +-D__CHAR_MIN__=0 +-D__CHAR_SIZE__=1 +-D__UNSIGNED_CHAR_MAX__=0xff +-D__SIGNED_CHAR_MAX__=127 +-D__SIGNED_CHAR_MIN__=(-__SIGNED_CHAR_MAX__-1) +-D__CHAR_ALIGN__=1 +-D__SHORT_SIZE__=2 +-D__UNSIGNED_SHORT_MAX__=0xffffU +-D__SIGNED_SHORT_MAX__=32767 +-D__SIGNED_SHORT_MIN__=(-__SIGNED_SHORT_MAX__-1) +-D__SHORT_ALIGN__=1 +-D__INT_SIZE__=2 +-D__UNSIGNED_INT_MAX__=0xffffU +-D__SIGNED_INT_MAX__=32767 +-D__SIGNED_INT_MIN__=(-__SIGNED_INT_MAX__-1) +-D__INT_ALIGN__=1 +-D__LONG_SIZE__=4 +-D__UNSIGNED_LONG_MAX__=0xffffffffUL +-D__SIGNED_LONG_MAX__=2147483647L +-D__SIGNED_LONG_MIN__=(-__SIGNED_LONG_MAX__-1) +-D__LONG_ALIGN__=1 +-D__LONG_LONG_SIZE__=4 +-D__UNSIGNED_LONG_LONG_MAX__=0xffffffffULL +-D__SIGNED_LONG_LONG_MAX__=2147483647LL +-D__SIGNED_LONG_LONG_MIN__=(-__SIGNED_LONG_LONG_MAX__-1) +-D__LONG_LONG_ALIGN__=1 +-D__INT8_T_TYPE__=signed char +-D__INT8_T_MAX__=127 +-D__INT8_T_MIN__=(-__INT8_T_MAX__-1) +-D__UINT8_T_TYPE__=unsigned char +-D__UINT8_T_MAX__=0xff +-D__INT8_SIZE_PREFIX__="hh" +-D__INT16_T_TYPE__=signed int +-D__INT16_T_MAX__=32767 +-D__INT16_T_MIN__=(-__INT16_T_MAX__-1) +-D__UINT16_T_TYPE__=unsigned int +-D__UINT16_T_MAX__=0xffffU +-D__INT16_SIZE_PREFIX__="" +-D__INT32_T_TYPE__=signed long int +-D__INT32_T_MAX__=2147483647L +-D__INT32_T_MIN__=(-__INT32_T_MAX__-1) +-D__UINT32_T_TYPE__=unsigned long int +-D__UINT32_T_MAX__=0xffffffffUL +-D__INT32_SIZE_PREFIX__="l" +-D__INT_LEAST8_T_TYPE__=signed char +-D__INT_LEAST8_T_MAX__=127 +-D__INT_LEAST8_T_MIN__=(-__INT_LEAST8_T_MAX__-1) +-D__UINT_LEAST8_T_TYPE__=unsigned char +-D__UINT_LEAST8_T_MAX__=0xff +-D__INT8_C_SUFFIX__= +-D__UINT8_C_SUFFIX__= +-D__INT_LEAST8_SIZE_PREFIX__="hh" +-D__INT_LEAST16_T_TYPE__=signed int +-D__INT_LEAST16_T_MAX__=32767 +-D__INT_LEAST16_T_MIN__=(-__INT_LEAST16_T_MAX__-1) +-D__UINT_LEAST16_T_TYPE__=unsigned int +-D__UINT_LEAST16_T_MAX__=0xffffU +-D__INT16_C_SUFFIX__= +-D__UINT16_C_SUFFIX__=U +-D__INT_LEAST16_SIZE_PREFIX__="" +-D__INT_LEAST32_T_TYPE__=signed long int +-D__INT_LEAST32_T_MAX__=2147483647L +-D__INT_LEAST32_T_MIN__=(-__INT_LEAST32_T_MAX__-1) +-D__UINT_LEAST32_T_TYPE__=unsigned long int +-D__UINT_LEAST32_T_MAX__=0xffffffffUL +-D__INT32_C_SUFFIX__=L +-D__UINT32_C_SUFFIX__=UL +-D__INT_LEAST32_SIZE_PREFIX__="l" +-D__INT_FAST8_T_TYPE__=signed char +-D__INT_FAST8_T_MAX__=127 +-D__INT_FAST8_T_MIN__=(-__INT_FAST8_T_MAX__-1) +-D__UINT_FAST8_T_TYPE__=unsigned char +-D__UINT_FAST8_T_MAX__=0xff +-D__INT_FAST8_SIZE_PREFIX__="hh" +-D__INT_FAST16_T_TYPE__=signed int +-D__INT_FAST16_T_MAX__=32767 +-D__INT_FAST16_T_MIN__=(-__INT_FAST16_T_MAX__-1) +-D__UINT_FAST16_T_TYPE__=unsigned int +-D__UINT_FAST16_T_MAX__=0xffffU +-D__INT_FAST16_SIZE_PREFIX__="" +-D__INT_FAST32_T_TYPE__=signed long int +-D__INT_FAST32_T_MAX__=2147483647L +-D__INT_FAST32_T_MIN__=(-__INT_FAST32_T_MAX__-1) +-D__UINT_FAST32_T_TYPE__=unsigned long int +-D__UINT_FAST32_T_MAX__=0xffffffffUL +-D__INT_FAST32_SIZE_PREFIX__="l" +-D__INTMAX_T_TYPE__=signed long int +-D__INTMAX_T_MAX__=2147483647L +-D__INTMAX_T_MIN__=(-__INTMAX_T_MAX__-1) +-D__UINTMAX_T_TYPE__=unsigned long int +-D__UINTMAX_T_MAX__=0xffffffffUL +-D__INTMAX_C_SUFFIX__=L +-D__UINTMAX_C_SUFFIX__=UL +-D__INTMAX_SIZE_PREFIX__="l" +-D__FLOAT_SIZE__=4 +-D__FLOAT_ALIGN__=1 +-D__DOUBLE_SIZE__=4 +-D__DOUBLE_ALIGN__=1 +-D__LONG_DOUBLE_SIZE__=4 +-D__LONG_DOUBLE_ALIGN__=1 +-D__NAN_HAS_HIGH_MANTISSA_BIT_SET__=0 +-D__SUBNORMAL_FLOATING_POINTS__=1 +-D__SIZE_T_TYPE__=unsigned short int +-D__SIZE_T_MAX__=0xffffU +-D__PTRDIFF_T_TYPE__=signed short int +-D__PTRDIFF_T_MAX__=32767 +-D__PTRDIFF_T_MIN__=(-__PTRDIFF_T_MAX__-1) +-D__INTPTR_T_TYPE__=signed short int +-D__INTPTR_T_MAX__=32767 +-D__INTPTR_T_MIN__=(-__INTPTR_T_MAX__-1) +-D__UINTPTR_T_TYPE__=unsigned short int +-D__UINTPTR_T_MAX__=0xffffU +-D__INTPTR_SIZE_PREFIX__="h" +-D__JMP_BUF_ELEMENT_TYPE__=unsigned char +-D__JMP_BUF_NUM_ELEMENTS__=28 +-D__TID__=0x3800 +-D__VER__=210 +-D__SUBVERSION__=1 +-D__BUILD_NUMBER__=148 +-D__IAR_SYSTEMS_ICC__=8 +-D__VA_STACK_DECREASING__=1 +-D__VA_STACK_ALIGN__=1 +-D__VA_STACK_ALIGN_EXTRA_BEFORE__=1 +-D__LITTLE_ENDIAN__=0 +-D__BOOL_TYPE__=unsigned char +-D__WCHAR_T_TYPE__=unsigned short int +-D__WCHAR_T_SIZE__=2 +-D__WCHAR_T_MAX__=0xffffU +-D__DEF_PTR_MEM__=__near +-D__CODE_MEM0__=__near_func +-D__CODE_MEM0_POINTER_OK__=1 +-D__CODE_MEM0_UNIQUE_POINTER__=1 +-D__CODE_MEM0_VAR_OK__=1 +-D__DATA_MEM0__=__tiny +-D__DATA_MEM0_POINTER_OK__=1 +-D__DATA_MEM0_UNIQUE_POINTER__=1 +-D__DATA_MEM0_VAR_OK__=1 +-D__DATA_MEM0_INTPTR_TYPE__=signed char +-D__DATA_MEM0_UINTPTR_TYPE__=unsigned char +-D__DATA_MEM0_INTPTR_SIZE_PREFIX__="hh" +-D__DATA_MEM0_MAX_SIZE__=0xff +-D__DATA_MEM1__=__near +-D__DATA_MEM1_POINTER_OK__=1 +-D__DATA_MEM1_UNIQUE_POINTER__=1 +-D__DATA_MEM1_VAR_OK__=1 +-D__DATA_MEM1_INDEX_TYPE__=short +-D__DATA_MEM1_SIZE_TYPE__=unsigned short +-D__DATA_MEM1_INTPTR_TYPE__=short int +-D__DATA_MEM1_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM1_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM1_MAX_SIZE__=0xffff +-D__DATA_MEM1_HEAP_SEGMENT__="HEAP" +-D__DATA_MEM1_PAGE_SIZE__=0 +-D__DATA_MEM1_HEAP__=1 +-D__DATA_MEM2__=__far +-D__DATA_MEM2_POINTER_OK__=1 +-D__DATA_MEM2_UNIQUE_POINTER__=1 +-D__DATA_MEM2_VAR_OK__=1 +-D__DATA_MEM2_INDEX_TYPE__=short +-D__DATA_MEM2_SIZE_TYPE__=unsigned short +-D__DATA_MEM2_INTPTR_TYPE__=long int +-D__DATA_MEM2_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM2_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM2_MAX_SIZE__=0xffff +-D__DATA_MEM3__=__huge +-D__DATA_MEM3_POINTER_OK__=1 +-D__DATA_MEM3_UNIQUE_POINTER__=1 +-D__DATA_MEM3_VAR_OK__=1 +-D__DATA_MEM3_INDEX_TYPE__=long +-D__DATA_MEM3_SIZE_TYPE__=unsigned long +-D__DATA_MEM3_INTPTR_TYPE__=long int +-D__DATA_MEM3_UINTPTR_TYPE__=unsigned long int +-D__DATA_MEM3_INTPTR_SIZE_PREFIX__="l" +-D__DATA_MEM3_MAX_SIZE__=0xffffffff +-D__DATA_MEM4__=__eeprom +-D__DATA_MEM4_POINTER_OK__=1 +-D__DATA_MEM4_UNIQUE_POINTER__=1 +-D__DATA_MEM4_VAR_OK__=1 +-D__DATA_MEM4_INDEX_TYPE__=short +-D__DATA_MEM4_SIZE_TYPE__=unsigned short +-D__DATA_MEM4_INTPTR_TYPE__=short int +-D__DATA_MEM4_UINTPTR_TYPE__=unsigned short int +-D__DATA_MEM4_INTPTR_SIZE_PREFIX__="h" +-D__DATA_MEM4_MAX_SIZE__=0xffff +-D__HEAP_MEM0__=1 +-D__MULTIPLE_HEAPS__=0 +-D__DEF_HEAP_MEM__=__near +-D__MULTIPLE_INHERITANCE__=1 +-D_RTSL_COMPARE_T=unsigned char +-D__CODE_MODEL__=__SMALL_CODE_MODEL__ +-D__CORE__=__STM8__ +-D__DATA_MODEL__=__MEDIUM_DATA_MODEL__ +-D__ICCSTM8__=1 +-D__LARGE_CODE_MODEL__=3 +-D__LARGE_DATA_MODEL__=3 +-D__MEDIUM_CODE_MODEL__=2 +-D__MEDIUM_DATA_MODEL__=2 +-D__SMALL_CODE_MODEL__=1 +-D__SMALL_DATA_MODEL__=1 +-D__STM8__=1 +-D__PLAIN_INT_BITFIELD_IS_SIGNED__=1 +-D__HAS_WEAK__=1 +-D__HAS_LOCATED_DECLARATION__=1 +-D__HAS_LOCATED_WITH_INIT__=1 +-D__IAR_COMPILERBASE__=594179 +-D_GOANNA=1 +-D__DATE__="May 26 2022" +-D__TIME__="10:52:52" +-D__STDC__=1 +-D__STDC_VERSION__=199901L +-D__STDC_HOSTED__=1 +-D__STDC_NO_VLA__=1 +-D__STDC_NO_ATOMICS__=1 +-D__EDG_IA64_ABI=1 +-D__EDG_IA64_ABI_VARIANT_CTORS_AND_DTORS_RETURN_THIS=1 +-D__EDG_IA64_ABI_USE_INT_STATIC_INIT_GUARD=1 +-D__EDG_TYPE_TRAITS_ENABLED=1 +-D__EDG__=1 +-D__EDG_VERSION__=409 +-D__EDG_SIZE_TYPE__=unsigned short +-D__EDG_PTRDIFF_TYPE__=short +-D__EDG_DELTA_TYPE=short +-D__EDG_IA64_VTABLE_ENTRY_TYPE=short +-D__EDG_VIRTUAL_FUNCTION_INDEX_TYPE=unsigned short +-D__EDG_LOWER_VARIABLE_LENGTH_ARRAYS=1 +-D__EDG_IA64_ABI_USE_VARIANT_ARRAY_COOKIES=1 +-D__EDG_ABI_COMPATIBILITY_VERSION=9999 +-D__EDG_ABI_CHANGES_FOR_RTTI=1 +-D__EDG_ABI_CHANGES_FOR_ARRAY_NEW_AND_DELETE=1 +-D__EDG_ABI_CHANGES_FOR_PLACEMENT_DELETE=1 +-D__EDG_BSD=0 +-D__EDG_SYSV=0 +-D__EDG_ANSIC=1 +-D__EDG_CPP11_IL_EXTENSIONS_SUPPORTED=1 +-D_DLIB_CONFIG_FILE_HEADER_NAME="C:\Program Files (x86)\IAR Systems\Embedded Workbench 7.0\stm8\LIB\dlstm8smn.h" +-D_DLIB_CONFIG_FILE_STRING="C:\\Program Files (x86)\\IAR Systems\\Embedded Workbench 7.0\\stm8\\LIB\\dlstm8smn.h" +-D__VERSION__="IAR C/C++ Compiler V2.10.1.148 for STM8" +-D__CODE_MEMORY_LIST1__()=__CODE_MEM_HELPER1__(__code, 0 ) +-D__CODE_MEMORY_LIST2__(_P1)=__CODE_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_MEMORY_LIST3__(_P1, _P2)=__CODE_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_MEMORY_LIST1__()=__DATA_MEM_HELPER1__(__data, 0 ) +-D__DATA_MEMORY_LIST2__(_P1)=__DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_MEMORY_LIST3__(_P1, _P2)=__DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__CODE_PTR_MEMORY_LIST1__()=__CODE_PTR_MEM_HELPER1__(__code, 0 ) +-D__CODE_PTR_MEMORY_LIST2__(_P1)=__CODE_PTR_MEM_HELPER2__(__code, 0 , _P1 ) +-D__CODE_PTR_MEMORY_LIST3__(_P1, _P2)=__CODE_PTR_MEM_HELPER3__(__code, 0 , _P1 , _P2 ) +-D__DATA_PTR_MEMORY_LIST1__()=__DATA_PTR_MEM_HELPER1__(__data, 0 ) +-D__DATA_PTR_MEMORY_LIST2__(_P1)=__DATA_PTR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__DATA_PTR_MEMORY_LIST3__(_P1, _P2)=__DATA_PTR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VAR_MEMORY_LIST1__()=__VAR_MEM_HELPER1__(__data, 0 ) +-D__VAR_MEMORY_LIST2__(_P1)=__VAR_MEM_HELPER2__(__data, 0 , _P1 ) +-D__VAR_MEMORY_LIST3__(_P1, _P2)=__VAR_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__VARD_MEMORY_LIST1__()=__VARD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAP_MEMORY_LIST1__()=__HEAP_MEM_HELPER1__(__data, 0 ) +-D__HEAP_MEMORY_LIST2__(_P1)=__HEAP_MEM_HELPER2__(__data, 0 , _P1 ) +-D__HEAP_MEMORY_LIST3__(_P1, _P2)=__HEAP_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__HVAR_MEMORY_LIST1__()=__HVAR_MEM_HELPER1__(__data, 0 ) +-D__HEAPD_MEMORY_LIST1__()=__HEAPD_MEM_HELPER1__(__data, 0, _ ) +-D__HEAPU_MEMORY_LIST1__()=__HEAPU_MEM_HELPER1__(__data, 0 ) +-D__TOPM_DATA_MEMORY_LIST1__()= +-D__TOPM_DATA_MEMORY_LIST2__(_P1)= +-D__TOPM_DATA_MEMORY_LIST3__(_P1, _P2)= +-D__TOPP_DATA_MEMORY_LIST1__()=__TOPP_DATA_MEM_HELPER1__(__data, 0 ) +-D__TOPP_DATA_MEMORY_LIST2__(_P1)=__TOPP_DATA_MEM_HELPER2__(__data, 0 , _P1 ) +-D__TOPP_DATA_MEMORY_LIST3__(_P1, _P2)=__TOPP_DATA_MEM_HELPER3__(__data, 0 , _P1 , _P2 ) +-D__DATA_MEM0_SIZE_TYPE__=unsigned int +-D__DATA_MEM0_INDEX_TYPE__=signed int diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_beep.o b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_beep.o new file mode 100644 index 0000000000000000000000000000000000000000..45235ed6b1fd60dac3fc7ce9e89c891434989e99 GIT binary patch literal 1402 zcmbVM&2AGh5Ozw$g$oilxL8#Vt*UjiRVYz!kfu_kK&mzZ4wfvh*GWv*>y_=TniF>( zfQR96cmtjQ#+%KL0!Xmddi~AM=kd;r_w#Uk)jDXQ&1j)-fOiz_FO{u_Fsw)DG1!P( zIBz{q04?=utz}`fmbphnaZ9Y%CY4#m-+yf)w9(HWV0^iC0C{*pZ>Mkjw8w@Yr)>0Y z%Hr$E&Ga|9bkb7IRZawA3}Q03bY5!L=|Jc*lL(Do-{8UN;N%1kj4o6rEq;GS;x36v z-0S0+u{eZk5)wxeN0SUkQEr%UAOuk6)?~F(<(bNBy?|UWZM-u1%F!pB*Ia9yV}e(- zR3_yd^tC@E5IbF)xaY7%P-&T}Qsc6*qlz1PZT1gnM#;2`Ap66;oyQ^TQj#@ z<15IL!$%MO^J5y)ce~0d9qL4;sZ8+)WA74~iv@l~y3~2yr{mEZnq~nyos-2Ojz*Y} zQ+W1k2tldJ1svdS9#vK0eD_w)9gfcd>Y4cG4-EmF71g;MOQbAFQ?khJ8gu1?SB=T@ zLYc;7uXL|5x#ZTz)pc5xeXJ78?GjxAfIGJBN>p`arLq!*$^%X}9g0>R8gx()HiMpG zsdU1s!W)aaV6dLuOY7i5px*ZSZ_yu>U=II|M_adwe6}O6;S&G{YXR07%r4BpUGtv; oezqe6L|?7-adYd;6M2!`G93sY-q2><{9 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_beep.pbi b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_beep.pbi new file mode 100644 index 0000000000000000000000000000000000000000..4128f48cdcecdea0a9cc9fe105b555998db15358 GIT binary patch literal 687 zcmZuty-vbV6h5cGrB+enqyrHrU@?L~N@Gl8Es>~5po2-#rj&{`&??j#Oi{Rl4GU#QwB?=fP;HA7g zeK!G#jUAzOq2D}@@D<|{vsPlW(5A2 zv26E;tqjb&d($=^f$jo>)bE4>=@iIo=0nrfT{94!G^>){v)TjQwH#Y=>?^Aqa?PWI z7|Qr>9zFT@WdYZ=>X##Y!%qZ55G!J+MQAZDVF;lE7-GJdD^3hPA6Tb_rg46w8S`$Q zFHg*r7Ju7KUGqB3#uRb|eiAcJFaD{^!1D2)Wqb5+om9^;_CXd}P34qt6*T!=(W*5? U%hk^s%Dy_=TniF>( zfQR96cmtjQ#+%KL0!Xmddi~AM=kd;r_w#Uk)jDXQ&1j)-fOiz_FO{u_Fsw)DG1!P( zIBz{q04?=utz}`fmbphnaZ9Y%CY4#m-+yf)w9(HWV0^iC0C{*pZ>Mkjw8w@Yr)>0Y z%Hr$E&Ga|9bkb7IRZawA3}Q03bY5!L=|Jc*lL(Do-{8UN;N%1kj4o6rEq;GS;x36v z-0S0+u{eZk5)wxeN0SUkQEr%UAOuk6)?~F(<(bNBy?|UWZM-u1%F!pB*Ia9yV}e(- zR3_yd^tC@E5IbF)xaY7%P-&T}Qsc6*qlz1PZT1gnM#;2`Ap66;oyQ^TQj#@ z<15IL!$%MO^J5y)ce~0d9qL4;sZ8+)WA74~iv@l~y3~2yr{mEZnq~nyos-2Ojz*Y} zQ+W1k2tldJ1svdS9#vK0eD_w)9gfcd>Y4cG4-EmF71g;MOQbAFQ?khJ8gu1?SB=T@ zLYc;7uXL|5x#ZTz)pc5xeXJ78?GjxAfIGJBN>p`arLq!*$^%X}9g0>R8gx()HiMpG zsdU1s!W)aaV6dLuOY7i5px*ZSZ_yu>U=II|M_adwe6}O6;S&G{YXR07%r4BpUGtv; oezqe6L|?7-adYd;6M2!`G93sY-q2><{9 literal 0 HcmV?d00001 diff --git a/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.pbi b/4_EXT_INT_1PORT/user/Debug/Obj/stm8s_clk.pbi new file mode 100644 index 0000000000000000000000000000000000000000..47c532a0e4ae2c921db40a1683df548ceb9d1fea GIT binary patch literal 326394 zcmZ79cUacZ4({E>aP zechG+m;X6;+jrmT+!MOy+LUeE);*zn?r_W}EXQSRNGkblN@T%$=*4tIYH_yv4^>&HWWe7F0_&}(i$z#p(a8T!c> z_s=|NP#_Sr{v7)A822wgNFW%p{u27jBW{AtgA5S~4Y7y>d$gMV>kBi$si z+r)<6W)VqPve@lnx7}_L$@XX5nPS7lZXae5GwnOv`C`Mxh7Grf`Sxes46z8Y;Sm;* zVL#~R+g$$$v4{~Ck>jbZ@3Dw3`*ZG9v3tetxz{4Da_*YgePZ|CXGz%iyWL{ zMReQuy4S@X5WD{Yi@46~8|S#)?q}pxba~~dI49u78%V{2GYq6=fC&at31FguR3bRr z;e|gaFZ_WAEn>Da&P^A4NbJFfEFvA7BlfV^Ll0ZT9Bi)GBVrFfVi9w(rN#@PmhwWD z8AvSy^9-c&z~u%~%fS@}QY*lf22v}*RR&V4z|{s)tHCt}Qft7q22yLmd;_U`u)sj7 z04y|+Dg=uRq>8{|1F2%L#6YS9EH#iS1kOpoz(Ju zVq+h(h&|X|vB$+8d)y-SV*A9#i9J5fBKBeX#hwrw_k>04#}0^%7kgs7MI68micJt3 zKfxjnVu!>gicOek5r?qDVo!=qe9|HgV@JfE5_|F~i#URvarkEOwAfQmTf`Y>tb11M z8L_9Iv52!+tJoLCp829hv|{JPo)!DzvlejB|<;hFuhU zPVCFiS;R%`lGs_JY_~U$BTy?26cn zVlTXC5m&IQVlRok_>x6j#jc5cP3)zwSrS;WJNSz>RqXOvZ6H+wmKsQvf)y@bPQNY> z`L(ZGM1}jfTPgOk*w>FY)f5RfGuqLr@ihbjo7SZHB>TVJHme@DHWf5Dj ztzxf;ed`sA*otiv`?lCC-?oTt*mkk+h<*Dz7O@>WVq7$Jgo{2c2Va$g-+9#{PP^mW zi(;>dz51F(Ty)2{m&9Hdd+l|LxP)C6dqeE?H!R{Z)?>U7s)rYH(?IGb*k>Ts2lg9C z^@9TjQUl;E1F2hJlsEW2NJV)8H`+id8k}SxH3^(-AT=4BY9KWgoMs?34NUZSd%P)c zk2l`5h(vFqnK^d*32vVQFF?h`s-TMWkV~#Xc1K;6sa;jirlyB=+G)7Lkt45&N## zN8h!GIoMpW?}>f)dloSl%Mts&*!R9~5joyCcahk?iGBayEMgJ1SnLO4|MmlmSd1+Z z`=QtmerOR(uw1bpiT&_L7LkiB75lN+kA7?sOR+q$pNReVCl-;1Ef@Q#*iU|H5zDca zVm}l6>CY@;CAM1Z=VCwmxkaqT){6Z??B~C*h_zV0*e}I?@k@)y#|p$g7W?JL7Eyo| ziv3FL<6l`sAyzE*Yq4Mb+9Hav60zTi{rWc+QG%6;{Z{NZzqN=mY@OKe#D4obi&%%1 zi~YOU@BZB)%CYrgzZd)W-&@3bY=hV*V!!{yA~s+f#r{L=lmD=YjaY@)AH@FS4;E2@ zRf_#l><@pmh)S$V>_5f+_@5S0g>4f1lh}X$$s#sk)nfl8_NV`{h-$1x?9XEV^=FHy z!D_|+BKGIMSVS#WC-&cBfBA2VsKXk>{wnt0f3=7PtWoTL#Qyp}7SV_`iTzFNfBt3> zP1qK(zl;6t?-sEIYZm*5*x&zQ5zW{(vHunO$NyTyHmpVLpJM;}Pm5^5wu}8s?4SR# zi0#-;u_#;cUkteu-7Ole8fCNeZuo@pm4Z6KSBjGcQYXPv22!WM(*{zf!7~O@XTY-t zQfI+d1F2T^4veylx<%8c5v)dkv&| z!9D}2KCs_FsvjIMkQxAQ8A#m%qkP79M;{PyV|;wrPSOwCXq%;DeB<3%;mOLAY?h9N z3DdC@HFMAHcQWd6NINLPqSG%0ZtT-QJ!wIbRwK29IG5- zvvd-iEF7mCYqNARJX1JcInHM3nQ)5m4CQ#6rBmQk;RNLwHcO|%vxF0s6Ks~A1*Zuo zDJR-2od(YqPF7B`S$Z~{E<95?*=Ff?yPPbV)3(gjvt31bM>1=p`@I2+Y zHcKyn7Yff;o@cZ4LO4e_LwUZ<(mC)V;Y{TWo23`Qi-oh4Gi{b$3@;JRR?f0ndI_8> zyg)hIX6ambsqjMO1vX1Bh4Y1Tlo#48o$njt76>m=&aqj#04@|>th~r(=|Z?jc!~02 zo2853V&PonB{oYJ!zIE?m2+*DE`dvhmnko`S-KQnC!D9e%x39zaJleu8Q!cexdJDW&c%5>Y&C*-pX5n(>bv8>k!`p<{E0^0Wy$#+j zyg_-r&C=W99l{%xH`pw_1KufIp}f&%>7DQ{;Y#HSo27TbyM?QiD{YqE4et@&q+DgQ z^d5MxaJBL#o2B={`-C?uSKBPT4?ZAVqrBN>=>zaV;acSyo23uJhlJ~tYi*W31RoZz zSFW>J`Y?P{xIwwzX6d8wG2uq#2Aidi!N-N0lpAf9J`SG{-lE)Ov-Ao0r0`bdEjCM^ zgii@KD{r+~`V@Rxc$;#w&C;jgGr}#(+iaFT1GfrqS8lOcx)nYryhC}r&C=)K^TIoo zci1d_9=;&FOL?cw(ih-1;oZu+Y?f|=FADEb-fgq=MfkGtUgbSDOJDXq=5`40Q{HQ{ zbO)z9h4(A(vstEV1K$)ru6)d9>6>t`@CoJPHcR)yeZnV|PuMKo z2loq~Qa)+3bU!>Gd|LUG&C&yKlpj8$eA;H|DE}CDlJHsOGd4?4f~N?#DxbAkdI~&E z_?&X9&C=807~%8E=WLdafn$X)D4(}kIu?!>Zd1NsvvfS1Abe4|&1UHYI8peL@;Va6WHcQWj(}lZ~ zuh=Y|4$l?7s@!F>^jvtJ@HOSDHcQWg=L>f$U$a?yKAa(ZUAfz4=?pki_=fUzo24`1 zEa4vI8#YU4!P&w$m3wTK&W0BX_bT7CS$ZM7NVreA*JkNO@M7V9EkgEa{a2p z%5xl+z6xIxo~Jz5VWr`2;rYt*9G32euM1}=&v#h*I@}|ishr`kbPs$}I7>OxVdO;QSUMG+C0wXn;IQ;8I8C@nxzJ(hG&o(j zSh>hy>2!FGaEWrU!_sr$dBUa2B@Ro^gXasEDVI7dJs-{#UZ-51}X}aEtAyM>P_A9Yx|8@?fYT=|&8(l_89;S(zoEKAl#~a)?w+WAV13r zpHpsiSb7pXS@^v2Iftbu!&8JWD4%y&dI~&MxJ~(j!_rgX>B1M4+Z>jj4#x;zQoiW0 zbPOCPd|COD!_sl^4B>X=%MMG=fD?o}l-nJaPJokyJC!>emQI3`g|8@gIxL+GrwDf` zUvXGE1x^*ds@&zUbSj)39Q>7^$_@tH#RgJ~!6gP#OTb(Msa$ZWfz(oPnSsJoU_KH40ZCQJ7Q$Gd&PG0M|r={~q$ zI954EmhOiKgyWQBW$6LlBILt#llOJ7t7L%d5|T- zxynmq=_PQk@KWVmSvnV9CcI2}sVuz=&J)g4UM5TD!OMl0E9c45%i$HmE0mYZ(ktMV z!Yh?m$kHp})xxWkSIW|>;Wfgml~>8qYv8rQYm`^Z(re*-;kC+ZWa)gkKsaA{tt?#t z7YP?A=gZPXaItWqa)B&e43`KODHqDpC2*N=v2u|tT?VfcE>SL)rPsmb!llY3vUEAT zUbsxTRF+;3ZxCLmTqa9zfGdQ{mDkDA6>z2SdgXFix)QDu-k`i*mac*~32#*1AWLt8 ztA#6+H_Fo0aE)-Ka)m5i1J?>yDObwUwQ!yACgmzwx(==vu2$Y8OV`7V!kd+=W$8w^ zNw`LNvn<^NZxyapu92m;!p*{U%C)j|Gu$FvuUscfx4=7u8+Qr;;`_rN!WcPsCbrEkK$!h4i= z%hJ7YpYUGgJ+gEk+%LROd9N(p4-W|MSKcQ}55TvC4=C@KrEkHpL*RqT2W08kA^h|s zd`S7AEFA~O3m;ZKBumG`GlY*QAC{$OzzM=fm5<2M32>6|G3BGObkdMV-I>D2m5<5N zGdZ0id_wuSES&rB={fLR;j_wT zWa+u^eBoB*v$FJjI79fHa;q$z0cQ!HS3W08XTb}EFDRdvr5C_C!fnbIWa%7u)sVqI z<58=I@Lv)cNUa9f7)Y%F*BVHz1@jH0^1(s_sY0;GK&l8VHjpX?OAMq+z)}OLQn1WG zstjCbAhixGH;^g^H_O}UqQ0HlWa-UA#=AAbmy|Ec(lv0c@MYyovUDw6C)}=lS(dJY z>xDa%+hyr`xIws6xkHw2fE$IcD0j-zjc}82m+}=^x(VJQd{wzimfiwy6~3l?RhHfg zHw$+w>(b5eHsR~a-LmvHxJCGe@^x9d1wJ6$qkKb_J}_jgdr5ZM@iv+ z311POp&akA^cA>EI6--a$I@N!RpCVC1dpY!!rj72%84FJcf;3(la-S^mc9<(5T2== z?6LF>xJNied8WtGJ@8H8ROJ+prEkK0!n2f9J(li+`-Rh#XL&5$4-W{>R!;L+dH}v9 zoUT0EW9eIP^iX(?a=ORT(L?#8LgBf}b3B%w1Wy*8r##nV>B;a^;rYt*JeHmcPZ!Qm zp6{{rbT~#hQ#r$9=@>XxI7>OxW9e8pUN~Dh%VX(yc+SwlU%aU~Lj&$y1F5;-JOinD z;CutA`Cx{DR0f!7Ae9Mb8AxS;*#=VC;8MB#1$z0}9!oDB%6~f|yij?8$I|&jA9O2> zhoCBWh)M&gO0ZrYAV(iyp~uqoJZ^*VBIO*9r5oU#!i$v`c`Uti=)>+V;U&t8J(k`D z?-tHgUgELzZg`LIQsrEarT4)5gqJBV^;mizyk9s^d6~!3`{7pOm7!XBWzHE$odeGs zNSy~S7)V_J+YF@Iz>5Y_7r}M|sdli_K&lh$k;`AMm!Idcbk9(pTMDmGUhc8a(AHh8V_8jq!8ZhOLw70y>) z>#=k!94B0$obR!892_rPs9fN&bUd6OT%=s+v2+5QC|s;u4osB+XjCzqgLIZy;3#_6>_^9y^)KMPdn1R$WuvH$QULT;&W9io09(T_P zHz?P8EPW2XBHXCl;IZ_T+a7YegqxHbJ(li*uL^HbZt__AD%>r+Re6iY(%tZN;b!Hn z9!p<`r`$gH1Bse)JGYOxowM8YY_rGGGj4y_O%QHT-sZ7%0-PwkUAe_$=|nh5c!%@1@3C|NTqt}{`GCjLh44nPkAg|4>t&(Q9kXlbOYQdd{+64$I^{(lW?o@S&yZg;H|>v zlv_QP-U>GhpI1KTv2-)MP56THd5@*H!7ajV$`?GAZh?0QUsP`MSb7J%Q}~kdMUSO- z!n=eoD_`vG0@!9C)dpTPkh%z7GLX6iUN(@r z40g+F-=(kp6_2I6`7F6Ed{w#2W9jSg4dH9bS3Q=#0rv=ZD_`?ix(B`~d|kQQW9gf4 zuka1!>mEz@!hOO$$~Qcg?t}YaF%eAa-xr=v)~27$;wGSmR|^PLaE@?_@=PB~ z=fI1EQW1;u)XY8o?$5sU~oXfz%dotAW&3u-QPW8Qf+dwGC_;<_!9mOH|7+zq{QyNp0uk4g;wj z-~oA)EY&wju8*Y;4CAjg3NKS$>SO7H@FC$mU@lfrA2*Z5faBz#IZ zUwN&MrBA_^gbS4OeJp*6ua1|63zZ9eEPWYn7cNpR^s#h1+#y`7T;yZv4!BdeM7h|< z(w*=X;Zo%iA4^|>yM)V>OMNWe1z#0jr(EV^>8o(JaJlk2A4_-h1^I^XdgXE-OW%Nd zgf}R!_px*j+$+3Md4rFod--JO6RuF+=ws$Zxx&ZN{qTTrm2#zzr3c_!!kd(< zd@Ownjv5YED{u0#bky*%ZnW@bGN5hkZYm_(pSb7pXMYvYE#>diA;HkoO%C$b0 zo(fMBu2-(}vGg=}x^RPXy^p1*!!g2*$_+l2j)7x^o0J=UEFBBS32#wu^09Or951|8 zd5e#w=P7-cW-sWTJBsf`kyK;+A!aJ0=`&fD= zoFcqad54dsQ{Y*`yOekOSb7$mCcImDmye~>;Mu}^lz01BdN!OcyjOXTkEPS$xx)LD z_xf0RE<8_ozw$mGOV5Mn3m;J4?_=rtaE9T z3cx}GsY0;GK&l8VHjpX?OAMq+z)}OLQn1WGsthbQkSYhO<#jrtuhVfKOIHsc?`{@8 zseHo6(wpHL;Zw>deJouA*9xCjKILQSTDVU5jPhw8OV`2m!e^Dw_*l9gZV+x&KI>!Y z2Dnl9oN}v=r5oX0!snIG`B-`v?~C2S7nINYSb8_SN4QP-f{&&5z%HPA4~6p_X}TEzT{)+{qO(g!OP_|% z2;We??qlgQ@LAy=Q6mPw zAS!AEHv}}0iUubcNKFD`Mg#^uC8lCV40U4-q+-E11F1ML-aslIoM9j}157ZGN&piL zq!Pg-1F0l1*+428oM|966HGCXN&!<1q*B3I22!)YGy|zLaJGTeY%twGDjm!)kjelv z4Wu%`ECZ=5Fxx;X8(d%@wE$dbAhi(8F_6ju7a2$`0+$#_Edg^4q;kQf22xAGWd>5q zz&rz~JaD;z)N*izfz%3crGeB+FyBBbA1pACDgX-&qzb_z1F0gg*g&cnEHRKO0ZR>} zO2IM%sWPzKK&l*EZy>cE++ZNJ0o-UHwGpf^kg5PH4Wuf;Dg&u1aFc=5Ca}&xst&9- zkg5k845S*sMgyrvu*pEG3EW~JwFTU2Ahi{2HjrutTMVRH!0iT7+rb?MQaiw%22wl0 zT?SISz}*H?yTLsMQhUI?22y*$Lk3cZz{3VohruHTQb)j}22w}CV+K;kz~cr|$H5Z@ zQYXNZ22v-%(*{zf!7~O@XTY-tQfI+d1F2T@|?;1*1m} z{BaC8;kn9l{4Bi$&J~`gJlD_Cx$siq`O5SBEWH$7CY+%>-_O#^ z;5^|>3q0Ac(L*#KT8+DMZ!yz7yDVd2rd@RRbJv}>0-DlzrrEB3j;UeWiKTFraO~S>>MShlU8p(f!DqNym>}TmM@K)hc17yj{7)&(dA+RpA}V+x;wk6}~3CQ+bD6>t`@LuITewOZq`-Jx?@Ab2EAKWjzUwNOO zrTgIl;RDM1{VY8I-x5Bke8A7rx8O;m;6us>{VY9c)L3`2@L}acewLmLPZ2(%eAv&@ zQ{bt>N0pEGS$ZlwP57AdQ9nyhgQp80S3c%v>FIEc@CoJPewL1bV}(yDpYXGEEIdQ_ zl=4YGOV5B4gikA<^0RaToG5%o`Lv&<6X7J`v&v`uES&@=3%4qt^|N#`JX83ba;u-E zXTmAM=atX-Svmzy6~3T+-p|shaGG$N@&!Ljr@^y@FDkeBS$Z~{E__M(qMxPH;W@&W zl`r{OdJa5axLx_OpQY!Idd$rb?oe*`vvdZWDcq^t;b-YgI7|47a;KlAv*2vuF6AqJ zmd=J32wzq1^0V{;I7j%J@>M@e=fI1EyOpo`S$Yw?Sopefx1XgK!%Kv3C|~!p^b$B% zxJUVhpQUr*rNTFrd;BcD6kaCWt9;YX(#zmH;XdVFKTGGq%Z2-u`}{1u99|(jpxp0g z=@sxw;akcBewJPduM&>ZUu|~F&(f>ll2QDwm}upw085vQn&6fSPg0H!uyiS0COlbr zQh=q);B~@NlqUyRdL3LYJXLv0fThdf^}^GXrv_MhJ-k79y7IIDOK*TT3dbl<53uw` zxKcP)IVQl;m2j1CoN{b{rK?7L$=xIzuN)U(=}mC8@C@bn083ZHn}rjUX9QS!Gh8E_ zsGJaB=^D6JI7vA%z|ysFop7>pQh=rF;CkVi%E(I%@PIZnSWga%O;~qv1)y*~(b~mYxJp7G9v79boCn@D$;N$_oN4 zJq4aBoTI!jz|vFUX~K(?a{??q4W2H%Sb0%^rKiI&!b_AF2Ut1=jup;TUJ_vGSU662 zsd8?BrQ_gu;bqE811ud6&k)X2UKU{K8E}H|a^<`LODDjI!Yh=Q2Ut20P7+?JyduET zNpQ08D&>^{mQIFe3a?gP6=3O^aEkC6<<$X}PJvT}*D9|GuyiUsOE_P7ZGfd`!D+$; z%J~77PJ?F)7b+J7Sb8>`E?lHs7+~pic#d$fa#4V#=fHD?OO%TPEIk*VCtRvr5@6|h z@OoH zfSZKtmFog5-2`tHZcwfdu=G~=fN-O7Lx80ZaDj(}o0J;^EPaUA^04q0<)#2jABK+# zZ<BVCkbg$T8t&<*fmhJ_etX_s%xu<^W5d8vTshC8t}Iw*^?bi^skpr?)G&1X%h8 z@5{-N@DAne0hXQ|`J@{k$%E`v-VtEw_(=X69pPQdI|D4804E9WR^An0>7>ZV+|)?t zI=80d&cYUVr1Qws$j^B4t4{ao+1&w_-*$SZcc1;$}hJ(pr`f*Sh~i3)7L0`Pn0kY8eXT=__Vr4ya^eW}7Hl#d2jI@5XCmm_>q`B;FZbDS5v$9c6+iCWgF zfd6s(@jLzURz0l;j|W)Zs(1Lq->UxCIdn!3od~e6hh87&e*-(Kb~3=e5qe{s|7TdM z+Nl8hv(TUJ@&6S&r*=BP{x$Ts`@L~o$9XY}o9+e1+2igC$gjG+pvTSxSbp2>oq_uY zy_fE{?;jQTDu>$i(Afa{)zDWb242JlUE7PH7smx&!UkR2OQDy>1>VOl>Ob2WVBZgY z^kCoz*r03sLFh;KdlPw~dS(0)-ih|aJH01?OaFJVmjb~j?I-UF${X#nKGwMaD<6u% z@HblUJr1?&q4NRuz0gO`2IU2Is9gxKyujyzKgT-N+5+s)L%+T^_^;SGbctDV$G@lSr#=&s>$s}NE(KVwsRXzu&;z(c{KDLY(VXLfc;MB zJ1>S_#crwH2(Yh)UVSn28WyF$s<z7~4z#Zaz%0!1s{46yW4`{~ds;YrH90hV43 z7Ya{S?hCMV5x-C;q`&cZih6&5rPtZt4OPhTsmcQZmac$ngr_Or3b1so{Yq$y@O0&< zAWLtxUk~jRj!}*dvh*(djnF~iSmjAUmOf%X89F5#r#v~x(x>fb_!YmredCp<1X*eO z<!#|K$@ zxAVl%^Kv>(c}9?>+nfi6b_mZ_P6)Dem-G3dH-yub6N4;$(|KsxbOny^dL*0aK{ZjE4)y7PLQQr z-LDSSUxk^YJU7VFm)+;RFY@kNBx+fUg13Fq{^Fgt$-8f{9-J3s<=uB%_`C1682M;e zqNnBuSvtmk;4o+O-m_d&o~UKz z1#f@We)g{0<(ii3!R#O_AGNoKU(@YRaA<`dS`cKP2tD!m?N4DV)fNWXr$SFXe*4$3 zRcbjw_G_V6zID5N|68rLD9G~t@2}pMxQ;bqmbE50>`V5S?i?o1KGy27#X**5A9oB3 zfA%r#>m170Lra3}*F)cW&igWtRq%h0RS+EhW&6u_4wu)dP>_$rK|0)4cF&ArOL~LEZu0oK75;;E>m6+ zWa$?Bx#7Eo*D0?Ivh*Q)!tmq5<;tsqEPcX$b@*A~^~$S*EZu5J17Gz%tee=zTH?exPbwT#c&|9xW$n%8;weleQgV2w^ z5%E*3QEh#Y{b}fD4@CR|Yf{?~WPcI*_<@K&VO!KT2H8J_{`>t1{gS*@u_DOQ(e{{# zIC*O}D^~_tI^G@|F-v%xa#fI})9g1RvV>cdHw9Tb+kPx!sql8?>L5!mv%ej&R(OZ< z<{(Sw+v6hi<8h~QO_0@($MF$$a(b6?ZIGoK?Qcftcg)?&bwO6YW4;z~SWfRzt`D;G z5&Mk@{RrEu+z@2-BW!F$hn(K0+!$o(POd~hl=dq(1zEb^emp`ylny9w39@v&^KgWI zC>>PZ8f57t=lO^f`ItGR+#F=-6z8iE3xy9WZws>YLT60GBH<&-EkTxE?tCetMEI!k z_8?2IbH+y02_IA55oGBt&I1wKgpVul46^ig=b?y$!Y7n>1zDP3kR5SG_@wggAWNTh zo{4A|KBc@T$kH9ogovBMrrgupWPcg@?Moy69qUv(8D#%G^rtsR`~$n9b}GpJBlN$o zjF>JTeqD;EgDf3ue`5sCHF*-Rd?v`!GwcUOqzPYBJ{x4|+4h(b*}~n*twEMvV81yc zPx!j>xgbj~x5ter6275)KFHD~_TwYUgnN`P1X+3=tWRQZDz^n$y54?xM3bEERlXQx z=_dR65&FY!pYo+3OYgD2I%1!k?pMAXWa)$U7f0xm*a7ACAgfPeCyZ#9)3=m6f-K$6 zgWM2~3h`dFJA*9U!>co0J}RS?uLM~-!Fg$feo9VK?h3N{Dfx-_G9L?*MJ?_YJMv}c z<V5KsHggaEM0GZcT}^y zU6Ygtf-K!)j~%sFI9d5tkfjgu>+weEH}IM2QQRz6zJXuh4@>l&mZBUTV(Cu!raVfj z@}v+;M>!9SnkMhGS;~_`ES=yyI7DkItLoA);j2)%llGBx^ zg;+Y*d2G~5IXy>tdWfZ0JKr8vBs^C+CdAUE&TFGK3eQuH4Y72k^UYDU!t<5mxc99^ z*E%nZ+A5r(9M8RPEqbf-=%{AlOywEe`_`hHotM1#d2)~?YH{=1(eK;u-!)p^QQ3Mh zf!p5d2ixfIchqS4!m~gRC5G6Ep^5K}mM07g)sna|E>9SqeZ~7emZO#&V!t2y{ypBW zutjP!L+r0YzxtuOO8)3_hHD!y+Fw?NRs9VUgTvZ1A};?ig%z zx4SfCJrm-Cf*mt@%x5F{?*Rs%8|#i87CDx4%R<(Fh1@jm)oYC%J@&Kw(V%heG54`y zk&m19xcm69$nmC)cgJI6y1C!4_3aQJUhMcWSN9%AX$kx#p8gjXof;g-P`y(aP*cdhVB<+)8w^|YuE=}b)AC2ZrOJy#EPXoiBlnDOner0uJ8aQsBLBl}6<(*D%YBC} zx|P%Cgv*tea^GQ#z7YAo+a|nTc^UT|w&=FV58O+_8JNVE3XZ)^prc^cc%*1DCcvRVvC-7$2;yc;acSa?ow>g)9!fN z*)3m&>y!(*OR@Ygw%dNhIU`)JT*O_9E&7c8TjzpsgK}|*rQ7U}9DS($|}K48BVcI-9xH9tRIce`(KpT&^-=3CZl!(V&Aem(5i z>+b7*ey;9z-{A&}A@}Wftk;LXe!u-j*s(XB6Ln_#zWU$+Pj~g(C+;`uz-W>7fBlcTi$KG<^^4o8X>~`PhhKwQiz4xuRM!q%1emm^g z+wR+b`)!VWzzrHh?)x8DZ;yO?jQvj7v3J~e{PsIs+lSn+G30*mq4m!2cOJ0c4LkO( z`>x-9mt!As1ILj2;YZfH!{2?tes8Gx=6!GId&BJa?(BB|#r>N??mz!!y?5t(57{4t zJ=zEE2Y&m5!H@RA@DCoaKMXteq5GlV{%};c`(17i8FD}RuJz%l4X-&G35T}$NYib$aJnE zBm6Ls!Ql+Kicb$y8C*qP*j3PZTt%L76;vKqu{!*Lfz>?lYPpIZaKp%u`)@z6sMTCW zVfbO7ki&&?6`vla3b~4^u&bb}xQZ&{DyS;1qBi`2fm$B8R<7dHk7cTst7r;83^Z}L zNv`74!&DPju|Mo8=>1&9e&Z^r{anS7@COEt@W4mpDn90xiXr!xA6wKB`yPJDaM-&K zILYCYauuH*rcT;p`Ng^B#|7QVRdgCxL3MH!-Qf=`zyo*7ReYZteumudeczJeZP6Qk z80h72uUy5ahpArP7IBVw6?B|40UrF(NyRzi?f9^>biDHn%-QCUd>7)G1K)mtc;{(5 z#o@oj82ot*q&P$D^l%5#@$7I1vhl^?4lKsYoX>XiZCSoO^OTD3%Rrg)ki8-7GU*Lm z{RX+rrjUHcrc9yPmUWR$-hLAi{;MpBd5r9hP>vpyCu=xf9s+}=*gA?{)1vEH8eDKF0)!^J? zH;2EqfM(uW%?{80f61*uL+&qr$oyPuol6_~1`VV2SI;`SS2ZbYOj00eIWcWaDc-HF~qA zX%3%u?;Z5%NS)?g(;9vlXytILe2jeh$W$wbuZO*g^mSMM`U9`xj*vXb=La*M-2>O% zC+%K0>?;n?>+&r`9{bae5vrHBXl-OhtR|*omI`X+S4>&%(TlJ45mV3qNG?lM0Z?zj93t ze{3L?$4>PkyWMD;`+SDnD4zaVK&tnsJtzD;Fo*MVJl;2h&jWM#nl>-@Ds94CH(F*;U>{rUO-6OpRRR;0Fh4yu0uR2EECt8vgo0 zy>~~q8+891asxq&sQ2!%w}^$@zl7Xi$Rf62En)%plcBDkzklW3(SjWdd!y3Fyq92J zi7g@dF_k}B;OA4|nD?T6GW?YWPV!2h^d2>@7dYuXhQHj+TbWzMhTMNe*%p1$`^fGH ze;A;Hhw1S6a`EYR6sp4;V@LbU_d6Z!6Xp`Ph2)1|{@{Y2et~G;qjsz>?7I~Z>lwLG{wc!rb z;)lZ?o<7XO9}a(b;4lw=!WZ^w2%PW*alQ%smAe*)-2eWoMV;`Cwap2qc1t2aXTM5#s=# zzw;m4mu-Rr!2x3*rB%)W1Ssc#a?UwRC<8({=bZC@SFf>EeSOzO)$=~DZ&&whS66q} zw5A*-vVb*^_+C*qN=<7M=`D^DS?GMhoR!EXDX}(_{?bt*i&*T4sTJ8w`b*MV9VN1u z#g6#OL%t;a73pn`5?SJGcZ{!uoAy#`E9o7M5?Si(bd0ScTS;?Mp5Nstk!7r}#7#PP z?L~N}tYVYQ7sYA5;mle)C70jrD3RsP7RT5rvQzSSr>tVXnRJTN&Q9oE(0d#uvclO! z{}x?`GjkQEoxRZep!YjUWVN%^;cFn-$A0r|P+7%akm;{D&09}d zi|=hy2OK4`#yQ}q?{N=G9eiXTROv|8ItNvncM7WDtJ#NCx|)3M98&3O2cL`&7&QX<)4ztO_Z1R{& zSCfs-F_o@%SXf&`YW}K%=5iI&H7n9}^2ZfjM>aVp6fK9P5&oh4NtJ#`HvcRAIKEl_ zlu9>~E&octfd5whv`T+VzW7)A2Nrkd>Q9BpmukNWj!HdzWS>##NWOB;sC0Bxs^N?6 zvnpLITb;8iU3`=ee^l=MRRzuJUNL=dMY?|eoTBT?*UouG%TZ}&@q&ihBqH0?CJ9bR z89uTvsB|RToeL_>s~uJF)$EHZT}^g47gf623E_u|uflgQBc1}Y>1&P> z*~98tJOC0GQgj;M5xNufbw`QpWl=4olSy1i(P?}q=+4kL93`@kwYGRmm$;Ck)A-KN zU7&9|N@PDva2Z`p;zEi}fBTqSbQY2g~fOm~fG zStDq>rK>~^IW1jdgh^aP(c8w4pzV>+tz0E?*lFb&BTeEWicaH4LXU!O?JAKYPHWc~ zWfB)rbQ(VjdNg#ot3-}E<*qT>Brc-pG=4Pn80a>x5;^9yag8x1aS=tQ@nfJrgKq08 zk>gHVmoET`izqsc{|tI8bUT*Ff!ukKP2wVoPU9y+PlE33Dv`4+r)EqtiHj&Yjh_TP8M+Irc|o6Zy12$Vek z^h)T#t`ceQ4t9-|CUFr(r|~PHS3wVPl}HD7h-<7eiHj&Yjb8=58hWU!L^`@dU1POL zTtv}n{A%d6rkNk+Dv?g^aCPxA*P0=V)Mm{Q3`$m3I=dqnl+;Vm3?5c|HXzc)||8Bd_Qx+57+EaF0nPUELRGxw7o#dreU%^k&fqUMMSDLRdx4n5P7 z{Afl9OQgFyM(v=?w0zdV%$lFMN~DMTnQLsboSp3Vj*9(8q^H{N9TurVirzMU2W{`7 zZ5DDwq?bERH6pvLfEkdiIo?$wz1{IHlOImo0+V(7vT4?BMC3zvf@@r{i1QS^ZTuD5 zz6#BPj);8ZPIQf{7IB`U)A*~<*Q|J~LZpw&Sar=JRY=jtsyOYk_+K_XDHi$Io#YzV zEmC=k-ZuU^ZQp>N>?)B@+{vzS!y+!E=rsNY^i61%mqg@KcZzG=w21Q*oyOmUz6H&? zlZf1i?}jHr}4L-n-^r$EJ%q+KX;nTbPn+y6rIL5FNj!oFq>wjN<{j*(_N!Q z0dbz9)A$z9EumS$5|IJ!4A*E`K%A%OG`=NtD`?iXL}Z{l(=}QZ5Z^)3X?!c_)&*Xg zMK2K<p@OVApN>o;!`%5U(=JYnl*vLX@l^_u;VxIH zJq4r+DSF%ZJ+!?SnyVBdBV4Xh@f=MdUZ?SUq4z;AaFxhNcY$l{D?n2ktUqD<)(c8xFhduzk$WT&8pjKWizqscKMs8YdX=k0Cb_Fz<3s^*5k;r*C!kM4uXdHlWOub|oGc(N zqUbdKB=jlhHLenw;;wOxQw79D6rIMOf<6ts)>R@?-Ls;e(0dWyUr}1Z@&q1$umBxp+a(aW^wU6c86t^tSPrpf5vjah1qicZ+LWE+8(V=rsN^^cCnY zxB^1YbHCsUSU_Av(P{h@=&R6Qas`B*?|#V@uzn_%iLXRSeKTmfS(l0n!CAYOJ`-dyPI30wDWnId$x2u+9R?;jrLR1 zq_}5G>uuwwrnw7CyXu;T$Vzoho1QkOLnGSLQJiKnA9@c@b$M#pKs z?PpIIzY$rj#_w5a;zEkPC-_EFxd2F?M;HnCG+v zjb9GE0-8}1k*#XfT#+W`IW0lsS3s|XX4FLFYc*=FOcV2*mZ0$~p;tjOY9g{tjhd^{ z#5|`ZX#6VZ)zFNZh-_D*=IS&t&uIx7zZ!ZCG@~XWJJhJTCQV#K(f{7~HPCCJ88s2v zsYcDUY2qS^PUF`?uS-jQpQ}W6x%<_?A?wnNCwA66z<6Rasp}pfZ9B_s#uK|@JR!X& z9#2>Y!e%_N^|tX-ZJq(4Ip-1CtIqjpED!-bEkWa_K~IO~oJVAzI_Iaeas>4B1dX2# zJp-C^9+Ca(oS(sx63{aeG=2v3OlZz|L=LEPekP0BL(fdm_?ghNpgHFeIjGM0S-gR2 zGpCfG@w1?3Lvzj}a!8%?vssZ8dUk@w&xW1@%~_1dVRaVIv5AW)`d<(~2YN0v=OrRX z)Ok7ACN84rG=47hJZR2KM2@QSa-L1hSe2mh^PuNLb6z5HOr4i}M?BxoQ}nj+^Pv|& zb6z5HT%DH-Y~nmcr|}D*7eaGhB632VmkVv;JVmGR3!xW5b6z5HQk|EJSoDMaUX-Bm zi=Y=nb6z5HN}ZRBZDPi%1dU$|y#$)`5|PvDyj)@vGgc*N{1WJ;(43cuoKffHQk%Gl zqVG3;DfDt%@&_4xY>~6>A$5|-a+{S(Ggr=rn#9^l)g-G(@hbGi`W=xR9dL z_~FnappWo93G`L>2;Y-ri1QSk#*cs=2~Ceh@1^L&EF?}gq6%@~VFYmYH@Uxv7l zqVEZQAM}1`jyxje9!GwEhM4F11dZPheE^y<7Lhg{W9)$paS=st8-D=$AT(nvB5gg! z*n=73B8pDq4?-V;=DrG%b{_Xthcd)P6rIK&f<6q*h>S>kj}iHBhPa5L)A+;CN1(Z{ zLZpMoebtc+G0*b}8h-@(C^X|YA{{-(@1q%Fp63%Z{wVY@XvS|uI(dxW$1=n`&nIa7 zG3evaoDGO{_Bb1kXNdC@eZTR?p-(_Fek0PwWBfjmA2H1}1A^zyi`I+r0XqUfIze-8RQ zH1}1A^!B)~I-emfqUbdKJT#+3{v^-y8B;#=PN{)IE@VRMkdrk}(={EYfW6anO@}uC zOzVhKNsT9n^zj%^jyS0!4!z28wecH&#K~Dlp&3sQ`B;r7N1fDB=%Wc5e-!!{G~)>( zpQ!QVn3Fo@RL1LV^iw0mNhfs@`ecH}pM*XI&9woM{vOwcQ%>p>`+X`w<4-}KhURQQWPmyw zPCKd7(5DkL{xtL%Xs!*24D`4*oN-cT*po8}8h-}*oFn-&^b<#9kat!cG`_73tTArZ zJjW%&&B|c!9AB2Z&K#F7wcYsIfXEPaEXVSlw_8Zj`w4!m%lF*S97{xos$)5h@4TVM zC20IO=<(3!`JNkkn0KDf+zA>#9(n@w1-|Eo9`0S>du|oyDf*t^CqPexzR367 z&?CHye9x`oJVmGR6QL)$@%%R;BR%d<`0im6G@|v`IL&heZC{E-MtPUGQ&MpyirzMU zGHp+RrdJ^{TJ@?aDlVkxG=2*7RA{bJh>THJsi`XFnIu8ur$SGIzRWWT^k?2>o=H^9 zGf9HRPlKKgeT8Qd=&{}vo=H^9Gf9HRPluiXeU)bt=yBdvo=H@kr|A2Qp8-7+`Wnw9 z(Br*pJd>z6Ptj@oOz2tA*Lfy^p5R^QnMB2vDLRdx1wEUi!~Gy46Fu$+`R-vhZ6n&z ziPJn@xRSpSi%jxvs*cRepKpEWWzAcz5}EAXa*Yo?XP{?VeY|YCxu-;?c+EYdkBW;Z z`kvtXc#-unbPG?3O!ZoL#>XlyqUbdKW9UzyTe6e{^fa%fXMCdKB8pDqKY{)fx|OFy zrhBbC<5LwEQFI#rDRf`x)~pT%J;Q758GTh;MA2z{U+8|&s1bXz!0V(oDGNOoe`ilRvyu&sEc7~i#sSYc%bpyn z*b_t+sXaNw5;nAbDA6|l5N#i>*b_t+t35f)+BVRK6EyxX^bzPTEOZ0C#OvZ2M^v1r z=zl@{5$L1PU0DGKda2jdGmfgbkfPK0qtM5oyRkG5^fIrTXB<;;o}$zEW6;N;yL(Dx zx!2t@j;omKWrD^Zhd$xOqb4FN)TnvFBgI{qr=OQ`nhPZ~XE7ox)mePfBjzqFLC0w> zlGZdU(bu73V4Xe&bKEC#Pwh_=^w zy*%TLit`k`ZTuP9K1V<4%|bx*leON5szb;*FSN$^S@RmgY&|i6jJY$+qoTun*5=6ac+<1`mX z_GAca!m%gYy&;}4%O}oL^!>)qVozp64`s19=pEir&zS8KGl!R;@w1`l`jQ{Uf^k0Y zeS5=IN0zz1Z!MvJkMNYpE^mZqEb*O{^zUV~J(5-5NbmMWdd4!JxDrL*6Z|sTUJgBq z<=~+Ac%wXHxlde)qSN^0&?}%vvrZiJUT?H#tni5oDLRc`0lkX-9>ZF3?DszJGqr=V z%4d#){T|DTX*9Cm8|xX{eP=iOy_2@bu{;{-1Kv2#*y$5jqUdeochdGQ=<%$Z27S;Q z?-{#z0|9zhg2wNH-ou_uVC^*am?#5)K#i~KwL=CX?%a^0npRAwnLxv zrgNPSh?((A(D(t+11mlyBB#`+92k(QMA6&E4}=~B%^fu&r_~+xpn$j%MW^wDpa(X7p5-ZFl%M4pLj&T< z6rIKog&xk)nawhn9G&yt9Ca9EI7eqMM`teU=F!LnZ?0$T4V+UPo&B`Ukw@gB`kU+z zh$~U_w(rS0Qpu^{OKQaUn%-8-E1) zD0Cm@l%TJBeV9`Uh`F0d(DTfp5+KwL=C+r}S*J`TN*I~eGj-a_tX z0^&l7PUDY5pMYM(9Srm>Z;@x52#5_JiR8$#kd zMW^u_pf`n*U(PC|p-5MMh3Y=CiA|1=vgS%|6C)-t{gvD%M$YVr*ZiZnS0U0}^{R>7 z^hK2@dfWJk5qEgd^eRMps9rTmr7BT$8b1koGBmvkk)EnoO;)KqMW^wTp{GF8s}Sj> zdesz_;tnrCcNP@;sg`NgYuR`QQ)vKnd6f+_T8b1wsIyAis zk&jfbnyymJh$LwIbm$q-^eRO9s9rTgrTCUMLE~pY&y3B?gag%TAMvDWBe~Yqmx>e zy((U(@tvSMLw}_fZO_YR{#Tw6uh(7`uhaO>&|RRns@2@{GS=Vf8Sz5yRq;BF?*iQw z`fIh!dtS!*UwcNp!h2P`PUE{mcZ1%h)_>2-cz>H`bW=;eSHomR>bZ_Y0YVrBJO!0SnMsKz5d{w+o<9kDY z2)#$GN}rdh{vKxK)PnR?@j8wF5c(tNy=uAoyiD`=dd5d;rTVIPoyLCzO&?G1V^%fC zk7xM%yozqmj&fXEDWHV};EZ0Jkd`8ubH#^L-$Y6`2NrXpqb@EWR8D`=bfBA0D3@z z#t(oV2+b@X!qf9%o_BKgK^blxf`4Cy)ALDr^XAglMlA!TJpoc*-%ZJE9|F~xi%h|)Ahb3tI zFzDgXOy?o8$Uos3!*lj<=-~+(KOA}lG}C#AEcQ=&#)zCf0(wM(#*cs=3C%1YB1`;J zo-s0KkAxnXpz$N2M?o{4hsaX@v}cUU*`uIGC20I8=+V&3@*%R!KjRsrbM|QH(Fqzq z8hQ-$S*G@&m-}a#5y{zOpvNR={21uZpwD?qWQBjuGd|1NpFw|?pz)tU)5p{2nIGhA zSm~eVI|0@0na8U*8xSTjI2#BSaW+h(?F-Dx(e`Tp0{3h=dm?R5Otg)kNZXU3FET3! zy~e-DtX$5X1U)H1<0nB+hQ7o-8}wTL68CI5douLo1dX2zJq7wQ_iWIg`zVg2qpSo(_GD zSvlwp{xxRha`trS=?NM?9eM`zb?(`qH~QDPXUo|$pl2j#{0!(>&^NdXgWlxd;4Um@ z&w`$npz*VyXG7m)o(+1lf0KE(oIM+Qc7n#whMog`i+eWcE&eUOZ^+qmpywoL{2b`H z(9L}%@`c~rH|FN-xzKYHG=47hJm?m_68X|^;T!XE_B`l$2^v2SdOmbZUx|F>xAcwq zIeR|z`~;1k54`}om9Ip$`mKCpLC#(Py&ys37eFtBZtW|Pul?4(u`p*ZgkG4S@e85p z~clvF8V|mVA4!t}<HnZ|@r` zbM{K;l?fWZ5_%PM2VV*Ef*pKgRnA@oy(&TDS3$3a?&vF#y?#gESe>(1L$6NI_|?#B zpgZ|WWS`&3H`e6rHPCAkG=2^ATIkNc64~!}_KmeUdoA?Z1dU${y$-sIuS5>`U3_C* z&Rz$-EMN0heplaEpR?CPuTRkU_0SujyZK7wkl)QWHstIL&>IpoegpJI z=u5)HinJ>|M~i5;T4n^ls?Bz7jd__w|k4IeRzs?gWkB z4ZR1tpRYtN`2BoiPtM*0y(dBA_dxH3?$2y3^hLkFZ|u$4d!hFxX#8I2{m=t^C349h z;2ZmM_I~L72^zm2`T+DmUx{4y2l~c=oP7ZLK!U~}fIbL4$X6m){6W5PFlQfxKA52K z2cZu^5B8PFRe!K=9Lm{;pbsTz{2}PW&_jGBa?Ky&8;5iDVd%pN8h;r22=q{2iCp)G z`o@u*eFXYQg2o?#J_`a*)n zUx2=ti_(0fj7ZyHoNrvr*%xzn;`N!zI2~G-Xq#`85os5U_l-+A`x0$mO0L$_Q3?-xSX>uLtjqN_{-2&p!r4_kq*H`-?);quRvc((D*CRSE2bv8Ig{`B;UB2 zv#&y5P0;wO(AS{(Mj4S#!DQdKmb0%xUrW&VYtYyEoA8Y?BAtUNzHvQgU*~UvXtOPG zI<)9nX}(cLq)RZ>ujp*Pb*rKeBGOg$L4xj;(pHN~`83}sBhoFH<{K?4*)1wn!Rvhx z-=Y$eN6^gVAksZxCZ}a3yJe-Sc%8<#gl+}ROb#MF0%merRkB+_w@T3XR?w}XnaM$< zXTVHO>q>TO=++4u-x|6cnwcC#dIiknlvlFLq019Az8ty@G&4Df^bVNGX;aB=1KlP; z-LFA)=nVfc&>~_%Y5;VRYbbDxKauDeg zFq6~1lHDGNU?!()CA%wh*94943f&EwnH)q01kB`gt7LbB?v|kO z-Jt2?Y2JZAWMDAeujux^n%hkCRs$k~f*F3rbZ5ruS;@-t`T`<@gIS#Od^b=jw6+vx zOm9(t3s2t*7=nH?tMrP4d(bpy!^Uaf?c0s#eZ2CSz8PFl>lFf3=8I| zMr3QDpL#(3iWs#FS7+q|&ckM^o@LMXsbxek-#6-6_3EVR6>Fz@z2bVMsrr_^z^9gx z!2;i4k&im5`Z`v>xPED>fn_iBsby5K&^H=b4eF#C=vaf|2BoQnmc7WQmeIi?-(ZQ4 zI;n;_*08u?X{wQBFZQWrOt9ED8d;6%q#Eg1qvA%TsRu24iBBz`1xtM6LF>UfsRwoJ z!Qux?Qx948QlDDJ21|Y8A?u+!sfTpzq2h;1Q;jWqnNKa_f@QwZ*lJuS)mXH=eMbxF_{QRqe0) zMAav1q?%dwDxX>=1*?3cnbqu`R5KlGR<&7;)RR_zwNEXRgEhYKm^^t$>bZEE&p9$h zZSy(jKh4zhmc7=emZ`y7-+117zBKjx9ojaZzvKD4QZHEc=RUPe3qJRa7pxabQ!nV) z3wOM5SL#2l{5qdnrU&bN<2m`yqSQi&NjT?2SIP%nCO828$k)q`s$P-^+imIQ4zY-sDru>|m2`u;@Wa>iatO z{rvZfQ$Mim%|5lv2{!u%iyoAuexPGN$p4@?^+U_v;#14qV2f}3(E4FX>W4b^!~746 zQ!n#dy*{A;m#vpeQZMV+%lVg!Q$MooFMVp6AAIQ>tc_5T`jL+PDF374)GL<# zl}{}Tg0FmowGm2Eujtq-`B#clKjt@oeQH@4Z1oM+Mkq=BSjT>x|8a5ZCzk!SPc4gr zuYKbu)=x@OKhd$DMuwft+vsh?Z+E}vSK2fKXZ=hn|lQa{(RpXYyGoceDozuTvl6~P|gcuD@dQtDT6 zcl(tiD^+*r>0BV6Sid+WK`#>erREF8=GvzpkG8jb-oisbzJr&o_Q! z{iY=K8y)*i<=<3K{g&TS_Niq}u-`X+YyGw)^;;eLZROuqPrYv02YhN-8yxVB*R9t} zQm^aS>y=-xo_fQw5Bk*dd2rA--mu;%Nxh+CZ&ZGxdg@Jnli8=1b-^Luc++~bB=x3_ zy;=Fq>Z!LZ`>;x09-@s{;gN$M>fd#mzW)l?1z4YzU6{#_z1(m85>BW528X zyXvXmTlP_(S~dnpedG7m?@Lm@*RkJM{(be-A1wQrPc55*W4`eR>klQVKj_#WD*vH+ z>W`Lv+^3e!!ExXCqxHv<)E{;1kCp#eJ@vL_pYW+=OK`$B-nQN@NxiLOZ&!Z1dg>j^ zKIv1-7r{y2c*lCDB=wGty;J#}>Z$iE`;<>DUk0aq<2~!WlGJ-T_Fm=ps;B;B=1=?7 z@>OugH-065DolM4_oELS*{b@{2duhjrv72sXMJkAIbyECZv3=fGBHM%WJ}Z9m6UKG%I*V^Eby!5i zvM=~bWJhp;yJ6wiqU+*y8s7rCCGGW0B1eK20ZYAFy`Xy~XnZf|-t0)rK#3d;S_N!U zdP|kmrxkmG$T77i1f$rKeze^>P$I{J)`3CLPfGCmIfCye)l>bU%L65HA}9}7UDoOk z-9JI&`$G?aZWAbxlR=w+^)Rgg&;t@QegO19=(d3pITf@G41$5s0~0iUAoL*Uc7YOJ z{Aw2%1cRUlC20I0=)utK10`}MXdf5^gP{i}X#8O4AaIMaxUl?7z9J1hbCzJQ0QUModP9tKIjw}1jC?*C20IG=;6?v10`}H=o}aX!=Z;K zX#8;K5zt)%C2}$760pdxH3E7>g2s=4X5F5A*FcF}3c3Y!2-fhqBQ@4cXSxSU%*#QK zz!+=FSo4n5IMO`>CFYf&SHKUh$`rFH{$97YO5ZD2gO)0t9T%swWfgsp7Z1Nl-;)|| z-s654D3NPH*MQ$)&5k!4;;&_1e6}pUleWhH zD_biy5x7sFL~aDDeSU^DJJEaypDl}Tfvw5^%GOFvGHbXW2TJ5-aE|5r%`320iL?mWBEQ`_#cYDtcO*{Votnxq=oct4TZa7uezH}j znsxAZy8~4EZfT_&;rCjnnziwf_G#kuU8!j_GB8kLwhjjc{F19oGaKM*t40thSB*?F z@0e!R$KRnf5~uG?O{bB;ffBP#I3(Z)US+!32!Eey1d+C?k?CgD=^S4~Ya~wBNzI^< zp@9;!T{tY@cVAhE=XrcBceqN|lJ?pfYNLRJn zv(39_n~&h{)^Y>fFGJ=k)TKMjnuh^NcWJFY>rtxhtG~^=U$v{ zn3`)gROcQdJwndCxn}WP^9g*hcJ9UL1}PRIQhi>nN7OT<&(AZ9=W$*mxA*xtTQ4=A z{Tml3F?)sM1Acy%g^B(f|FAkG5$PRrO3pWHvZO1%=Iy6soNY|@$LcSF$cO4LGT(e* zzWIOgFKB;}IQ>d$0b869C^0_@CkFh4tt{Y_T)=0Xq|yzgkNS)Y%;E(c8$|nzak>HN z|5BSo*wQ%l+JIe`*$U^qA6 z=W%5zG@{XQ+97?fJ5SN~%Ak-n0G66}Ej1s&-=*EJ#OZrd%S=BrKTu*04i^Ocn64}{ zpTSF6#ZT;8o1EjUSgO(<=||N;Lu80LXv@rdmYGlE@6irgoNk(0PTLCuCFam@QNT~{ z%5w8zyxw-4_DDB$7c07<3=2>5m9=^Ia+HNdmC}~-qcF|tjhu==E!h)z_0hpN_rqtROf7@m8R=g(~fHWYV~WT znW$S6P|LV*O`s;~O4AK=tU-Gf}rbpq5GD`an(8m8Kuk zv4^TXR5RU}Ij4YHCWjjWHBncZZmeUCt2M5fewaC@fLf-68w2BE>*3P$!#ehGwTEk_ zA7RcZpq8oOroec_dZaY{h>kr{?U9=4Cd@en)G{sH92iZkCZ*{nI@Y9GlbY$K%sBtZB8THPeqW=M+%OjPQ%Vc+`5dR{BvLd$ii4HPeqV=M+%O%<#*= zc+7gNR{Aj=d#u`HHPeqX=M+%OtnjPAc-(rtR{C)rd%W7?HPg&VZVjkqcDOZAbCR{v zPw3ba)t;!CW=`_!fLi8+Uk7SVvR1m8jy0>+tY-R2=9~g*nHz2kj3=!pYo(vmu_voN zSu_2VmERsv%e-($VAPeT?nswQI zEqAX<*OG` zp=mR1e>|X;mErL~P21mV*VF&(^{UmYX)_v}2&iRMcp@GR?zR6Pqk+w6a5A8l)#1r_ zG`QFPe~bopLo0tOpq4e^X>|}AR<&PGXU+uF=GyRVV7xA`-(kOz&YTOV&CkR0f$@gC z@v!|yZTAAH+OjS@MJoG7WBZM4S=<)?LZu>gul;5^b1|Sc*N2w^<4t+9j{T;(6{eOA z>Ug~wy;<9SQ@;%+cbENEI&(RoHaCV>0^==t>p}ai`#4I}{EH6`(pxp&YGl7vLpws` z>SW??M5tx6`qMt(G&D1HnXm|`WlMOKPifVyo2jc$$<(b`w@!v5a4n#gFT!i_5vZG~ zr(^YM)~l1@2wV@S<;(DTd<5!d>g!njn)T~sI082UYWXU>5g&oNnFc!6pk{+Q8IHis zfLgYOw*tO(Xn1GlVRa3lmao+(c-U!bW*Ezwht#qyY#yqytU>0HTG}<>ky?+GWf;p^ zgw(P^J zvMX#Is&Sws^Q1oK@MPsDt7o2K!Xc!V-C=oXJY_vql6gwUo~ry*^~}@EG=$W$Cu|cM zPg_ryWS-Wsrz<~QJ@X7x3?a4b4cmssGuAUDnP+tDnaa;p&pgZALP#z9!gitYto3Y3 z=2;zkw(_&pGtXK1_93b^dXWp+-7Pn>X|7WUU=Kb%x-JrfNhr^qJ@qUx{|G&)p zP0HfKX>I*y>U){L@wgsRn@7SPq478Q+ka*L)>Qo;|JGEFhAl}||J%1Rf2&>=9}{cG zKT}OIA5_cq45`gyVXu(sst;bwd?2?sPpWF>gXh(*e(<~;SNrwBLm&KC=7WcB-&Ioo zk@uQV&`Y77f{Pd)eC;+{2$YKHD!MkQp>6EqtJLY z_38u8t2MNq_iBw-Ydf!{>^>p2oDTbh#%rn99&ldMvDa$6R@?bMR{rCVTF!)@gvQV0 z|5S1QC*J1&IC55P^M9OQna(d#_NO7WoC`kXv==a(tFZ%8fY z!@i;M%hWIHJHOPiUzYyze&<(KzF$Z!7sCFb@jvpbV(0aEo3A@^QEl^e=PlEDBV`W= zspV2QAT(Hpy1w&<-q;(ZZ`|*^nX(6l)N(l-7#eS;-mLGusbg=JzIng%mX#kAQp=Ta zaL6F~R*?er(^Hcey^VMr<6TBq?ViE z@X+{E>Q4_kf6}o()&5gG=P!~U5mL*oaAat_Eq^I;{vLmVzdO=A;uHMcDHqde$&A*h zP>HmNMuioV*pK4tX`ch%QW`t0pht&Fq-8WZteC{EjlWZ)@vWr9X)P&xOsGU!MPouH zv6;Yr9N$2r@vY?%_QuM87Ald}(OA{T%jFKf5{P#ik#e=y1ijepZZthER3dGnaiKxb zP42^2*P6z6lUh!9=<%TvX&a3XnXqNP_&&T&-jm-6KKcdqDSu zo){{T_R++UiDo95@5AeD<9k9gv7Db2Dv=J+Is27QMlgmSz>F73tX=cGBIVIUIIVTAB6m_i!(u zM7l@Z474(fTA6k6McU0s^j3|On^nrqI`}GDBXPP0=|=7% zMK_WUBc8R(&HKywvm#pOiPH_8Hl~wV94awCik5^%8&let_u)mO<8+2}yeEkCQG3$H ztkQ-(L9{)I(>0v7e4M4B67%C|S!lF1rLEZnA2))?C#sRQW|g)yf@qDzY1PPs>f<2t zX$5_MTmB|(`8c=V{^Hx3jhuEoKQ9lJn0=!ap;||+o!J1dPfNsUhjbnFhef1c#FR%n z^X_(Lef-_pBu1RB?X>6PtPGWy{i9W((cYBy<`ekZsu4s6s7BhGceSVcAX+1F`d-pa z)W<<&pgKD3%?9nw$MO285vLz_FFKlZXsfo9ti~cQ7Bo z>+?Nvx|Y+CM%IQ(%puX|oRy|@G@IcYy6aTBp$v^isC02hJ`PeA53Sa%@SAJ{rxR_g z50#k1q75M{Epob;cV@PPO3abb7a_~%Nf)yzUT$wW&Q@ccKsWPcsKgu~#^n)@cnxyC&-S{&h zWfeo6)!|?1M$SM}GTTEX=4a84&>-MH<=vfeTE?ma_V2XTNB*5wgBni8sX^`E>Dvdj ze`W`<#a*F;nB$|}p+UfZ%Bw9RGC^(e-)U`&|4yqdDte;Y;=j|kZ}Hz*cTWX8De9-e z@turyA=I+W{KYL#j`nKs?Tdo`v*{sxn0=vxm{X$tp+UfZ%9mAKJgwHzXSb)-Uh}`o zRJGT)(YIYdDza|;*g`GS)P?q89wA(wM-GJ4GCevFKabRPo9NF#O=>o&<1)8$Fr=0l z(ZNv7t<-g!>R8j7P3ySKtsDxeWoC3JRC6nJ-A8ro(VCCeahY2=98$}y=y0g!R_eNs z>DXg6AFJasw{j$;mf6vfP|dB>bsyKU$7?=b$7OEiXh_Y!Ha{Awxs|%^6FT-p%_r)( z%&i;?sby|-j3*7NSzWi8jy0>prDpPt|;?j{7tZ`60C|h)%}ORCV2_b?oVyPuFpIraBc;%fjeX{7hBXeMZNg zsrgJDmuITeA+;=uPRGwwb=_xm?Ae;n)^VRR^JhY8Ssa~J50B3kx-Y7GENWSzj{J+x zPfYhE-meI$WodLSG+we^Dsf*b(k^%}6}?pKeuvj9LTXtSoez!gSl=mezoTQ{Df&*a z`(56v2&rXxbRmpiMsvTbW8W?MZn674UZ@DEWkqx`j9*4`zo%p0EBaos%gbn<XtV zT?*ru(cJIr*!PRRU+nTS+U1a1Rz;V?_+>Qr2RinHq8}8yyo`1wq?Xmul`wu8&HbT{ z{jlhV#V#+ST@9&aO>{MkUq*9Z*0Gn1UM_Zj#2iFOEo-A|Vf-?h`y(CuQPGcz-B*}{ z2&v`s=z18xjOMQr$2#`oq8}H#KQZ$+Luy$c-3pBt z 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 z