From b53c1703ea7b1c926a58798b08d5b54e0dcdbc7b Mon Sep 17 00:00:00 2001 From: MikeYu Date: Sun, 25 Nov 2018 02:24:06 +0800 Subject: [PATCH 1/3] Add wake-up time getting method. --- kernel/atomtimer.c | 37 +++++++++++++++++++++++++++++++++++++ kernel/atomtimer.h | 1 + 2 files changed, 38 insertions(+) diff --git a/kernel/atomtimer.c b/kernel/atomtimer.c index ea8208ae..9e3b7bbc 100755 --- a/kernel/atomtimer.c +++ b/kernel/atomtimer.c @@ -547,3 +547,40 @@ static void atomTimerDelayCallback (POINTER cb_data) } } + +/** + * \b atomUserTimerWakeupTimeGet + * + * Get user timers wake-up time. + * + * @return None + */ +uint32_t atomUserTimerWakeupTimeGet(void) +{ + ATOM_TIMER *next_ptr = timer_queue; + uint32_t wake_up_time = 0; + + if (tcbReadyQ && tcbReadyQ->priority != IDLE_THREAD_PRIORITY) + { + return wake_up_time; + } + + if (next_ptr != NULL) + { + wake_up_time = next_ptr->cb_ticks; + next_ptr = next_ptr->next_timer; + } + + while (next_ptr) + { + if (next_ptr->cb_ticks < wake_up_time) + { + wake_up_time = next_ptr->cb_ticks; + } + + /* Move on to the next in the list */ + next_ptr = next_ptr->next_timer; + } + + return wake_up_time; +} diff --git a/kernel/atomtimer.h b/kernel/atomtimer.h index efa3bd9b..53c92052 100755 --- a/kernel/atomtimer.h +++ b/kernel/atomtimer.h @@ -61,6 +61,7 @@ extern uint8_t atomTimerCancel (ATOM_TIMER *timer_ptr); extern uint8_t atomTimerDelay (uint32_t ticks); extern uint32_t atomTimeGet (void); extern void atomTimeSet (uint32_t new_time); +extern uint32_t atomUserTimerWakeupTimeGet(void); #ifdef __cplusplus } From 9c6df5f7fbb4037f057a403be67ceed05fd24117 Mon Sep 17 00:00:00 2001 From: MikeYu Date: Sun, 25 Nov 2018 21:14:43 +0800 Subject: [PATCH 2/3] Add extension for tick-less operation. --- kernel/atom.h | 14 +++++++ kernel/atomkernel.c | 87 ++++++++++++++++++++++++++++++++++++++++- kernel/atomtimer.c | 27 +++++++++++++ kernel/atomtimer.h | 1 + ports/stm8/atomport.c | 27 +++++++++++++ ports/stm8/tests-main.c | 15 +++++++ 6 files changed, 170 insertions(+), 1 deletion(-) diff --git a/kernel/atom.h b/kernel/atom.h index 69bef924..05a07c4d 100755 --- a/kernel/atom.h +++ b/kernel/atom.h @@ -108,6 +108,13 @@ extern uint8_t atomOSStarted; /* Idle thread priority (lowest) */ #define IDLE_THREAD_PRIORITY 255 +#ifndef EXPECTED_IDLE_TIME_BEFORE_SUSPEND + #define EXPECTED_IDLE_TIME_BEFORE_SUSPEND 2 +#endif + +#if EXPECTED_IDLE_TIME_BEFORE_SUSPEND < 2 + #error EXPECTED_IDLE_TIME_BEFORE_SUSPEND must not be less than 2 +#endif /* Function prototypes */ extern uint8_t atomOSInit (void *idle_thread_stack_bottom, uint32_t idle_thread_stack_size, uint8_t idle_thread_stack_check); @@ -133,6 +140,13 @@ extern void archThreadContextInit (ATOM_TCB *tcb_ptr, void *stack_top, void (*en extern void archFirstThreadRestore(ATOM_TCB *new_tcb_ptr); extern void atomTimerTick (void); +extern void archSystemTickTimerStop (void); +extern void archSystemTickTimerRestart (void); + +extern uint32_t atomOsSuspend(void); +extern void atomOsResume (uint32_t sleep_ticks); + +extern void userIdleHook(void); #ifdef __cplusplus } diff --git a/kernel/atomkernel.c b/kernel/atomkernel.c index e10a5ac2..69382f63 100755 --- a/kernel/atomkernel.c +++ b/kernel/atomkernel.c @@ -180,7 +180,11 @@ uint8_t atomOSStarted = FALSE; static ATOM_TCB *curr_tcb = NULL; /** Storage for the idle thread's TCB */ +#ifdef ATOM_STACK_CHECKING +ATOM_TCB idle_tcb; +#else static ATOM_TCB idle_tcb; +#endif /* Number of nested interrupts */ static int atomIntCnt = 0; @@ -768,7 +772,7 @@ static void atomIdleThread (uint32_t param) /* Loop forever */ while (1) { - /** \todo Provide user idle hooks*/ + userIdleHook(); } } @@ -1049,3 +1053,84 @@ ATOM_TCB *tcbDequeuePriority (ATOM_TCB **tcb_queue_ptr, uint8_t priority) return (ret_ptr); } + + +/** + * \b atomOsLock + * + * This is an internal function not for use by application code. + * + * Stop system timer to lock OS. + * + * @return None + */ +static void atomOsLock (void) +{ + archSystemTickTimerStop(); + atomOSStarted = FALSE; +} + + +/** + * \b atomOsUnlock + * + * This is an internal function not for use by application code. + * + * Restart system timer to unlock OS. + * + * @return None + */ +static void atomOsUnlock (void) +{ + atomOSStarted = TRUE; + archSystemTickTimerRestart(); +} + + +/** + * \b atomOsSuspend + * + * Suspend OS scheduler and return ticks count that OS can be suspended. + * + * @return Tick count that OS can be suspended + */ +uint32_t atomOsSuspend (void) +{ + uint32_t delta = 0xffff; + + atomOsLock(); + + delta = atomUserTimerWakeupTimeGet(); + + if (delta < EXPECTED_IDLE_TIME_BEFORE_SUSPEND) + { + delta = 0; + } + + return delta; +} + + +/** + * \b atomOsResume + * + * Resume OS scheduler after suspend. + * + * @param[in] sleep_ticks ticks count that OS was suspended + * + * @return None + */ +void atomOsResume (uint32_t sleep_ticks) +{ + uint32_t new_system_ticks, old_system_ticks; + + old_system_ticks = atomTimeGet(); + + new_system_ticks = sleep_ticks + old_system_ticks; + + atomUserTimerUpdate(sleep_ticks); + atomTimeSet(new_system_ticks); + + atomOsUnlock(); +} + diff --git a/kernel/atomtimer.c b/kernel/atomtimer.c index 9e3b7bbc..300861ae 100755 --- a/kernel/atomtimer.c +++ b/kernel/atomtimer.c @@ -584,3 +584,30 @@ uint32_t atomUserTimerWakeupTimeGet(void) return wake_up_time; } + + +/** + * \b atomUserTimerUpdate + * + * This is an internal function not for use by application code. + * + * Update user timers on resume. + * + * @param[in] tick count value + * + * @return None + */ +void atomUserTimerUpdate (uint32_t sleep_time) +{ + ATOM_TIMER *next_ptr; + + next_ptr = timer_queue; + while (next_ptr) + { + next_ptr->cb_ticks -= sleep_time; + + /* Move on to the next in the list */ + next_ptr = next_ptr->next_timer; + } +} + diff --git a/kernel/atomtimer.h b/kernel/atomtimer.h index 53c92052..0de8b9f9 100755 --- a/kernel/atomtimer.h +++ b/kernel/atomtimer.h @@ -62,6 +62,7 @@ extern uint8_t atomTimerDelay (uint32_t ticks); extern uint32_t atomTimeGet (void); extern void atomTimeSet (uint32_t new_time); extern uint32_t atomUserTimerWakeupTimeGet(void); +extern void atomUserTimerUpdate (uint32_t sleep_time); #ifdef __cplusplus } diff --git a/ports/stm8/atomport.c b/ports/stm8/atomport.c index 7dc27bfc..1ff40ac3 100644 --- a/ports/stm8/atomport.c +++ b/ports/stm8/atomport.c @@ -313,3 +313,30 @@ __interrupt(11) atomIntExit(TRUE); } + +/** + * \b archSystemTickTimerStop + * + * Stop the system tick timer. + * + * @return None + */ +void archSystemTickTimerStop(void) +{ + /* Disable TIM1 */ + TIM1_Cmd(DISABLE); +} + + +/** + * \b archSystemTickTimerRestart + * + * Restart the system tick timer. + * + * @return None + */ +void archSystemTickTimerRestart(void) +{ + /* Enable TIM1 */ + TIM1_Cmd(ENABLE); +} diff --git a/ports/stm8/tests-main.c b/ports/stm8/tests-main.c index 57b714c4..ab5f32b1 100644 --- a/ports/stm8/tests-main.c +++ b/ports/stm8/tests-main.c @@ -175,6 +175,21 @@ NO_REG_SAVE void main ( void ) } +/** + * \b userIdleHook + * + * This function will be called in a endless loop by entry point of idle thread. + * + * It must not call any library routines which would cause it to block. + * + *@return None + */ +void userIdleHook(void) +{ + +} + + /** * \b main_thread_func * From b019fcfbcd9bf0f57c0e17f6e9e8405a16d579ab Mon Sep 17 00:00:00 2001 From: MikeYu Date: Tue, 1 Jan 2019 01:27:35 +0800 Subject: [PATCH 3/3] signal implementation. --- kernel/atom.h | 2 + kernel/atomkernel.c | 2 + kernel/atomsignal.c | 339 ++ kernel/atomsignal.h | 55 + .../STM8L15x_StdPeriph_Driver/inc/stm8l15x.h | 3027 +++++++++++++++++ .../inc/stm8l15x_adc.h | 386 +++ .../inc/stm8l15x_aes.h | 158 + .../inc/stm8l15x_beep.h | 117 + .../inc/stm8l15x_clk.h | 444 +++ .../inc/stm8l15x_comp.h | 242 ++ .../inc/stm8l15x_dac.h | 293 ++ .../inc/stm8l15x_dma.h | 341 ++ .../inc/stm8l15x_exti.h | 288 ++ .../inc/stm8l15x_flash.h | 359 ++ .../inc/stm8l15x_gpio.h | 179 + .../inc/stm8l15x_i2c.h | 809 +++++ .../inc/stm8l15x_irtim.h | 68 + .../inc/stm8l15x_itc.h | 272 ++ .../inc/stm8l15x_iwdg.h | 140 + .../inc/stm8l15x_lcd.h | 473 +++ .../inc/stm8l15x_pwr.h | 131 + .../inc/stm8l15x_rst.h | 91 + .../inc/stm8l15x_rtc.h | 956 ++++++ .../inc/stm8l15x_spi.h | 404 +++ .../inc/stm8l15x_syscfg.h | 424 +++ .../inc/stm8l15x_tim1.h | 1044 ++++++ .../inc/stm8l15x_tim2.h | 905 +++++ .../inc/stm8l15x_tim3.h | 909 +++++ .../inc/stm8l15x_tim4.h | 374 ++ .../inc/stm8l15x_tim5.h | 771 +++++ .../inc/stm8l15x_usart.h | 393 +++ .../inc/stm8l15x_wfe.h | 154 + .../inc/stm8l15x_wwdg.h | 96 + .../src/stm8l15x_adc.c | 988 ++++++ .../src/stm8l15x_aes.c | 488 +++ .../src/stm8l15x_beep.c | 247 ++ .../src/stm8l15x_clk.c | 1123 ++++++ .../src/stm8l15x_comp.c | 728 ++++ .../src/stm8l15x_dac.c | 839 +++++ .../src/stm8l15x_dma.c | 753 ++++ .../src/stm8l15x_exti.c | 559 +++ .../src/stm8l15x_flash.c | 929 +++++ .../src/stm8l15x_gpio.c | 410 +++ .../src/stm8l15x_i2c.c | 1369 ++++++++ .../src/stm8l15x_irtim.c | 199 ++ .../src/stm8l15x_itc.c | 393 +++ .../src/stm8l15x_iwdg.c | 220 ++ .../src/stm8l15x_lcd.c | 632 ++++ .../src/stm8l15x_pwr.c | 358 ++ .../src/stm8l15x_rst.c | 171 + .../src/stm8l15x_rtc.c | 2245 ++++++++++++ .../src/stm8l15x_spi.c | 794 +++++ .../src/stm8l15x_syscfg.c | 507 +++ .../src/stm8l15x_tim1.c | 2774 +++++++++++++++ .../src/stm8l15x_tim2.c | 2154 ++++++++++++ .../src/stm8l15x_tim3.c | 2154 ++++++++++++ .../src/stm8l15x_tim4.c | 762 +++++ .../src/stm8l15x_tim5.c | 2154 ++++++++++++ .../src/stm8l15x_usart.c | 1208 +++++++ .../src/stm8l15x_wfe.c | 348 ++ .../src/stm8l15x_wwdg.c | 247 ++ ports/stm8l/atomport-asm-cosmic.s | 364 ++ ports/stm8l/atomport-private.h | 50 + ports/stm8l/atomport-tests.h | 64 + ports/stm8l/atomport.c | 350 ++ ports/stm8l/atomport.h | 107 + ports/stm8l/atomthreads-cosmic.pdb | 39 + ports/stm8l/atomthreads-cosmic.stp | 850 +++++ ports/stm8l/atomthreads-sample-stvd.stw | 8 + ports/stm8l/atomthreads-sample-stvd.wdb | 1379 ++++++++ ports/stm8l/checkres.spy | 9 + ports/stm8l/stm8_interrupt_vector.c | 49 + ports/stm8l/stm8l15x_conf.h | 91 + ports/stm8l/stm8l15x_it.c | 418 +++ ports/stm8l/stm8l15x_it.h | 79 + ports/stm8l/tests-main.c | 277 ++ ports/stm8l/uart.c | 73 + ports/stm8l/uart.h | 9 + tests/signal1.c | 152 + tests/signal2.c | 157 + tests/signal3.c | 154 + tests/signal4.c | 191 ++ 82 files changed, 45269 insertions(+) create mode 100644 kernel/atomsignal.c create mode 100644 kernel/atomsignal.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_adc.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_aes.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_beep.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_clk.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_comp.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_dac.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_dma.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_exti.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_flash.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_gpio.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_i2c.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_irtim.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_itc.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_iwdg.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_lcd.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_pwr.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_rst.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_rtc.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_spi.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_syscfg.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_tim1.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_tim2.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_tim3.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_tim4.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_tim5.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_usart.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_wfe.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_wwdg.h create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_adc.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_aes.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_beep.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_clk.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_comp.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_dac.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_dma.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_exti.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_flash.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_gpio.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_i2c.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_irtim.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_itc.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_iwdg.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_lcd.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_pwr.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_rst.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_rtc.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_spi.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_syscfg.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_tim1.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_tim2.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_tim3.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_tim4.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_tim5.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_usart.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_wfe.c create mode 100644 ports/stm8l/STM8L15x_StdPeriph_Driver/src/stm8l15x_wwdg.c create mode 100644 ports/stm8l/atomport-asm-cosmic.s create mode 100644 ports/stm8l/atomport-private.h create mode 100644 ports/stm8l/atomport-tests.h create mode 100644 ports/stm8l/atomport.c create mode 100644 ports/stm8l/atomport.h create mode 100644 ports/stm8l/atomthreads-cosmic.pdb create mode 100644 ports/stm8l/atomthreads-cosmic.stp create mode 100644 ports/stm8l/atomthreads-sample-stvd.stw create mode 100644 ports/stm8l/atomthreads-sample-stvd.wdb create mode 100644 ports/stm8l/checkres.spy create mode 100644 ports/stm8l/stm8_interrupt_vector.c create mode 100644 ports/stm8l/stm8l15x_conf.h create mode 100644 ports/stm8l/stm8l15x_it.c create mode 100644 ports/stm8l/stm8l15x_it.h create mode 100644 ports/stm8l/tests-main.c create mode 100644 ports/stm8l/uart.c create mode 100644 ports/stm8l/uart.h create mode 100644 tests/signal1.c create mode 100644 tests/signal2.c create mode 100644 tests/signal3.c create mode 100644 tests/signal4.c diff --git a/kernel/atom.h b/kernel/atom.h index 05a07c4d..c9c3f449 100755 --- a/kernel/atom.h +++ b/kernel/atom.h @@ -72,6 +72,8 @@ typedef struct atom_tcb ATOM_TIMER *suspend_timo_cb; /* Callback registered for suspension timeouts */ uint8_t terminated; /* TRUE if task is being terminated (run to completion) */ + uint16_t events; /* Evend flags */ + uint16_t waits; /* Wait flags */ /* Details used if thread stack-checking is required */ #ifdef ATOM_STACK_CHECKING POINTER stack_bottom; /* Pointer to bottom of stack allocation */ diff --git a/kernel/atomkernel.c b/kernel/atomkernel.c index 69382f63..84106a27 100755 --- a/kernel/atomkernel.c +++ b/kernel/atomkernel.c @@ -413,6 +413,8 @@ uint8_t atomThreadCreate (ATOM_TCB *tcb_ptr, uint8_t priority, void (*entry_poin tcb_ptr->prev_tcb = NULL; tcb_ptr->next_tcb = NULL; tcb_ptr->suspend_timo_cb = NULL; + tcb_ptr->events = 0; + tcb_ptr->waits = 0; /** * Store the thread entry point and parameter in the TCB. This may diff --git a/kernel/atomsignal.c b/kernel/atomsignal.c new file mode 100644 index 00000000..0135f866 --- /dev/null +++ b/kernel/atomsignal.c @@ -0,0 +1,339 @@ +/* + * Copyright (c) 2018, Mike Yu. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. No personal names or organizations' names associated with the + * Atomthreads project may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE ATOMTHREADS PROJECT AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "atomsignal.h" + +/* Forward declarations */ + +static void atomSignalTimerCallback(POINTER cb_date); + +/** + * \b atomSignalWait + * + * Wait for one or more Signal Flags to become signaled for the current \b RUNNING thread. + * + * @param[in] signals wait until all specified signal flags set or 0 for any single signal flag + * @param[in] timeout Max system ticks to block (0 = forever / -1 = non-blocking) + * + * @retval ATOM_SIGNAL + */ +ATOM_SIGNAL atomSignalWait(uint16_t signals, int32_t timeout) +{ + ATOM_SIGNAL ret; + ATOM_TCB *curr_tcb_ptr; + ATOM_TIMER timer_cb; + CRITICAL_STORE; + + /* Get the current TCB */ + curr_tcb_ptr = atomCurrentContext(); + if (curr_tcb_ptr == NULL) + { + ret.status = ATOM_ERR_CONTEXT; + return ret; + } + + if (signals & (0xFFFF << atomFeature_Signals)) + { + ret.status = ATOM_ERR_PARAM; + return ret; + } + else + { + CRITICAL_START (); + + if (signals != 0) + { + if ((curr_tcb_ptr->events & signals) == signals) + { + curr_tcb_ptr->events &= ~signals; + CRITICAL_END (); + ret.status = ATOM_OK; + ret.value = signals; + return ret; + } + curr_tcb_ptr->waits = signals; + } + else + { + if (curr_tcb_ptr->events) + { + ret.value = curr_tcb_ptr->events; + curr_tcb_ptr->events = 0; + CRITICAL_END (); + ret.status = ATOM_OK; + return ret; + } + curr_tcb_ptr->waits = 0xFFFF; + } + + if (timeout < 0) + { + CRITICAL_END (); + ret.status = ATOM_TIMEOUT; + return ret; + } + else + { + /* Suspend ourselves */ + curr_tcb_ptr->suspended = TRUE; + curr_tcb_ptr->suspend_wake_status = ATOM_OK; + if (timeout) + { + /* Fill out the timer callback request structure */ + timer_cb.cb_func = atomSignalTimerCallback; + timer_cb.cb_data = (POINTER)curr_tcb_ptr; + timer_cb.cb_ticks = timeout; + + /** + * Store the timer details in the TCB so that we can + * cancel the timer callback if a event is signalled + * before the timeout occurs. + */ + curr_tcb_ptr->suspend_timo_cb = &timer_cb; + + /* Register a callback on timeout */ + if (atomTimerRegister (&timer_cb) != ATOM_OK) + { + /* Timer registration failed */ + ret.status = ATOM_ERR_TIMER; + + /* Clean up and return to the caller */ + curr_tcb_ptr->suspended = FALSE; + curr_tcb_ptr->suspend_timo_cb = NULL; + } + else + { + ret.status = ATOM_OK; + } + } + else + { + /* No need to cancel timeouts on this one */ + curr_tcb_ptr->suspend_timo_cb = NULL; + ret.status = ATOM_OK; + } + /** + * Only call the scheduler if we are in thread context, + * otherwise it will be called on exiting the ISR by + * atomIntExit(). + */ + CRITICAL_END (); + if ((ret.status == ATOM_OK)) + { + atomSched (FALSE); + /* Restore returned events, clears event memory and update + status after context switch */ + ret.status = curr_tcb_ptr->suspend_wake_status; + if (ret.status == ATOM_OK) + { + if (signals != 0) + { + curr_tcb_ptr->events &= ~signals; + ret.value = signals; + } + else + { + ret.value = curr_tcb_ptr->events; + curr_tcb_ptr->events = 0; + } + } + } + } + } + return ret; +} + +/** + * \b atomSignalSet + * + * Set the specified Signal Flags of an active thread. + * + * Set the specified Signal Flags to a thread given by the TCB pointer waiting in + * an atomSignalWait() with the same bits set in the Event Flags. + * If the thread is not waiting, then the signals signalled will be stored + * in the event register of the TCB until the atomSignalWait() is called. + * + * @param[in] curr_tcb_ptr Pointer to TCB which is to be signalled + * @param[in] signals signal flags + * + * @retval ATOM_OK Success + * @retval ATOM_ERR_PARAM Bad parameter + * @retval ATOM_ERR_QUEUE Problem putting the thread back on the ready queue + */ +uint8_t atomSignalSet (ATOM_TCB *curr_tcb_ptr, uint16_t signals) +{ + uint8_t status; + CRITICAL_STORE; + + /* Check parameters */ + if (curr_tcb_ptr == NULL) + { + /* Bad TCB pointer */ + return ATOM_ERR_PARAM; + } + + if (signals & (0xFFFF << atomFeature_Signals)) + { + return ATOM_ERR_PARAM; + } + + /* Protect access to the tcb object and OS queues */ + CRITICAL_START (); + + if (curr_tcb_ptr->suspended) + { + if (curr_tcb_ptr->waits & signals) + { + curr_tcb_ptr->events = curr_tcb_ptr->events | signals; + /* Put this thread on the ready queue */ + if (tcbEnqueuePriority (&tcbReadyQ, curr_tcb_ptr) != ATOM_OK) + { + /* Queue-related error */ + status = ATOM_ERR_QUEUE; + } + else + { + curr_tcb_ptr->suspended = FALSE; + status = curr_tcb_ptr->suspend_wake_status; /* FIX Check this */ + + /* If there's a timeout on this suspension, cancel it */ + if (curr_tcb_ptr->suspend_timo_cb) + { + /* Cancel the callback */ + if (atomTimerCancel (curr_tcb_ptr->suspend_timo_cb) != ATOM_OK) + { + /* Return timer error */ + status = ATOM_ERR_TIMER; + } + /* Flag has no timeout registered */ + curr_tcb_ptr->suspend_timo_cb = NULL; + } + } + } + else + { + /* No requested bits signalled which probably should be + considered an error in parameters. */ + status = ATOM_ERR_PARAM; + } + /* Exit critical region */ + CRITICAL_END (); + if (status == ATOM_OK) + { + if (atomCurrentContext()) + { + atomSched(FALSE); + } + } + } + else + { + /* TCB is not waiting for events*/ + curr_tcb_ptr->events |= signals; + /* Exit critical region */ + CRITICAL_END (); + status = ATOM_OK; + } + return status; +} + +/** + * \b atomSignalTimerCallback + * + * Clear the specified event flags of an active thread. + * + * @param[in] curr_tcb_ptr Pointer to TCB whose event flags is to be cleared. + * @param[in] signals event flags to be cleared + * + * @retval ATOM_OK Success + * @retval ATOM_ERR_PARAM Bad parameter + */ +uint8_t atomSignalClear(ATOM_TCB *curr_tcb_ptr, uint16_t signals) +{ + if (curr_tcb_ptr == NULL) + { + /* Bad TCB pointer */ + return ATOM_ERR_PARAM; + } + + if (signals & (0xFFFF << atomFeature_Signals)) + { + return ATOM_ERR_PARAM; + } + + curr_tcb_ptr->events &= (uint8_t)~signals; + + return ATOM_OK; +} + +/** + * \b atomSignalTimerCallback + * + * This is an internal function not for use by application code. + * + * Timeouts on suspended threads are notified by the timer system through + * this generic callback. The timer system calls us back with a pointer to + * the relevant \c ATOM_TCB object which is used to retrieve the + * event details. + * + * @param[in] cb_data Pointer to a ATOM_TCB object + */ +static void atomSignalTimerCallback (POINTER cb_data) +{ + ATOM_TCB *curr_tcb_ptr; + CRITICAL_STORE; + + /* Get the pointer */ + curr_tcb_ptr = (ATOM_TCB *)cb_data; + + /* Check parameter is valid */ + if (curr_tcb_ptr) + { + /* Enter critical region */ + CRITICAL_START (); + + /* Set status to indicate to the waiting thread that it timed out */ + curr_tcb_ptr->suspend_wake_status = ATOM_TIMEOUT; + + /* Flag as no timeout registered */ + curr_tcb_ptr->suspend_timo_cb = NULL; + + /* Put the thread on the ready queue */ + (void)tcbEnqueuePriority (&tcbReadyQ, curr_tcb_ptr); + + /* Exit critical region */ + CRITICAL_END (); + + /** + * Note that we don't call the scheduler now as it will be called + * when we exit the ISR by atomIntExit(). + */ + } +} + diff --git a/kernel/atomsignal.h b/kernel/atomsignal.h new file mode 100644 index 00000000..cdd8817c --- /dev/null +++ b/kernel/atomsignal.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2018, Mike Yu. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. No personal names or organizations' names associated with the + * Atomthreads project may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE ATOMTHREADS PROJECT AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __ATOM_SIGNAL_H +#define __ATOM_SIGNAL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "atom.h" + +#define atomFeature_Signals 12 ///< 12 Signal Flags available per thread + +typedef struct atom_signal +{ + uint8_t status; + uint16_t value; +} ATOM_SIGNAL; + +extern ATOM_SIGNAL atomSignalWait(uint16_t signals, int32_t timeout); +extern uint8_t atomSignalSet(ATOM_TCB *tcb, uint16_t signals); +extern uint8_t atomSignalClear(ATOM_TCB *tcb, uint16_t signals); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x.h b/ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x.h new file mode 100644 index 00000000..1ab07219 --- /dev/null +++ b/ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x.h @@ -0,0 +1,3027 @@ +/** + ****************************************************************************** + * @file stm8l15x.h + * @author MCD Application Team + * @version V1.6.1 + * @date 30-September-2014 + * @brief This file contains all the peripheral register's definitions, bits + * definitions and memory mapping for STM8L15x devices. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8L15x_H + #define __STM8L15x_H + +/** @addtogroup STM8L15x_StdPeriph_Driver + * @{ + */ +/* Uncomment the line below according to the target STM8L15x device used in your + application + */ +/* #define STM8L15X_LD */ /*!< STM8L15X_LD: STM8L15x Low density devices */ +/* #define STM8L15X_MD */ /*!< STM8L15X_MD: STM8L15x Medium density devices */ +/* #define STM8L15X_MDP */ /*!< STM8L15X_MDP: STM8L15x Medium density plus devices */ +/* #define STM8L15X_HD */ /*!< STM8L15X_HD: STM8L15x/16x High density devices */ +#define STM8L05X_LD_VL /*!< STM8L05X_LD_VL: STM8L051xx3 Low density value line devices */ +/* #define STM8L05X_MD_VL */ /*!< STM8L05X_MD_VL: STM8L052xx6 Medium density value line devices */ +/* #define STM8L05X_HD_VL */ /*!< STM8L05X_HD_VL: STM8L052xx8 High density value line devices */ +/* #define STM8AL31_L_MD */ /*!< STM8AL31_L_MD: STM8AL3x Medium 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. + + - Low density STM8L15x devices are STM8L151C3, STM8L151K3, STM8L151G3, STM8L151F3, + STM8L151C2, STM8L151K2, STM8L151G2 and STM8L151F2 microcontrollers where the + Flash memory density ranges between 4 and 8 Kbytes. + - Medium density STM8L15x devices are STM8L151C4, STM8L151C6, STM8L152C4, + STM8L152C6, STM8L151K4, STM8L151K6, STM8L152K4, STM8L152K6, STM8L151G4, + STM8L151G6, STM8L152G4 and STM8L152G6 microcontrollers where the Flash memory + density ranges between 16 and 32 Kbytes. + - Medium density Plus devices are STM8L151R6, STM8L152R6 microcontrollers where + the Flash memory density is fixed and equal to 32 Kbytes and a wider range of + peripheral than the medium density devices. + - High density STM8L15x devices are STM8L151x8, STM8L152x8, STM8L162R8 and STM8L162M8 + microcontrollers where the Flash memory density is fixed and equal to 64 Kbytes with + the same peripheral set than Medium Density Plus devices. + - Value line low density STM8L05xx devices are STM8L051x3 microcontrollers + with 8-KB Flash + - Value line medium density STM8L05xx devices are STM8L052x6 microcontrollers + with 32-KB Flash + - Value line high density STM8L05xx devices: STM8L052x8 microcontrollers + with 64-KB Flash + - Medium density STM8AL31xx/STM8AL3Lxx devices: STM8AL3168, STM8AL3166, + STM8AL3148,STM8AL3146, STM8AL3138, STM8AL3136, STM8AL3L68, STM8AL3L66, + STM8AL3L48, STM8AL3L46 microcontrollers with 8-KB, 16-KB or 32-KB Flash + */ + +#if !defined (STM8L15X_MD) && !defined (STM8L15X_MDP) && !defined (STM8L15X_HD) && !defined (STM8L15X_LD) \ +&& !defined (STM8L05X_LD_VL) && !defined (STM8L05X_MD_VL) && !defined (STM8L05X_HD_VL) && !defined (STM8AL31_L_MD) + #error "Please select first the target STM8L device used in your application (in stm8l15x.h file)" +#endif + +/******************************************************************************/ +/* Library configuration section */ +/******************************************************************************/ +/* Check the used compiler */ +#if defined(__CSMC__) + #define _COSMIC_ +#elif defined(__RCSTM8__) + #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 + #define HSE_VALUE ((uint32_t)16000000) /*!< Typical Value of the HSE in Hz */ +#endif /* HSE_VALUE */ + +/** + * @brief Definition of External Low Speed oscillator (LSE) frequency + */ +#if !defined LSE_VALUE + #define LSE_VALUE ((uint32_t)32768) /*!< Typical Value of the LSE in Hz */ +#endif /* LSE_VALUE */ +/** + * @brief Definition of Device on-chip RC oscillator frequencies + */ +#if !defined HSI_VALUE + #define HSI_VALUE ((uint32_t)16000000) /*!< Typical Value of the HSI in Hz */ +#endif /* HSI_VALUE */ + +#if !defined LSI_VALUE + #define LSI_VALUE ((uint32_t)38000) /*!< Typical Value of the LSI in Hz */ +#endif /* LSI_VALUE */ + +#ifdef _COSMIC_ + #define FAR @far + #define NEAR @near + #define TINY @tiny + #define EEPROM @eeprom + #define CONST const +#elif defined (_RAISONANCE_) /* __RCSTM8__ */ + #define FAR far + #define NEAR data + #define TINY page0 + #define EEPROM eeprom + #define CONST code + #if defined (STM8L15X_MD) || defined (STM8L15X_MDP) || defined (STM8L05X_MD_VL) || \ + defined (STM8AL31_L_MD) + /*!< Used with memory Models for code less than 64K */ + #define MEMCPY memcpy + #elif defined (STM8L15X_HD) || defined (STM8L05X_HD_VL) + /*!< Used with memory Models for code higher than 64K */ + #define MEMCPY fmemcpy + #endif /* STM8L15X_MD or STM8L15X_MDP or STM8L05X_MD_VL or STM8AL31_L_MD*/ +#else /*_IAR_*/ + #define FAR __far + #define NEAR __near + #define TINY __tiny + #define EEPROM __eeprom + #define CONST const +#endif /* __CSMC__ */ + +/** + * @brief Legacy definition + */ +#define __CONST CONST + +#if defined (STM8L15X_MD) || defined (STM8L15X_MDP) || defined (STM8L15X_LD) || \ +defined (STM8L05X_LD_VL) || defined (STM8L05X_MD_VL) || defined (STM8AL31_L_MD) +/*!< Used with memory Models for code smaller than 64K */ + #define PointerAttr NEAR + #define MemoryAddressCast uint16_t +#elif defined (STM8L15X_HD) || defined (STM8L05X_HD_VL) +/*!< Used with memory Models for code higher than 64K */ + #define PointerAttr FAR + #define MemoryAddressCast uint32_t +#endif /* STM8L15X_MD or STM8L15X_MDP or STM8L15X_LD or STM8L05X_LD_VL or STM8L05X_MD_VL + or STM8AL31_L_MD */ + +/* 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_) /* __RCSTM8__ */ + #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] STM8L15X Standard Peripheral Library main version */ +#define __STM8L15X_STDPERIPH_VERSION_MAIN ((uint8_t)0x01) /*!< [31:24] main version */ +#define __STM8L15X_STDPERIPH_VERSION_SUB1 ((uint8_t)0x06) /*!< [23:16] sub1 version */ +#define __STM8L15X_STDPERIPH_VERSION_SUB2 ((uint8_t)0x01) /*!< [15:8] sub2 version */ +#define __STM8L15X_STDPERIPH_VERSION_RC ((uint8_t)0x00) /*!< [7:0] release candidate */ +#define __STM8L15X_STDPERIPH_VERSION ( (__STM8L15X_STDPERIPH_VERSION_MAIN << 24)\ + |(__STM8L15X_STDPERIPH_VERSION_SUB1 << 16)\ + |(__STM8L15X_STDPERIPH_VERSION_SUB2 << 8)\ + |(__STM8L15X_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; + +/*!< STM8Lx 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_FUNCTIONAL_STATE(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) +/** + * @} + */ +/*----------------------------------------------------------------------------*/ + +/** + * @brief Real-Time Clock (RTC) peripheral registers. + */ +typedef struct RTC_struct +{ + __IO uint8_t TR1; /*!< Time Register 1*/ + __IO uint8_t TR2; /*!< Time Register 2*/ + __IO uint8_t TR3; /*!< Time Register 3*/ + + uint8_t RESERVED0; + + __IO uint8_t DR1; /*!< Date Register 1*/ + __IO uint8_t DR2; /*!< Date Register 2*/ + __IO uint8_t DR3; /*!< Date Register 3*/ + + uint8_t RESERVED1; + + __IO uint8_t CR1; /*!< Control Register 1*/ + __IO uint8_t CR2; /*!< Control Register 2*/ + __IO uint8_t CR3; /*!< Control Register 3*/ + + uint8_t RESERVED2; + + __IO uint8_t ISR1; /*!< Initialisation and Status Register 1 */ + __IO uint8_t ISR2; /*!< Initialisation and Status Register 2 */ + + uint8_t RESERVED3; + uint8_t RESERVED4; + + __IO uint8_t SPRERH; /*!< Synchronous Prediv high Register */ + __IO uint8_t SPRERL; /*!< Synchronous Prediv Low Register */ + __IO uint8_t APRER; /*!< Asynchronous Prediv Register */ + + uint8_t RESERVED5; + + __IO uint8_t WUTRH; /*!< Wake-Up Timer High Register */ + __IO uint8_t WUTRL; /*!< Wake-Up Timer Low Register */ + + uint8_t RESERVED6; + + __IO uint8_t SSRH; /*!< Sub Second High Register */ + __IO uint8_t SSRL; /*!< Sub Second Low Register */ + + __IO uint8_t WPR; /*!< Write Protection Register */ + + __IO uint8_t SHIFTRH; /*!< Shift control High Register */ + __IO uint8_t SHIFTRL; /*!< Shift control Low Register */ + + __IO uint8_t ALRMAR1; /*!< ALARM A Register 1 */ + __IO uint8_t ALRMAR2; /*!< ALARM A Register 2 */ + __IO uint8_t ALRMAR3; /*!< ALARM A Register 3 */ + __IO uint8_t ALRMAR4; /*!< ALARM A Register 4 */ + + uint8_t RESERVED7[4]; + + __IO uint8_t ALRMASSRH; /*!< ALARM A Subsecond Register High */ + __IO uint8_t ALRMASSRL; /*!< ALARM A Subsecond Register Low */ + __IO uint8_t ALRMASSMSKR; /*!< ALARM A Subsecond Mask Register */ + + uint8_t RESERVED8[3]; + + __IO uint8_t CALRH; /*!< Calibration register high */ + __IO uint8_t CALRL; /*!< Calibration register low */ + + __IO uint8_t TCR1; /*!< Tamper control register 1 */ + __IO uint8_t TCR2; /*!< Tamper control register 2 */ +} +RTC_TypeDef; + +/** @addtogroup RTC_Registers_Reset_Value + * @{ + */ +#define RTC_TR1_RESET_VALUE ((uint8_t)0x00) +#define RTC_TR2_RESET_VALUE ((uint8_t)0x00) +#define RTC_TR3_RESET_VALUE ((uint8_t)0x00) + +#define RTC_DR1_RESET_VALUE ((uint8_t)0x01) +#define RTC_DR2_RESET_VALUE ((uint8_t)0x21) +#define RTC_DR3_RESET_VALUE ((uint8_t)0x00) + +#define RTC_CR1_RESET_VALUE ((uint8_t)0x00) +#define RTC_CR2_RESET_VALUE ((uint8_t)0x00) +#define RTC_CR3_RESET_VALUE ((uint8_t)0x00) + +#define RTC_ISR1_RESET_VALUE ((uint8_t)0x07) +#define RTC_ISR2_RESET_VALUE ((uint8_t)0x00) + +#define RTC_SPRERH_RESET_VALUE ((uint8_t)0x00) +#define RTC_SPRERL_RESET_VALUE ((uint8_t)0xFF) +#define RTC_APRER_RESET_VALUE ((uint8_t)0x7F) + +#define RTC_WUTRH_RESET_VALUE ((uint8_t)0xFF) +#define RTC_WUTRL_RESET_VALUE ((uint8_t)0xFF) + +#define RTC_WPR_RESET_VALUE ((uint8_t)0x00) + +#define RTC_ALRMAR1_RESET_VALUE ((uint8_t)0x00) +#define RTC_ALRMAR2_RESET_VALUE ((uint8_t)0x00) +#define RTC_ALRMAR3_RESET_VALUE ((uint8_t)0x00) +#define RTC_ALRMAR4_RESET_VALUE ((uint8_t)0x00) + +#define RTC_SHIFTRH_RESET_VALUE ((uint8_t)0x00) +#define RTC_SHIFTRL_RESET_VALUE ((uint8_t)0x00) + +#define RTC_ALRMASSRH_RESET_VALUE ((uint8_t)0x00) +#define RTC_ALRMASSRL_RESET_VALUE ((uint8_t)0x00) +#define RTC_ALRMASSMSKR_RESET_VALUE ((uint8_t)0x00) + +#define RTC_CALRH_RESET_VALUE ((uint8_t)0x00) +#define RTC_CALRL_RESET_VALUE ((uint8_t)0x00) + +#define RTC_TCR1_RESET_VALUE ((uint8_t)0x00) +#define RTC_TCR2_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup RTC_Registers_Bits_Definition + * @{ + */ + +/* Bits definition for RTC_TR1 register*/ +#define RTC_TR1_ST ((uint8_t)0x70) +#define RTC_TR1_SU ((uint8_t)0x0F) + +/* Bits definition for RTC_TR2 register*/ +#define RTC_TR2_MNT ((uint8_t)0x70) +#define RTC_TR2_MNU ((uint8_t)0x0F) + +/* Bits definition for RTC_TR3 register*/ +#define RTC_TR3_PM ((uint8_t)0x40) +#define RTC_TR3_HT ((uint8_t)0x30) +#define RTC_TR3_HU ((uint8_t)0x0F) + +/* Bits definition for RTC_DR1 register*/ +#define RTC_DR1_DT ((uint8_t)0x30) +#define RTC_DR1_DU ((uint8_t)0x0F) + +/* Bits definition for RTC_DR2 register*/ +#define RTC_DR2_WDU ((uint8_t)0xE0) +#define RTC_DR2_MT ((uint8_t)0x10) +#define RTC_DR2_MU ((uint8_t)0x0F) + +/* Bits definition for RTC_DR3 register*/ +#define RTC_DR3_YT ((uint8_t)0xF0) +#define RTC_DR3_YU ((uint8_t)0x0F) + +/* Bits definition for RTC_CR1 register*/ +#define RTC_CR1_FMT ((uint8_t)0x40) +#define RTC_CR1_RATIO ((uint8_t)0x20) +#define RTC_CR1_WUCKSEL ((uint8_t)0x07) +#define RTC_CR1_BYPSHAD ((uint8_t)0x10) + + +/* Bits definition for RTC_CR2 register*/ +#define RTC_CR2_WUTIE ((uint8_t)0x40) +#define RTC_CR2_ALRAIE ((uint8_t)0x10) +#define RTC_CR2_WUTE ((uint8_t)0x04) +#define RTC_CR2_ALRAE ((uint8_t)0x01) +#define RTC_CR2_ALRIE ((uint8_t)0x20) + + + +/* Bits definition for RTC_CR3 register*/ +#define RTC_CR3_COE ((uint8_t)0x80) +#define RTC_CR3_OSEL ((uint8_t)0x60) +#define RTC_CR3_POL ((uint8_t)0x10) +#define RTC_CR3_COSEL ((uint8_t)0x08) +#define RTC_CR3_BCK ((uint8_t)0x04) +#define RTC_CR3_SUB1H ((uint8_t)0x02) +#define RTC_CR3_ADD1H ((uint8_t)0x01) + + +/* Bits definition for RTC_ISR1 register*/ +#define RTC_ISR1_INIT ((uint8_t)0x80) +#define RTC_ISR1_INITF ((uint8_t)0x40) +#define RTC_ISR1_RSF ((uint8_t)0x20) +#define RTC_ISR1_INITS ((uint8_t)0x10) +#define RTC_ISR1_SHPF ((uint8_t)0x08) +#define RTC_ISR1_WUTWF ((uint8_t)0x04) +#define RTC_ISR1_RECALPF ((uint8_t)0x02) +#define RTC_ISR1_ALRAWF ((uint8_t)0x01) + + +/* Bits definition for RTC_ISR2 register*/ +#define RTC_ISR2_WUTF ((uint8_t)0x04) +#define RTC_ISR2_ALRAF ((uint8_t)0x01) +#define RTC_ISR2_TAMP3F ((uint8_t)0x80) +#define RTC_ISR2_TAMP2F ((uint8_t)0x40) +#define RTC_ISR2_TAMP1F ((uint8_t)0x20) + +/* Bits definition for RTC_SHIFTRH register*/ +#define RTC_SHIFTRH_ADD1S ((uint8_t)0x80) +#define RTC_SHIFTRH_SUBFS ((uint8_t)0x7F) + +/* Bits definition for RTC_SHIFTRL register*/ +#define RTC_SHIFTRL_SUBFS ((uint8_t)0xFF) + + +/* Bits definition for RTC_ALRMAR1 register*/ +#define RTC_ALRMAR1_MSK1 ((uint8_t)0x80) +#define RTC_ALRMAR1_ST ((uint8_t)0x70) +#define RTC_ALRMAR1_SU ((uint8_t)0x0F) + +/* Bits definition for RTC_ALRMAR2 register*/ +#define RTC_ALRMAR2_MSK2 ((uint8_t)0x80) +#define RTC_ALRMAR2_MNT ((uint8_t)0x70) +#define RTC_ALRMAR2_MNU ((uint8_t)0x0F) + +/* Bits definition for RTC_ALRMAR3 register*/ +#define RTC_ALRMAR3_MSK3 ((uint8_t)0x80) +#define RTC_ALRMAR3_PM ((uint8_t)0x40) +#define RTC_ALRMAR3_HT ((uint8_t)0x30) +#define RTC_ALRMAR3_HU ((uint8_t)0x0F) + +/* Bits definition for RTC_ALRMAR4 register*/ +#define RTC_ALRMAR4_MSK4 ((uint8_t)0x80) +#define RTC_ALRMAR4_WDSEL ((uint8_t)0x40) +#define RTC_ALRMAR4_DT ((uint8_t)0x30) +#define RTC_ALRMAR4_DU ((uint8_t)0x0F) + +/* Bits definition for RTC_ALRMASSRH register*/ +#define RTC_ALRMASSRH_ALSS ((uint8_t)0x7F) + +/* Bits definition for RTC_ALRMASSRL register*/ +#define RTC_ALRMASSRL_ALSS ((uint8_t)0xFF) + +/* Bits definition for RTC_ALRMASSMSKR register*/ +#define RTC_ALRMASSMSKR_MASKSS ((uint8_t)0x1F) + + +/* Bits definition for RTC_CALRH register*/ +#define RTC_CALRH_CALP ((uint8_t)0x80) +#define RTC_CALRH_CALW8 ((uint8_t)0x40) +#define RTC_CALRH_CALW16 ((uint8_t)0x20) +#define RTC_CALRH_CALWx ((uint8_t)0x60) +#define RTC_CALRH_CALM ((uint8_t)0x01) + +/* Bits definition for RTC_CALRL register*/ +#define RTC_CALRL_CALM ((uint8_t)0xFF) + +/* Bits definition for RTC_TCR1 register*/ +#define RTC_TCR1_TAMP3LEVEL ((uint8_t)0x40) +#define RTC_TCR1_TAMP3E ((uint8_t)0x20) +#define RTC_TCR1_TAMP2LEVEL ((uint8_t)0x10) +#define RTC_TCR1_TAMP2E ((uint8_t)0x08) +#define RTC_TCR1_TAMP1LEVEL ((uint8_t)0x04) +#define RTC_TCR1_TAMP1E ((uint8_t)0x02) +#define RTC_TCR1_TAMPIE ((uint8_t)0x01) + +/* Bits definition for RTC_TCR2 register*/ +#define RTC_TCR2_TAMPPUDIS ((uint8_t)0x80) +#define RTC_TCR2_TAMPPRCH ((uint8_t)0x60) +#define RTC_TCR2_TAMPFLT ((uint8_t)0x18) +#define RTC_TCR2_TAMPFREQ ((uint8_t)0x07) + + +/*RTC special defines */ +#define RTC_WPR_EnableKey ((uint8_t)0xFF) +#define RTC_WPR_DisableKey1 ((uint8_t)0xCA) +#define RTC_WPR_DisableKey2 ((uint8_t)0x53) + +/** + * @} + */ + +/** + * @brief CSS on LSE registers. + */ +typedef struct CSSLSE_struct +{ + __IO uint8_t CSR; /*!< Control and Status Register*/ +} +CSSLSE_TypeDef; + +/** @addtogroup CSSLSE_Registers_Reset_Value + * @{ + */ +#define CSSLSE_CSR_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup CSSLSE_Registers_Bits_Definition + * @{ + */ + +/* Bits definition for CSSLSE_CSR register*/ +#define CSSLSE_CSR_SWITCHF ((uint8_t)0x10) +#define CSSLSE_CSR_CSSF ((uint8_t)0x08) +#define CSSLSE_CSR_CSSIE ((uint8_t)0x04) +#define CSSLSE_CSR_SWITCHEN ((uint8_t)0x02) +#define CSSLSE_CSR_CSSEN ((uint8_t)0x01) + +/** + * @} + */ +/*----------------------------------------------------------------------------*/ +/** + * @brief Beeper (BEEP) peripheral registers. + */ + +typedef struct BEEP_struct +{ + __IO uint8_t CSR1; /*!< BEEP Control status register1 */ + uint8_t RSERVED1; + uint8_t RESERVED2; + __IO uint8_t CSR2; /*!< BEEP Control status register2 */ +} +BEEP_TypeDef; + +/** @addtogroup BEEP_Registers_Reset_Value + * @{ + */ +#define BEEP_CSR1_RESET_VALUE ((uint8_t)0x00) +#define BEEP_CSR2_RESET_VALUE ((uint8_t)0x1F) + +/** + * @} + */ + +/** @addtogroup BEEP_Registers_Bits_Definition + * @{ + */ + +#define BEEP_CSR1_MSR ((uint8_t)0x01) /*!< Measurement enable mask */ + +#define BEEP_CSR2_BEEPSEL ((uint8_t)0xC0) /*!< Beeper frequency selection mask */ +#define BEEP_CSR2_BEEPEN ((uint8_t)0x20) /*!< Beeper enable mask */ +#define BEEP_CSR2_BEEPDIV ((uint8_t)0x1F) /*!< Beeper Divider prescalar mask */ + +/** + * @} + */ + +/*----------------------------------------------------------------------------ok*/ + +/** + * @brief Configuration Registers (CFG) + */ + +typedef struct CFG_struct +{ + __IO uint8_t GCR; /*!< Global Configuration register */ +} +CFG_TypeDef; + +/** @addtogroup CFG_Registers_Reset_Value + * @{ + */ + +#define CFG_GCR_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup CFG_Registers_Bits_Definition + * @{ + */ + +#define CFG_GCR_SWD ((uint8_t)0x01) /*!< Swim disable bit mask */ +#define CFG_GCR_AL ((uint8_t)0x02) /*!< Activation Level bit mask */ + +/** + * @} + */ +/*----------------------------------------------------------------------------ok*/ + +/** + * @brief SYSCFG + */ + +typedef struct SYSCFG_struct +{ + __IO uint8_t RMPCR3; /*!< Remap control register 3 */ + __IO uint8_t RMPCR1; /*!< Remap control register 1 */ + __IO uint8_t RMPCR2; /*!< Remap control register 2 */ +} +SYSCFG_TypeDef; + +/** @addtogroup SYSCFG_Registers_Reset_Value + * @{ + */ +#define SYSCFG_RMPCR1_RESET_VALUE ((uint8_t)0x0C) +#define SYSCFG_RMPCR2_RESET_VALUE ((uint8_t)0x00) +#define SYSCFG_RMPCR3_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup SYSCFG_Registers_Bits_Definition + * @{ + */ + +/* For DMA Channel Mapping*/ +#define SYSCFG_RMPCR1_ADC1DMA_REMAP ((uint8_t)0x03) /*!< ADC1 DMA channel remapping */ +#define SYSCFG_RMPCR1_TIM4DMA_REMAP ((uint8_t)0x0C) /*!< TIM4 DMA channel remapping */ + + +/* For GPIO Reapping*/ +#define SYSCFG_RMPCR1_USART1TR_REMAP ((uint8_t)0x30) /*!< USART1_TX and USART1_RX remapping */ +#define SYSCFG_RMPCR1_USART1CK_REMAP ((uint8_t)0x40) /*!< USART1_CK remapping */ +#define SYSCFG_RMPCR1_SPI1_REMAP ((uint8_t)0x80) /*!< SPI1 remapping */ + +#define SYSCFG_RMPCR2_ADC1TRIG_REMAP ((uint8_t)0x01) /*!< ADC1 External Trigger remap */ +#define SYSCFG_RMPCR2_TIM2TRIG_REMAP ((uint8_t)0x02) /*!< TIM2 Trigger remap */ +#define SYSCFG_RMPCR2_TIM3TRIG_REMAP1 ((uint8_t)0x04) /*!< TIM3 Trigger remap 1 */ +#define SYSCFG_RMPCR2_TIM2TRIG_LSE ((uint8_t)0x08) /*!< TIM2 Trigger remap to LSE */ +#define SYSCFG_RMPCR2_TIM3TRIG_LSE ((uint8_t)0x10) /*!< TIM3 Trigger remap to LSE */ +#define SYSCFG_RMPCR2_SPI2_REMAP ((uint8_t)0x20) /*!< SPI2 remapping */ +#define SYSCFG_RMPCR2_TIM3TRIG_REMAP2 ((uint8_t)0x40) /*!< TIM3 Trigger remap 2 */ +#define SYSCFG_RMPCR2_TIM23BKIN_REMAP ((uint8_t)0x80) /*!< TIM2 & TIM3 Break input remap */ + +#define SYSCFG_RMPCR3_SPI1_REMAP ((uint8_t)0x01) /*!< SPI1 remapping */ +#define SYSCFG_RMPCR3_USART3TR_REMAP ((uint8_t)0x02) /*!< USART3_TX and USART3_RX remapping */ +#define SYSCFG_RMPCR3_USART3CK_REMAP ((uint8_t)0x04) /*!< USART3_CK remapping */ +#define SYSCFG_RMPCR3_TIM3CH1_REMAP ((uint8_t)0x08) /*!< TIM3 channel 1 remapping */ +#define SYSCFG_RMPCR3_TIM3CH2_REMAP ((uint8_t)0x10) /*!< TIM3 channel 2 remapping */ +#define SYSCFG_RMPCR3_CCO_REMAP ((uint8_t)0x20) /*!< CCO remapping */ + +/** + * @} + */ +/*----------------------------------------------------------------------------ok*/ + +/** + * @brief Clock Controller (CLK) + */ +typedef struct CLK_struct +{ + __IO uint8_t CKDIVR; /*!< Clock Master Divider Register */ + __IO uint8_t CRTCR; /*!< RTC Clock selection Register */ + __IO uint8_t ICKCR; /*!< Internal Clocks Control Register */ + __IO uint8_t PCKENR1; /*!< Peripheral Clock Gating Register 1 */ + __IO uint8_t PCKENR2; /*!< Peripheral Clock Gating Register 2 */ + __IO uint8_t CCOR; /*!< Configurable Clock Output Register */ + __IO uint8_t ECKCR; /*!< External Clocks Control Register */ + __IO uint8_t SCSR; /*!< System clock status Register */ + __IO uint8_t SWR; /*!< System clock Switch Register */ + __IO uint8_t SWCR; /*!< Switch Control Register */ + __IO uint8_t CSSR; /*!< Clock Security Sytem Register */ + __IO uint8_t CBEEPR; /*!< Clock BEEP Register */ + __IO uint8_t HSICALR; /*!< HSI Calibration Register */ + __IO uint8_t HSITRIMR; /*!< HSI clock Calibration Trimmer Register */ + __IO uint8_t HSIUNLCKR; /*!< HSI Unlock Register */ + __IO uint8_t REGCSR; /*!< Main regulator control status register */ + __IO uint8_t PCKENR3; /*!< Peripheral Clock Gating Register 3 */ +} +CLK_TypeDef; + +/** @addtogroup CLK_Registers_Reset_Value + * @{ + */ +#define CLK_CKDIVR_RESET_VALUE ((uint8_t)0x03) +#define CLK_CRTCR_RESET_VALUE ((uint8_t)0x00) +#define CLK_ICKCR_RESET_VALUE ((uint8_t)0x11) +#define CLK_PCKENR1_RESET_VALUE ((uint8_t)0x00) +#define CLK_PCKENR2_RESET_VALUE ((uint8_t)0x80) +#define CLK_PCKENR3_RESET_VALUE ((uint8_t)0x00) +#define CLK_CCOR_RESET_VALUE ((uint8_t)0x00) +#define CLK_ECKCR_RESET_VALUE ((uint8_t)0x00) +#define CLK_SCSR_RESET_VALUE ((uint8_t)0x01) +#define CLK_SWR_RESET_VALUE ((uint8_t)0x01) +#define CLK_SWCR_RESET_VALUE ((uint8_t)0x00) +#define CLK_CSSR_RESET_VALUE ((uint8_t)0x00) +#define CLK_CBEEPR_RESET_VALUE ((uint8_t)0x00) +#define CLK_HSICALR_RESET_VALUE ((uint8_t)0x00) +#define CLK_HSITRIMR_RESET_VALUE ((uint8_t)0x00) +#define CLK_HSIUNLCKR_RESET_VALUE ((uint8_t)0x00) +#define CLK_REGCSR_RESET_VALUE ((uint8_t)0xB9) +/** + * @} + */ + +/** @addtogroup CLK_Registers_Bits_Definition + * @{ + */ + +#define CLK_CKDIVR_CKM ((uint8_t)0x07) /*!< System clock prescaler mask */ + +#define CLK_CRTCR_RTCDIV ((uint8_t)0xE0) /*!< RTC clock prescaler mask*/ +#define CLK_CRTCR_RTCSEL ((uint8_t)0x1E) /*!< RTC clock output selection mask */ +#define CLK_CRTCR_RTCSWBSY ((uint8_t)0x01) /*!< RTC clock switch busy */ + +#define CLK_ICKCR_BEEPAHALT ((uint8_t)0x40) /*!< BEEP clock Active Halt/Halt mode */ +#define CLK_ICKCR_FHWU ((uint8_t)0x20) /*!< Fast Wake-up from Active Halt/Halt mode */ +#define CLK_ICKCR_SAHALT ((uint8_t)0x10) /*!< Slow Active-halt mode */ +#define CLK_ICKCR_LSIRDY ((uint8_t)0x08) /*!< Low speed internal RC oscillator ready */ +#define CLK_ICKCR_LSION ((uint8_t)0x04) /*!< Low speed internal RC oscillator enable */ +#define CLK_ICKCR_HSIRDY ((uint8_t)0x02) /*!< High speed internal RC oscillator ready */ +#define CLK_ICKCR_HSION ((uint8_t)0x01) /*!< High speed internal RC oscillator enable */ + +#define CLK_PCKENR1_TIM2 ((uint8_t)0x01) /*!< Timer 2 clock enable */ +#define CLK_PCKENR1_TIM3 ((uint8_t)0x02) /*!< Timer 3 clock enable */ +#define CLK_PCKENR1_TIM4 ((uint8_t)0x04) /*!< Timer 4 clock enable */ +#define CLK_PCKENR1_I2C1 ((uint8_t)0x08) /*!< I2C1 clock enable */ +#define CLK_PCKENR1_SPI1 ((uint8_t)0x10) /*!< SPI1 clock enable */ +#define CLK_PCKENR1_USART1 ((uint8_t)0x20) /*!< USART1 clock enable */ +#define CLK_PCKENR1_BEEP ((uint8_t)0x40) /*!< BEEP clock enable */ +#define CLK_PCKENR1_DAC ((uint8_t)0x80) /*!< DAC clock enable */ + +#define CLK_PCKENR2_ADC1 ((uint8_t)0x01) /*!< ADC1 clock enable */ +#define CLK_PCKENR2_TIM1 ((uint8_t)0x02) /*!< TIM1 clock enable */ +#define CLK_PCKENR2_RTC ((uint8_t)0x04) /*!< RTC clock enable */ +#define CLK_PCKENR2_LCD ((uint8_t)0x08) /*!< LCD clock enable */ +#define CLK_PCKENR2_DMA1 ((uint8_t)0x10) /*!< DMA1 clock enable */ +#define CLK_PCKENR2_COMP ((uint8_t)0x20) /*!< Comparator clock enable */ +#define CLK_PCKENR2_BOOTROM ((uint8_t)0x80) /*!< Boot ROM clock enable */ + +#define CLK_PCKENR3_AES ((uint8_t)0x01) /*!< AES clock enable */ +#define CLK_PCKENR3_TIM5 ((uint8_t)0x02) /*!< Timer 5 clock enable */ +#define CLK_PCKENR3_SPI2 ((uint8_t)0x04) /*!< SPI2 clock enable */ +#define CLK_PCKENR3_UASRT2 ((uint8_t)0x08) /*!< USART2 clock enable */ +#define CLK_PCKENR3_USART3 ((uint8_t)0x10) /*!< USART3 clock enable */ + +#define CLK_CCOR_CCODIV ((uint8_t)0xE0) /*!< Configurable Clock output prescaler */ +#define CLK_CCOR_CCOSEL ((uint8_t)0x1E) /*!< Configurable clock output selection */ +#define CLK_CCOR_CCOSWBSY ((uint8_t)0x01) /*!< Configurable clock output switch busy flag */ + +#define CLK_ECKCR_LSEBYP ((uint8_t)0x20) /*!< Low speed external clock bypass */ +#define CLK_ECKCR_HSEBYP ((uint8_t)0x10) /*!< High speed external clock bypass */ +#define CLK_ECKCR_LSERDY ((uint8_t)0x08) /*!< Low speed external crystal oscillator ready */ +#define CLK_ECKCR_LSEON ((uint8_t)0x04) /*!< Low speed external crystal oscillator enable */ +#define CLK_ECKCR_HSERDY ((uint8_t)0x02) /*!< High speed external crystal oscillator ready */ +#define CLK_ECKCR_HSEON ((uint8_t)0x01) /*!< High speed external crystal oscillator enable */ + +#define CLK_SCSR_CKM ((uint8_t)0x0F) /*!< System clock status bits */ + +#define CLK_SWR_SWI ((uint8_t)0x0F) /*!< System clock 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 */ + +#define CLK_CSSR_CSSDGON ((uint8_t)0x10) /*!< Clock security sytem deglitcher system */ +#define CLK_CSSR_CSSD ((uint8_t)0x08) /*!< Clock security sytem 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_CBEEPR_CLKBEEPSEL ((uint8_t)0x06) /*!< Configurable BEEP clock source selection */ +#define CLK_CBEEPR_BEEPSWBSY ((uint8_t)0x01) /*!< BEEP clock busy in switch */ + +#define CLK_HSICALR_HSICAL ((uint8_t)0xFF) /*!< Copy of otpion byte trimming HSI oscillator */ + +#define CLK_HSITRIMR_HSITRIM ((uint8_t)0xFF) /*!< High speed internal oscillator trimmer */ + +#define CLK_HSIUNLCKR_HSIUNLCK ((uint8_t)0xFF) /*!< High speed internal oscillator trimmer unlock */ + +#define CLK_REGCSR_EEREADY ((uint8_t)0x80) /*!< Flash program memory and Data EEPROM ready */ +#define CLK_REGCSR_EEBUSY ((uint8_t)0x40) /*!< Flash program memory and Data EEPROM busy */ +#define CLK_REGCSR_LSEPD ((uint8_t)0x20) /*!< LSE power-down */ +#define CLK_REGCSR_HSEPD ((uint8_t)0x10) /*!< HSE power-down */ +#define CLK_REGCSR_LSIPD ((uint8_t)0x08) /*!< LSI power-down */ +#define CLK_REGCSR_HSIPD ((uint8_t)0x04) /*!< HSI power-down */ +#define CLK_REGCSR_REGOFF ((uint8_t)0x02) /*!< Main regulator OFF */ +#define CLK_REGCSR_REGREADY ((uint8_t)0x01) /*!< Main regulator ready */ + +/** + * @} + */ +/*----------------------------------------------------------------------------ok*/ + +/** + * @brief Comparator interface (COMP) + */ + +typedef struct COMP_struct +{ + __IO uint8_t CSR1; /*!< Control status register 1 */ + __IO uint8_t CSR2; /*!< Control status register 2 */ + __IO uint8_t CSR3; /*!< Control status register 3 */ + __IO uint8_t CSR4; /*!< Control status register 4 */ + __IO uint8_t CSR5; /*!< Control status register 5 */ +} +COMP_TypeDef; + + +/** @addtogroup COMP_Registers_Reset_Value + * @{ + */ +#define COMP_CSR1_RESET_VALUE ((uint8_t)0x00) +#define COMP_CSR2_RESET_VALUE ((uint8_t)0x00) +#define COMP_CSR3_RESET_VALUE ((uint8_t)0xC0) +#define COMP_CSR4_RESET_VALUE ((uint8_t)0x00) +#define COMP_CSR5_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup COMP_Registers_Bits_Definition + * @{ + */ + +/* CSR1 */ +#define COMP_CSR1_IE1 ((uint8_t)0x20) /*!< Comparator 1 Interrupt Enable Mask. */ +#define COMP_CSR1_EF1 ((uint8_t)0x10) /*!< Comparator 1 Event Flag Mask. */ +#define COMP_CSR1_CMP1OUT ((uint8_t)0x08) /*!< Comparator 1 Ouptput Mask. */ +#define COMP_CSR1_STE ((uint8_t)0x04) /*!< Schmitt trigger enable Mask. */ +#define COMP_CSR1_CMP1 ((uint8_t)0x03) /*!< Comparator 1 Configuration Mask. */ + +/* CSR2 */ +#define COMP_CSR2_IE2 ((uint8_t)0x20) /*!< Comparator 2 Interrupt Enable Mask. */ +#define COMP_CSR2_EF2 ((uint8_t)0x10) /*!< Comparator 2 Event Flag Mask. */ +#define COMP_CSR2_CMP2OUT ((uint8_t)0x08) /*!< Comparator 2 Ouptput Mask. */ +#define COMP_CSR2_SPEED ((uint8_t)0x04) /*!< Comparator 2 speed modeMask. */ +#define COMP_CSR2_CMP2 ((uint8_t)0x03) /*!< Comparator 2 Configuration Mask. */ + +/* CSR3 */ +#define COMP_CSR3_OUTSEL ((uint8_t)0xC0) /*!< Comparator 2 output selection Mask. */ +#define COMP_CSR3_INSEL ((uint8_t)0x38) /*!< Inversion input selection Mask. */ +#define COMP_CSR3_VREFEN ((uint8_t)0x04) /*!< Internal reference voltage Enable Mask. */ +#define COMP_CSR3_WNDWE ((uint8_t)0x02) /*!< Window Mode Enable Mask. */ +#define COMP_CSR3_VREFOUTEN ((uint8_t)0x01) /*!< VREF Output Enable Mask. */ + +/* CSR4 */ +#define COMP_CSR4_NINVTRIG ((uint8_t)0x38) /*!< COMP2 non-inverting input Mask. */ +#define COMP_CSR4_INVTRIG ((uint8_t)0x07) /*!< COMP2 inverting input Mask. */ + +/* CSR5 */ +#define COMP_CSR5_DACTRIG ((uint8_t)0x38) /*!< DAC outputs Mask. */ +#define COMP_CSR5_VREFTRIG ((uint8_t)0x07) /*!< VREF outputs Mask. */ + +/** + * @} + */ + +/*----------------------------------------------------------------------------ok*/ + +/** + * @brief External Interrupt Controller (EXTI) + */ +typedef struct EXTI_struct +{ + __IO uint8_t CR1; /*!< The four LSB EXTI pin sensitivity */ + __IO uint8_t CR2; /*!< The four MSB EXTI pin sensitivity */ + __IO uint8_t CR3; /*!< EXTI port B & port D sensitivity */ + __IO uint8_t SR1; /*!< Pins Status flag register 1 */ + __IO uint8_t SR2; /*!< Ports Status flage register 2 */ + __IO uint8_t CONF1; /*!< Port interrupt selector */ + uint8_t RESERVED[4]; /*!< reserved area */ + __IO uint8_t CR4; /*!< EXTI port G & port H sensitivity */ + __IO uint8_t CONF2; /*!< Port interrupt selector */ +} +EXTI_TypeDef; + +/** @addtogroup EXTI_Registers_Reset_Value + * @{ + */ + +#define EXTI_CR1_RESET_VALUE ((uint8_t)0x00) +#define EXTI_CR2_RESET_VALUE ((uint8_t)0x00) +#define EXTI_CR3_RESET_VALUE ((uint8_t)0x00) +#define EXTI_CONF1_RESET_VALUE ((uint8_t)0x00) +#define EXTI_SR1_RESET_VALUE ((uint8_t)0x00) +#define EXTI_SR2_RESET_VALUE ((uint8_t)0x00) +#define EXTI_CR4_RESET_VALUE ((uint8_t)0x00) +#define EXTI_CONF2_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup EXTI_Registers_Bits_Definition + * @{ + */ +/* CR1 */ +#define EXTI_CR1_P3IS ((uint8_t)0xC0) /*!< EXTI Pin 3 external interrupt sensitivity bit Mask */ +#define EXTI_CR1_P2IS ((uint8_t)0x30) /*!< EXTI Pin 2 external interrupt sensitivity bit Mask */ +#define EXTI_CR1_P1IS ((uint8_t)0x0C) /*!< EXTI Pin 1 external interrupt sensitivity bit Mask */ +#define EXTI_CR1_P0IS ((uint8_t)0x03) /*!< EXTI Pin 0 external interrupt sensitivity bit Mask */ + +/* CR2 */ +#define EXTI_CR2_P7IS ((uint8_t)0xC0) /*!< EXTI Pin 7 external interrupt sensitivity bit Mask */ +#define EXTI_CR2_P6IS ((uint8_t)0x30) /*!< EXTI Pin 6 external interrupt sensitivity bit Mask */ +#define EXTI_CR2_P5IS ((uint8_t)0x0C) /*!< EXTI Pin 5 external interrupt sensitivity bit Mask */ +#define EXTI_CR2_P4IS ((uint8_t)0x03) /*!< EXTI Pin 4 external interrupt sensitivity bit Mask */ + +/* CR3 */ +#define EXTI_CR3_PBIS ((uint8_t)0x03) /*!< EXTI PORTB external interrupt sensitivity bits Mask */ +#define EXTI_CR3_PDIS ((uint8_t)0x0C) /*!< EXTI PORTD external interrupt sensitivity bits Mask */ +#define EXTI_CR3_PEIS ((uint8_t)0x30) /*!< EXTI PORTE external interrupt sensitivity bits Mask */ +#define EXTI_CR3_PFIS ((uint8_t)0xC0) /*!< EXTI PORTF external interrupt sensitivity bits Mask */ + +/* CONF1 */ +#define EXTI_CONF1_PBLIS ((uint8_t)0x01) /*!< EXTI PORTB low interrupt selector bit Mask */ +#define EXTI_CONF1_PBHIS ((uint8_t)0x02) /*!< EXTI PORTB high interrupt selector bit Mask */ +#define EXTI_CONF1_PDLIS ((uint8_t)0x04) /*!< EXTI PORTD low interrupt selector bit Mask */ +#define EXTI_CONF1_PDHIS ((uint8_t)0x08) /*!< EXTI PORTD high interrupt selector bit Mask */ +#define EXTI_CONF1_PELIS ((uint8_t)0x10) /*!< EXTI PORTE low interrupt selector bit Mask */ +#define EXTI_CONF1_PEHIS ((uint8_t)0x20) /*!< EXTI PORTE high interrupt selector bit Mask */ +#define EXTI_CONF1_PFLIS ((uint8_t)0x40) /*!< EXTI PORTF low interrupt selector bit Mask */ +#define EXTI_CONF1_PFES ((uint8_t)0x80) /*!< EXTI PORTF or PORTE interrupt selector bit Mask */ + +/* CR4 */ +#define EXTI_CR4_PGIS ((uint8_t)0x03) /*!< EXTI PORTG external interrupt sensitivity bits Mask */ +#define EXTI_CR4_PHIS ((uint8_t)0x0C) /*!< EXTI PORTH external interrupt sensitivity bits Mask */ + +/* CONF2 */ +#define EXTI_CONF2_PFHIS ((uint8_t)0x01) /*!< EXTI PORTF high interrupt selector bit Mask */ +#define EXTI_CONF2_PGLIS ((uint8_t)0x02) /*!< EXTI PORTG low interrupt selector bit Mask */ +#define EXTI_CONF2_PGHIS ((uint8_t)0x04) /*!< EXTI PORTG high interrupt selector bit Mask */ +#define EXTI_CONF2_PHLIS ((uint8_t)0x08) /*!< EXTI PORTH low interrupt selector bit Mask */ +#define EXTI_CONF2_PHHIS ((uint8_t)0x10) /*!< EXTI PORTH high interrupt selector bit Mask */ +#define EXTI_CONF2_PGBS ((uint8_t)0x20) /*!< EXTI PORTB or PORTG interrupt selector bit Mask */ +#define EXTI_CONF2_PHDS ((uint8_t)0x40) /*!< EXTI PORTD or PORTH interrupt selector bit Mask */ + +/** + * @} + */ + +/*----------------------------------------------------------------------------ok*/ + +/** + * @brief FLASH and Data EEPROM + */ +typedef struct FLASH_struct +{ + __IO uint8_t CR1; /*!< Flash control register 1 */ + __IO uint8_t CR2; /*!< Flash control register 2 */ + __IO uint8_t PUKR; /*!< Flash program memory unprotection register */ + __IO uint8_t DUKR; /*!< Data EEPROM unprotection register */ + __IO uint8_t IAPSR; /*!< Flash in-application programming status register */ +} +FLASH_TypeDef; + +/** @addtogroup FLASH_Registers_Reset_Value + * @{ + */ +#define FLASH_CR1_RESET_VALUE ((uint8_t)0x00) +#define FLASH_CR2_RESET_VALUE ((uint8_t)0x00) +#define FLASH_PUKR_RESET_VALUE ((uint8_t)0xAE) +#define FLASH_DUKR_RESET_VALUE ((uint8_t)0x56) +#define FLASH_IAPSR_RESET_VALUE ((uint8_t)0x40) + + +/** + * @} + */ + +/** @addtogroup FLASH_Registers_Bits_Definition + * @{ + */ +#define FLASH_CR1_EEPM ((uint8_t)0x08) /*!< Flash low power selection during Run and Low power run mode Mask */ +#define FLASH_CR1_WAITM ((uint8_t)0x04) /*!< Flash low power selection during Wait and Low power wait mode Mask */ +#define FLASH_CR1_IE ((uint8_t)0x02) /*!< Flash Interrupt enable Mask */ +#define FLASH_CR1_FIX ((uint8_t)0x01) /*!< Fix programming time Mask */ + +#define FLASH_CR2_OPT ((uint8_t)0x80) /*!< Enable write access to option bytes*/ +#define FLASH_CR2_WPRG ((uint8_t)0x40) /*!< Word write once Mask */ +#define FLASH_CR2_ERASE ((uint8_t)0x20) /*!< Erase block Mask */ +#define FLASH_CR2_FPRG ((uint8_t)0x10) /*!< Fast programming mode Mask */ +#define FLASH_CR2_PRG ((uint8_t)0x01) /*!< Program block Mask */ + +#define FLASH_IAPSR_HVOFF ((uint8_t)0x40) /*!< End of high voltage flag Mask */ +#define FLASH_IAPSR_DUL ((uint8_t)0x08) /*!< Data EEPROM unlocked flag Mask */ +#define FLASH_IAPSR_EOP ((uint8_t)0x04) /*!< End of operation flag Mask */ +#define FLASH_IAPSR_PUL ((uint8_t)0x02) /*!< Program memory unlocked flag Mask */ +#define FLASH_IAPSR_WR_PG_DIS ((uint8_t)0x01) /*!< Write attempted to protected page Mask */ + +#define FLASH_PUKR_PUK ((uint8_t)0xFF) /*!< Flash Program memory unprotection mask */ + +#define FLASH_DUKR_DUK ((uint8_t)0xFF) /*!< Data EEPROM unprotection mask */ + + +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ + +/** + * @brief Inter-Integrated Circuit (I2C) + */ +typedef struct I2C_struct +{ + __IO uint8_t CR1; /*!< I2C control register 1 */ + __IO uint8_t CR2; /*!< I2C control register 2 */ + __IO uint8_t FREQR; /*!< I2C frequency register */ + __IO uint8_t OARL; /*!< I2C own address register 1 LSB */ + __IO uint8_t OARH; /*!< I2C own address register 1 MSB */ + __IO uint8_t OAR2; /*!< I2C own address register 2 */ + __IO uint8_t DR; /*!< I2C data register */ + __IO uint8_t SR1; /*!< I2C status register 1 */ + __IO uint8_t SR2; /*!< I2C status register 2 */ + __IO uint8_t SR3; /*!< I2C status register 3 */ + __IO uint8_t ITR; /*!< I2C interrupt & DMA register */ + __IO uint8_t CCRL; /*!< I2C clock control register low */ + __IO uint8_t CCRH; /*!< I2C clock control register high */ + __IO uint8_t TRISER; /*!< I2C maximum rise time register */ + __IO uint8_t PECR; /*!< I2CPacket Error Checking register */ +} +I2C_TypeDef; + +/** @addtogroup I2C_Registers_Reset_Value + * @{ + */ +#define I2C_CR1_RESET_VALUE ((uint8_t)0x00) +#define I2C_CR2_RESET_VALUE ((uint8_t)0x00) +#define I2C_FREQR_RESET_VALUE ((uint8_t)0x00) +#define I2C_OARL_RESET_VALUE ((uint8_t)0x00) +#define I2C_OARH_RESET_VALUE ((uint8_t)0x00) +#define I2C_OAR2_RESET_VALUE ((uint8_t)0x00) +#define I2C_DR_RESET_VALUE ((uint8_t)0x00) +#define I2C_SR1_RESET_VALUE ((uint8_t)0x00) +#define I2C_SR2_RESET_VALUE ((uint8_t)0x00) +#define I2C_SR3_RESET_VALUE ((uint8_t)0x00) +#define I2C_ITR_RESET_VALUE ((uint8_t)0x00) +#define I2C_CCRL_RESET_VALUE ((uint8_t)0x00) +#define I2C_CCRH_RESET_VALUE ((uint8_t)0x00) +#define I2C_TRISER_RESET_VALUE ((uint8_t)0x02) +#define I2C_PECR_RESET_VALUE ((uint8_t)0x00) + +/** + * @} + */ + +/** @addtogroup I2C_Registers_Bits_Definition + * @{ + */ + +#define I2C_CR1_NOSTRETCH ((uint8_t)0x80) /*!< Clock Stretching Disable (Slave mode) */ +#define I2C_CR1_ENGC ((uint8_t)0x40) /*!< General Call Enable */ +#define I2C_CR1_ENPEC ((uint8_t)0x20) /*!< PEC Enable */ +#define I2C_CR1_ARP ((uint8_t)0x10) /*!< ARP Enable */ +#define I2C_CR1_SMBTYPE ((uint8_t)0x08) /*!< SMBus type */ +#define I2C_CR1_SMBUS ((uint8_t)0x02) /*!< SMBus mode */ +#define I2C_CR1_PE ((uint8_t)0x01) /*!< Peripheral Enable */ + +#define I2C_CR2_SWRST ((uint8_t)0x80) /*!< Software Reset */ +#define I2C_CR2_ALERT ((uint8_t)0x20) /*!< SMBus Alert*/ +#define I2C_CR2_PEC ((uint8_t)0x10) /*!< Packet Error Checking */ +#define I2C_CR2_POS ((uint8_t)0x08) /*!< Acknowledge */ +#define I2C_CR2_ACK ((uint8_t)0x04) /*!< Acknowledge Enable */ +#define I2C_CR2_STOP ((uint8_t)0x02) /*!< Stop Generation */ +#define I2C_CR2_START ((uint8_t)0x01) /*!< Start Generation */ + +#define I2C_FREQR_FREQ ((uint8_t)0x3F) /*!< Peripheral Clock Frequency */ + +#define I2C_OARL_ADD ((uint8_t)0xFE) /*!< Interface Address bits [7..1] */ +#define I2C_OARL_ADD0 ((uint8_t)0x01) /*!< Interface Address bit0 */ + +#define I2C_OARH_ADDMODE ((uint8_t)0x80) /*!< Addressing Mode (Slave mode) */ +#define I2C_OARH_ADDCONF ((uint8_t)0x40) /*!< Address mode configuration */ +#define I2C_OARH_ADD ((uint8_t)0x06) /*!< Interface Address bits [9..8] */ + +#define I2C_OAR2_ADD2 ((uint8_t)0xFE) /*!< Interface Address bits [7..1] */ +#define I2C_OAR2_ENDUAL ((uint8_t)0x01) /*!< Dual addressing mode enable */ + +#define I2C_DR_DR ((uint8_t)0xFF) /*!< Data Register */ + +#define I2C_SR1_TXE ((uint8_t)0x80) /*!< Data Register Empty (transmitters) */ +#define I2C_SR1_RXNE ((uint8_t)0x40) /*!< Data Register not Empty (receivers) */ +#define I2C_SR1_STOPF ((uint8_t)0x10) /*!< Stop detection (Slave mode) */ +#define I2C_SR1_ADD10 ((uint8_t)0x08) /*!< 10-bit header sent (Master mode) */ +#define I2C_SR1_BTF ((uint8_t)0x04) /*!< Byte Transfer Finished */ +#define I2C_SR1_ADDR ((uint8_t)0x02) /*!< Address sent (master mode)/matched (slave mode) */ +#define I2C_SR1_SB ((uint8_t)0x01) /*!< Start Bit (Master mode) */ + +#define I2C_SR2_SMBALERT ((uint8_t)0x80) /*!< SMBus Alert */ +#define I2C_SR2_TIMEOUT ((uint8_t)0x40) /*!< Time out or TLow error */ +#define I2C_SR2_WUFH ((uint8_t)0x20) /*!< Wake-up from Halt */ +#define I2C_SR2_PECERR ((uint8_t)0x10) /*!< PEC error in reception */ +#define I2C_SR2_OVR ((uint8_t)0x08) /*!< Overrun/Underrun */ +#define I2C_SR2_AF ((uint8_t)0x04) /*!< Acknowledge Failure */ +#define I2C_SR2_ARLO ((uint8_t)0x02) /*!< Arbitration Lost (master mode) */ +#define I2C_SR2_BERR ((uint8_t)0x01) /*!< Bus Error */ + +#define I2C_SR3_DUALF ((uint8_t)0x80) /*!< Dual flag (Slave mode) */ +#define I2C_SR3_SMBHOST ((uint8_t)0x40) /*!< SMBus Host Header (Slave mode) */ +#define I2C_SR3_SMBDEFAULT ((uint8_t)0x20) /*!< SMBus Default Header (Slave mode) */ +#define I2C_SR3_GENCALL ((uint8_t)0x10) /*!< General Call Header (Slave mode) */ +#define I2C_SR3_TRA ((uint8_t)0x04) /*!< Transmitter/Receiver */ +#define I2C_SR3_BUSY ((uint8_t)0x02) /*!< Bus Busy */ +#define I2C_SR3_MSL ((uint8_t)0x01) /*!< Master/Slave */ + +#define I2C_ITR_LAST ((uint8_t)0x10) /*!< DMA Last transfer */ +#define I2C_ITR_DMAEN ((uint8_t)0x08) /*!< DMA request Enable */ +#define I2C_ITR_ITBUFEN ((uint8_t)0x04) /*!< Buffer Interrupt Enable */ +#define I2C_ITR_ITEVTEN ((uint8_t)0x02) /*!< Event Interrupt Enable */ +#define I2C_ITR_ITERREN ((uint8_t)0x01) /*!< Error Interrupt Enable */ + +#define I2C_CCRL_CCR ((uint8_t)0xFF) /*!< Clock Control Register (Master mode) */ + +#define I2C_CCRH_FS ((uint8_t)0x80) /*!< Master Mode Selection */ +#define I2C_CCRH_DUTY ((uint8_t)0x40) /*!< Fast Mode Duty Cycle */ +#define I2C_CCRH_CCR ((uint8_t)0x0F) /*!< Clock Control Register in Fast/Standard mode (Master mode) bits [11..8] */ + +#define I2C_TRISER_TRISE ((uint8_t)0x3F) /*!< Maximum Rise Time in Fast/Standard mode (Master mode) */ + +#define I2C_PECR_PEC ((uint8_t)0xFF) /*!< Packet error checking */ + +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ + +/** + * @brief IR digital interface (IRTIM) + */ +typedef struct IRTIM_struct +{ + __IO uint8_t CR; /*!< control register */ +} +IRTIM_TypeDef; +/** @addtogroup IRTIM_Registers_Reset_Value + * @{ + */ +#define IRTIM_CR_RESET_VALUE ((uint8_t)0x00) + + +/** +* @} +*/ + +/** @addtogroup IRTIM_Registers_Bits_Definition + * @{ + */ +/* CR*/ +#define IRTIM_CR_EN ((uint8_t)0x01) /*!< IRTIM_OUT enable Mask. */ +#define IRTIM_CR_HSEN ((uint8_t)0x02) /*!< High sink open drain buffer enable Mask */ + +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ + +/** + * @brief Interrupt Controller (ITC) + */ +typedef struct ITC_struct +{ + __IO uint8_t ISPR1; /*!< Interrupt Software Priority register 1 */ + __IO uint8_t ISPR2; /*!< Interrupt Software Priority register 2 */ + __IO uint8_t ISPR3; /*!< Interrupt Software Priority register 3 */ + __IO uint8_t ISPR4; /*!< Interrupt Software Priority register 4 */ + __IO uint8_t ISPR5; /*!< Interrupt Software Priority register 5 */ + __IO uint8_t ISPR6; /*!< Interrupt Software Priority register 6 */ + __IO uint8_t ISPR7; /*!< Interrupt Software Priority register 7 */ + __IO uint8_t ISPR8; /*!< Interrupt Software Priority register 8 */ +} +ITC_TypeDef; + +/** @addtogroup ITC_Registers_Reset_Value + * @{ + */ +#define ITC_SPRX_RESET_VALUE ((uint8_t)0xFF) /*!< Reset value of Software Priority registers 0 to 7 */ +/** + * @} + */ + +/*----------------------------------------------------------------------------*/ + +/** + * @brief Internal Low Speed Watchdog (IWDG) + */ +typedef struct IWDG_struct +{ + __IO uint8_t KR; /*!< Low Speed Watchdog Key Register */ + __IO uint8_t PR; /*!< Low Speed Watchdog Prescaler Register */ + __IO uint8_t RLR; /*!< Low Speed Watchdog Reload Register */ +} +IWDG_TypeDef; + +/** @addtogroup IWDG_Registers_Reset_Value + * @{ + */ +#define IWDG_RLR_RESET_VALUE ((uint8_t)0xFF) /*! + #define enableInterrupts() _rim_() /*! + #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 wfe() __wait_for_event(); /* Wait for event */ + #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 @svlreg +#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(STATE) \ + (((STATE) == SET) || \ + ((STATE) == RESET)) + +/*----------------------------------------------------------------------------- +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)) ) + + +#endif /* __STM8L15x_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_adc.h b/ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_adc.h new file mode 100644 index 00000000..cfb1d662 --- /dev/null +++ b/ports/stm8l/STM8L15x_StdPeriph_Driver/inc/stm8l15x_adc.h @@ -0,0 +1,386 @@ +/** + ****************************************************************************** + * @file stm8l15x_adc.h + * @author MCD Application Team + * @version V1.6.1 + * @date 30-September-2014 + * @brief This file contains all the functions prototypes for the ADC + * firmware library. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2014 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM8L15x_ADC_H +#define __STM8L15x_ADC_H + +/* Includes ------------------------------------------------------------------*/ +#include "stm8l15x.h" + +/** @addtogroup STM8L15x_StdPeriph_Driver + * @{ + */ + +/** @addtogroup ADC + * @{ + */ +/* Exported types ------------------------------------------------------------*/ + +/** @defgroup ADC_Exported_Types + * @{ + */ + + +/** @defgroup ADC_Channels + * @{ + */ +typedef enum +{ + ADC_Channel_0 = ((uint16_t)0x0301), /*!< Channel 00 */ + ADC_Channel_1 = ((uint16_t)0x0302), /*!< Channel 01 */ + ADC_Channel_2 = ((uint16_t)0x0304), /*!< Channel 02 */ + ADC_Channel_3 = ((uint16_t)0x0308), /*!< Channel 03 */ + ADC_Channel_4 = ((uint16_t)0x0310), /*!< Channel 04 */ + ADC_Channel_5 = ((uint16_t)0x0320), /*!< Channel 05 */ + ADC_Channel_6 = ((uint16_t)0x0340), /*!< Channel 06 */ + ADC_Channel_7 = ((uint16_t)0x0380), /*!< Channel 07 */ + + ADC_Channel_8 = ((uint16_t)0x0201), /*!< Channel 08 */ + ADC_Channel_9 = ((uint16_t)0x0202), /*!< Channel 09 */ + ADC_Channel_10 = ((uint16_t)0x0204), /*!< Channel 10 */ + ADC_Channel_11 = ((uint16_t)0x0208), /*!< Channel 11 */ + ADC_Channel_12 = ((uint16_t)0x0210), /*!< Channel 12 */ + ADC_Channel_13 = ((uint16_t)0x0220), /*!< Channel 13 */ + ADC_Channel_14 = ((uint16_t)0x0240), /*!< Channel 14 */ + ADC_Channel_15 = ((uint16_t)0x0280), /*!< Channel 15 */ + + ADC_Channel_16 = ((uint16_t)0x0101), /*!< Channel 16 */ + ADC_Channel_17 = ((uint16_t)0x0102), /*!< Channel 17 */ + ADC_Channel_18 = ((uint16_t)0x0104), /*!< Channel 18 */ + ADC_Channel_19 = ((uint16_t)0x0108), /*!< Channel 19 */ + ADC_Channel_20 = ((uint16_t)0x0110), /*!< Channel 20 */ + ADC_Channel_21 = ((uint16_t)0x0120), /*!< Channel 21 */ + ADC_Channel_22 = ((uint16_t)0x0140), /*!< Channel 22 */ + ADC_Channel_23 = ((uint16_t)0x0180), /*!< Channel 23 */ + + ADC_Channel_24 = ((uint16_t)0x0001), /*!< Channel 24 */ + ADC_Channel_25 = ((uint16_t)0x0002), /*!< Channel 25 */ + ADC_Channel_26 = ((uint16_t)0x0004), /*!< Channel 26 */ + ADC_Channel_27 = ((uint16_t)0x0008), /*!< Channel 27 */ + + ADC_Channel_Vrefint = ((uint16_t)0x0010), /*!< Vrefint Channel */ + ADC_Channel_TempSensor = ((uint16_t)0x0020), /*!< Temperature sensor Channel */ + + /* combination*/ + ADC_Channel_00To07 = ((uint16_t)0x03FF), /*!