{
/* Set pad mode - we can fly! */
ao_flight_state = ao_flight_pad;
-#if HAS_USB && HAS_RADIO && !HAS_FLIGHT_DEBUG
+#if HAS_USB && HAS_RADIO && !HAS_FLIGHT_DEBUG && !HAS_SAMPLE_PROFILE
/* Disable the USB controller in flight mode
* to save power
*/
--- /dev/null
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <ao.h>
+#include <ao_sample_profile.h>
+#include <ao_task.h>
+
+#ifndef AO_SAMPLE_PROFILE_LOW_PC
+#define AO_SAMPLE_PROFILE_LOW_PC 0x08000000
+#endif
+
+#ifndef AO_SAMPLE_PROFILE_HIGH_PC
+#define AO_SAMPLE_PROFILE_HIGH_PC (AO_SAMPLE_PROFILE_LOW_PC + 44 * 1024)
+#endif
+
+#ifndef AO_SAMPLE_PROFILE_SHIFT
+#define AO_SAMPLE_PROFILE_SHIFT 6
+#endif
+
+#define AO_SAMPLE_PROFILE_RANGE (AO_SAMPLE_PROFILE_HIGH_PC - AO_SAMPLE_PROFILE_LOW_PC)
+#define AO_SAMPLE_PROFILE_NUM (AO_SAMPLE_PROFILE_RANGE >> AO_SAMPLE_PROFILE_SHIFT)
+
+static uint16_t prev_tick;
+static uint16_t samples[AO_SAMPLE_PROFILE_NUM];
+static uint8_t missed[AO_SAMPLE_PROFILE_NUM/8];
+static uint16_t max_miss;
+static uint32_t task, isr, os, idle;
+
+extern uint8_t ao_idle_loc;
+
+void
+ao_sample_profile_point(uint32_t pc, uint16_t tick, uint8_t in_isr)
+{
+ uint16_t delta = tick - prev_tick;
+
+ if (pc < AO_SAMPLE_PROFILE_LOW_PC)
+ return;
+ if (pc >= AO_SAMPLE_PROFILE_HIGH_PC)
+ return;
+ if (ao_cur_task) {
+ uint8_t *sp;
+ int32_t sp_delta;
+
+ asm("mov %0,sp" : "=&r" (sp));
+ sp_delta = sp - (uint8_t *) ao_cur_task->stack;
+ if (-96 < sp_delta && sp_delta < 16)
+ ao_panic(AO_PANIC_STACK);
+ }
+
+ if (in_isr)
+ isr += delta;
+ else if (ao_cur_task) {
+ ao_cur_task->ticks += delta;
+ task += delta;
+ } else if (pc == (uint32_t) &ao_idle_loc)
+ idle += delta;
+ else
+ os += delta;
+
+ pc -= AO_SAMPLE_PROFILE_LOW_PC;
+ pc >>= AO_SAMPLE_PROFILE_SHIFT;
+ samples[pc] += delta;
+
+ if (delta > 1)
+ missed[pc >> 3] |= (1 << (pc & 7));
+ if (delta > max_miss)
+ max_miss = delta;
+ prev_tick = tick;
+}
+
+static void
+ao_sample_profile_start(void)
+{
+ prev_tick = ao_sample_profile_timer_start();
+}
+
+static void
+ao_sample_profile_stop(void)
+{
+ ao_sample_profile_timer_stop();
+}
+
+static void
+ao_sample_profile_dump(void)
+{
+ uint16_t a;
+ uint8_t t;
+
+ printf ("task %6d\n", task);
+ printf ("isr %6d\n", isr);
+ printf ("os %6d\n", os);
+ printf ("idle %6d\n", idle);
+ printf ("irq blocked %d\n", max_miss);
+ for (t = 0; t < ao_num_tasks; t++)
+ printf ("task %6d %6d %6d %s\n",
+ ao_tasks[t]->ticks,
+ ao_tasks[t]->yields,
+ ao_tasks[t]->max_run,
+ ao_tasks[t]->name);
+ for (a = 0; a < AO_SAMPLE_PROFILE_NUM; a++) {
+ if (samples[a])
+ printf ("%04x %c %u\n",
+ (a << AO_SAMPLE_PROFILE_SHIFT) + AO_SAMPLE_PROFILE_LOW_PC,
+ missed[a >> 3] & (1 << (a & 7)) ? '*' : ' ',
+ samples[a]);
+ }
+}
+
+static void
+ao_sample_profile_clear(void)
+{
+ int t;
+
+ task = isr = os = idle = 0;
+ max_miss = 0;
+ memset(samples, '\0', sizeof (samples));
+ memset(missed, '\0', sizeof (missed));
+ for (t = 0; t < ao_num_tasks; t++) {
+ ao_tasks[t]->ticks = 0;
+ ao_tasks[t]->yields = 0;
+ ao_tasks[t]->max_run = 0;
+ }
+}
+
+static void
+ao_sample_profile_cmd(void)
+{
+ ao_cmd_white();
+ switch (ao_cmd_lex_c) {
+ case '1':
+ ao_sample_profile_start();
+ break;
+ case '0':
+ ao_sample_profile_stop();
+ break;
+ case 'd':
+ ao_sample_profile_dump();
+ break;
+ case 'c':
+ ao_sample_profile_clear();
+ break;
+ default:
+ ao_cmd_status = ao_cmd_syntax_error;
+ break;
+ }
+}
+
+static __code struct ao_cmds ao_sample_profile_cmds[] = {
+ { ao_sample_profile_cmd, "S <1 start,0 stop, d dump,c clear>\0Sample profile" },
+ { 0, NULL }
+};
+
+void
+ao_sample_profile_init(void)
+{
+ ao_sample_profile_timer_init();
+ ao_cmd_register(&ao_sample_profile_cmds[0]);
+ ao_sample_profile_clear();
+}
--- /dev/null
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_SAMPLE_PROFILE_H_
+#define _AO_SAMPLE_PROFILE_H_
+
+#include <ao_sample_profile_timer.h>
+
+void
+ao_sample_profile_point(uint32_t pc, uint16_t tick, uint8_t in_isr);
+
+void
+ao_sample_profile_init(void);
+
+#endif /* _AO_SAMPLE_PROFILE_H_ */
*/
#include <ao.h>
+#include <ao_task.h>
+#if HAS_SAMPLE_PROFILE
+#include <ao_sample_profile.h>
+#endif
#define AO_NO_TASK_INDEX 0xff
ao_arch_init_stack(task, start);
}
+__xdata uint8_t ao_idle;
+
/* Task switching function. This must not use any stack variables */
void
ao_yield(void) ao_arch_naked_define
ao_cur_task_index = ao_num_tasks-1;
else
{
+#if HAS_SAMPLE_PROFILE
+ uint16_t tick = ao_sample_profile_timer_value();
+ uint16_t run = tick - ao_cur_task->start;
+ if (run > ao_cur_task->max_run)
+ ao_cur_task->max_run = run;
+ ++ao_cur_task->yields;
+#endif
ao_arch_save_stack();
}
if (ao_cur_task_index == ao_last_task_index)
ao_arch_cpu_idle();
}
+#if HAS_SAMPLE_PROFILE
+ ao_cur_task->start = ao_sample_profile_timer_value();
+#endif
}
#if AO_CHECK_STACK
cli();
uint8_t task_id; /* unique id */
__code char *name; /* task name */
uint8_t stack[AO_STACK_SIZE]; /* saved stack */
+#if HAS_SAMPLE_PROFILE
+ uint32_t ticks;
+ uint32_t yields;
+ uint16_t start;
+ uint16_t max_run;
+#endif
};
-extern __xdata struct ao_task *__data ao_cur_task;
-
#define AO_NUM_TASKS 16 /* maximum number of tasks */
#define AO_NO_TASK 0 /* no task id */
+extern __xdata struct ao_task * __xdata ao_tasks[AO_NUM_TASKS];
+extern __data uint8_t ao_num_tasks;
+extern __data uint8_t ao_cur_task_index;
+extern __xdata struct ao_task *__data ao_cur_task;
+
/*
ao_task.c
*/
#include <ao_fec.h>
#include <ao_packet.h>
+#define AO_RADIO_MAX_RECV sizeof(struct ao_packet)
+#define AO_RADIO_MAX_SEND sizeof(struct ao_packet)
+
uint8_t ao_radio_wake;
uint8_t ao_radio_mutex;
uint8_t ao_radio_abort;
}
}
+static uint8_t tx_data[(AO_RADIO_MAX_SEND + 4) * 2];
+
void
ao_radio_send(const void *d, uint8_t size)
{
uint8_t marc_status;
- static uint8_t encode[256];
- uint8_t *e = encode;
+ uint8_t *e = tx_data;
uint8_t encode_len;
uint8_t this_len;
uint8_t started = 0;
uint8_t fifo_space;
- encode_len = ao_fec_encode(d, size, encode);
+ encode_len = ao_fec_encode(d, size, tx_data);
ao_radio_get(encode_len);
ao_radio_put();
}
-#define AO_RADIO_MAX_RECV 90
-
static uint8_t rx_data[(AO_RADIO_MAX_RECV + 4) * 2 * 8];
static uint16_t rx_data_count;
static uint16_t rx_data_consumed;
ao_radio_configured = 0;
ao_spi_init_cs (AO_CC1120_SPI_CS_PORT, (1 << AO_CC1120_SPI_CS_PIN));
+#if 0
AO_CC1120_SPI_CS_PORT->bsrr = ((uint32_t) (1 << AO_CC1120_SPI_CS_PIN));
for (i = 0; i < 10000; i++) {
if ((SPI_2_PORT->idr & (1 << SPI_2_MISO_PIN)) == 0)
AO_CC1120_SPI_CS_PORT->bsrr = (1 << AO_CC1120_SPI_CS_PIN);
if (i == 10000)
ao_panic(AO_PANIC_SELF_TEST_CC1120);
+#endif
/* Enable the EXTI interrupt for the appropriate pin */
ao_enable_port(AO_CC1120_INT_PORT);
ao_ms5607_get_sample(uint8_t cmd) {
uint8_t reply[3];
uint8_t read;
+ uint32_t loops;
ao_ms5607_done = 0;
#if AO_MS5607_PRIVATE_PINS
ao_spi_put(AO_MS5607_SPI_INDEX);
#endif
+// loops = 0;
cli();
- while (!ao_ms5607_done)
+ while (!ao_ms5607_done) {
+// loops++;
ao_sleep((void *) &ao_ms5607_done);
+ }
sei();
+// if (loops > 1)
+// printf ("ms5607 loops %d\n", loops);
#if AO_MS5607_PRIVATE_PINS
stm_gpio_set(AO_MS5607_CS_PORT, AO_MS5607_CS_PIN, 1);
#else
ao_mma655x.h \
ao_cc1120_CC1120.h \
ao_profile.h \
+ ao_task.h \
ao_whiten.h \
+ ao_sample_profile.h \
stm32l.h
#
#PROFILE=ao_profile.c
#PROFILE_DEF=-DAO_PROFILE=1
+SAMPLE_PROFILE=ao_sample_profile.c \
+ ao_sample_profile_timer.c
+SAMPLE_PROFILE_DEF=-DHAS_SAMPLE_PROFILE=1
+
# ao_hmc5883.c
ALTOS_SRC = \
ao_packet.c \
ao_companion.c \
ao_pyro.c \
- $(PROFILE)
+ $(PROFILE) \
+ $(SAMPLE_PROFILE)
PRODUCT=MegaMetrum-v0.1
PRODUCT_DEF=-DMEGAMETRUM
IDPRODUCT=0x0023
-CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) -Os -g
+CFLAGS = $(PRODUCT_DEF) $(STM_CFLAGS) $(PROFILE_DEF) $(SAMPLE_PROFILE_DEF) -Os -g
PROGNAME=megametrum-v0.1
PROG=$(PROGNAME)-$(VERSION).elf
#include <ao_packet.h>
#include <ao_companion.h>
#include <ao_profile.h>
+#if HAS_SAMPLE_PROFILE
+#include <ao_sample_profile.h>
+#endif
#include <ao_pyro.h>
int
#if AO_PROFILE
ao_profile_init();
#endif
+#if HAS_SAMPLE_PROFILE
+ ao_sample_profile_init();
+#endif
ao_start_scheduler();
return 0;
#define ao_arch_cpu_idle() do { \
- asm("wfi"); \
+ asm(".global ao_idle_loc\n\twfi\nao_idle_loc:"); \
} while (0)
#define ao_arch_restore_stack() do { \
--- /dev/null
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#include <ao.h>
+#include <ao_sample_profile.h>
+
+struct stm_exception {
+ uint32_t r0;
+ uint32_t r1;
+ uint32_t r2;
+ uint32_t r3;
+ uint32_t r12;
+ uint32_t lr;
+ uint32_t pc;
+ uint32_t psr;
+};
+
+void
+stm_tim10_isr(void)
+{
+ struct stm_exception *ex;
+
+ asm("mov %0,sp" : "=&r" (ex));
+
+ stm_tim10.sr = 0;
+ ao_sample_profile_point(ex->pc, stm_tim11.cnt, (ex->psr & 0xff) != 0);
+}
+
+uint16_t
+ao_sample_profile_timer_start(void)
+{
+ /* Reset counts */
+ stm_tim11.cnt = 0;
+ stm_tim10.cnt = 0;
+
+ /* Turn on timer 11 */
+ stm_tim11.cr1 = ((0 << STM_TIM1011_CR1_CKD) |
+ (0 << STM_TIM1011_CR1_ARPE) |
+ (1 << STM_TIM1011_CR1_URS) |
+ (0 << STM_TIM1011_CR1_UDIS) |
+ (1 << STM_TIM1011_CR1_CEN));
+
+ /* Turn on timer 10 */
+ stm_tim10.cr1 = ((0 << STM_TIM1011_CR1_CKD) |
+ (0 << STM_TIM1011_CR1_ARPE) |
+ (1 << STM_TIM1011_CR1_URS) |
+ (0 << STM_TIM1011_CR1_UDIS) |
+ (1 << STM_TIM1011_CR1_CEN));
+ return stm_tim11.cnt;
+}
+
+void
+ao_sample_profile_timer_stop(void)
+{
+ stm_tim10.cr1 = 0;
+ stm_tim11.cr1 = 0;
+}
+
+#if AO_APB2_PRESCALER > 1
+#define TIMER_91011_SCALER 2
+#else
+#define TIMER_91011_SCALER 1
+#endif
+
+#define TIMER_10kHz ((AO_PCLK2 * TIMER_91011_SCALER) / 10000)
+#define TIMER_1kHz ((AO_PCLK2 * TIMER_91011_SCALER) / 1000)
+
+void
+ao_sample_profile_timer_init(void)
+{
+ /* Turn on power for timer 10 and 11 */
+ stm_rcc.apb2enr |= (1 << STM_RCC_APB2ENR_TIM10EN) | (1 << STM_RCC_APB2ENR_TIM11EN);
+
+ /* Timer 10 is the 1kHz interrupt */
+ stm_tim10.cr1 = 0;
+ stm_tim10.psc = TIMER_10kHz;
+ stm_tim10.arr = 9;
+ stm_tim10.cnt = 0;
+
+ /* Enable timer 10 update interrupt */
+ stm_tim10.dier = (1 << STM_TIM1011_DIER_UIE);
+
+ /* Poke timer to reload values */
+ stm_tim10.egr |= (1 << STM_TIM1011_EGR_UG);
+
+ /* Timer 11 is the 1kHz counter */
+ stm_tim11.cr1 = 0;
+ stm_tim11.psc = TIMER_1kHz;
+ stm_tim11.arr = 0xffff;
+ stm_tim11.cnt = 0;
+
+ /* Disable interrupts for timer 11 */
+ stm_tim11.dier = 0;
+
+ /* Poke timer to reload values */
+ stm_tim11.egr |= (1 << STM_TIM1011_EGR_UG);
+
+ stm_tim10.sr = 0;
+ stm_nvic_set_enable(STM_ISR_TIM10_POS);
+ stm_nvic_set_priority(STM_ISR_TIM10_POS, AO_STM_NVIC_HIGH_PRIORITY);
+}
--- /dev/null
+/*
+ * Copyright © 2012 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_SAMPLE_PROFILE_TIMER_H_
+#define _AO_SAMPLE_PROFILE_TIMER_H_
+
+uint16_t
+ao_sample_profile_timer_start(void);
+
+void
+ao_sample_profile_timer_stop(void);
+
+void
+ao_sample_profile_timer_init(void);
+
+#define ao_sample_profile_timer_value() ((uint16_t) stm_tim11.cnt)
+
+#endif /* _AO_SAMPLE_PROFILE_TIMER_H_ */
};
extern struct stm_tim stm_tim9;
-extern struct stm_tim stm_tim10;
-extern struct stm_tim stm_tim11;
+
+struct stm_tim1011 {
+ vuint32_t cr1;
+ uint32_t unused_4;
+ vuint32_t smcr;
+ vuint32_t dier;
+ vuint32_t sr;
+ vuint32_t egr;
+ vuint32_t ccmr1;
+ uint32_t unused_1c;
+ vuint32_t ccer;
+ vuint32_t cnt;
+ vuint32_t psc;
+ vuint32_t arr;
+ uint32_t unused_30;
+ vuint32_t ccr1;
+ uint32_t unused_38;
+ uint32_t unused_3c;
+ uint32_t unused_40;
+ uint32_t unused_44;
+ uint32_t unused_48;
+ uint32_t unused_4c;
+ vuint32_t or;
+};
+
+extern struct stm_tim1011 stm_tim10;
+extern struct stm_tim1011 stm_tim11;
+
+#define STM_TIM1011_CR1_CKD 8
+#define STM_TIM1011_CR1_CKD_1 0
+#define STM_TIM1011_CR1_CKD_2 1
+#define STM_TIM1011_CR1_CKD_4 2
+#define STM_TIM1011_CR1_CKD_MASK 3
+#define STM_TIM1011_CR1_ARPE 7
+#define STM_TIM1011_CR1_URS 2
+#define STM_TIM1011_CR1_UDIS 1
+#define STM_TIM1011_CR1_CEN 0
+
+#define STM_TIM1011_SMCR_ETP 15
+#define STM_TIM1011_SMCR_ECE 14
+#define STM_TIM1011_SMCR_ETPS 12
+#define STM_TIM1011_SMCR_ETPS_OFF 0
+#define STM_TIM1011_SMCR_ETPS_2 1
+#define STM_TIM1011_SMCR_ETPS_4 2
+#define STM_TIM1011_SMCR_ETPS_8 3
+#define STM_TIM1011_SMCR_ETPS_MASK 3
+#define STM_TIM1011_SMCR_ETF 8
+#define STM_TIM1011_SMCR_ETF_NONE 0
+#define STM_TIM1011_SMCR_ETF_CK_INT_2 1
+#define STM_TIM1011_SMCR_ETF_CK_INT_4 2
+#define STM_TIM1011_SMCR_ETF_CK_INT_8 3
+#define STM_TIM1011_SMCR_ETF_DTS_2_6 4
+#define STM_TIM1011_SMCR_ETF_DTS_2_8 5
+#define STM_TIM1011_SMCR_ETF_DTS_4_6 6
+#define STM_TIM1011_SMCR_ETF_DTS_4_8 7
+#define STM_TIM1011_SMCR_ETF_DTS_8_6 8
+#define STM_TIM1011_SMCR_ETF_DTS_8_8 9
+#define STM_TIM1011_SMCR_ETF_DTS_16_5 10
+#define STM_TIM1011_SMCR_ETF_DTS_16_6 11
+#define STM_TIM1011_SMCR_ETF_DTS_16_8 12
+#define STM_TIM1011_SMCR_ETF_DTS_32_5 13
+#define STM_TIM1011_SMCR_ETF_DTS_32_6 14
+#define STM_TIM1011_SMCR_ETF_DTS_32_8 15
+#define STM_TIM1011_SMCR_ETF_MASK 15
+
+#define STM_TIM1011_DIER_CC1E 1
+#define STM_TIM1011_DIER_UIE 0
+
+#define STM_TIM1011_SR_CC1OF 9
+#define STM_TIM1011_SR_CC1IF 1
+#define STM_TIM1011_SR_UIF 0
+
+#define STM_TIM1011_EGR_CC1G 1
+#define STM_TIM1011_EGR_UG 0
+
+#define STM_TIM1011_CCMR1_OC1CE 7
+#define STM_TIM1011_CCMR1_OC1M 4
+#define STM_TIM1011_CCMR1_OC1M_FROZEN 0
+#define STM_TIM1011_CCMR1_OC1M_SET_1_ACTIVE_ON_MATCH 1
+#define STM_TIM1011_CCMR1_OC1M_SET_1_INACTIVE_ON_MATCH 2
+#define STM_TIM1011_CCMR1_OC1M_TOGGLE 3
+#define STM_TIM1011_CCMR1_OC1M_FORCE_INACTIVE 4
+#define STM_TIM1011_CCMR1_OC1M_FORCE_ACTIVE 5
+#define STM_TIM1011_CCMR1_OC1M_PWM_MODE_1 6
+#define STM_TIM1011_CCMR1_OC1M_PWM_MODE_2 7
+#define STM_TIM1011_CCMR1_OC1M_MASK 7
+#define STM_TIM1011_CCMR1_OC1PE 3
+#define STM_TIM1011_CCMR1_OC1FE 2
+#define STM_TIM1011_CCMR1_CC1S 0
+#define STM_TIM1011_CCMR1_CC1S_OUTPUT 0
+#define STM_TIM1011_CCMR1_CC1S_INPUT_TI1 1
+#define STM_TIM1011_CCMR1_CC1S_INPUT_TI2 2
+#define STM_TIM1011_CCMR1_CC1S_INPUT_TRC 3
+#define STM_TIM1011_CCMR1_CC1S_MASK 3
+
+#define STM_TIM1011_CCMR1_IC1F_NONE 0
+#define STM_TIM1011_CCMR1_IC1F_CK_INT_2 1
+#define STM_TIM1011_CCMR1_IC1F_CK_INT_4 2
+#define STM_TIM1011_CCMR1_IC1F_CK_INT_8 3
+#define STM_TIM1011_CCMR1_IC1F_DTS_2_6 4
+#define STM_TIM1011_CCMR1_IC1F_DTS_2_8 5
+#define STM_TIM1011_CCMR1_IC1F_DTS_4_6 6
+#define STM_TIM1011_CCMR1_IC1F_DTS_4_8 7
+#define STM_TIM1011_CCMR1_IC1F_DTS_8_6 8
+#define STM_TIM1011_CCMR1_IC1F_DTS_8_8 9
+#define STM_TIM1011_CCMR1_IC1F_DTS_16_5 10
+#define STM_TIM1011_CCMR1_IC1F_DTS_16_6 11
+#define STM_TIM1011_CCMR1_IC1F_DTS_16_8 12
+#define STM_TIM1011_CCMR1_IC1F_DTS_32_5 13
+#define STM_TIM1011_CCMR1_IC1F_DTS_32_6 14
+#define STM_TIM1011_CCMR1_IC1F_DTS_32_8 15
+#define STM_TIM1011_CCMR1_IC1F_MASK 15
+#define STM_TIM1011_CCMR1_IC1PSC 2
+#define STM_TIM1011_CCMR1_IC1PSC_1 0
+#define STM_TIM1011_CCMR1_IC1PSC_2 1
+#define STM_TIM1011_CCMR1_IC1PSC_4 2
+#define STM_TIM1011_CCMR1_IC1PSC_8 3
+#define STM_TIM1011_CCMR1_IC1PSC_MASK 3
+#define STM_TIM1011_CCMR1_CC1S 0
+
+#define STM_TIM1011_CCER_CC1NP 3
+#define STM_TIM1011_CCER_CC1P 1
+#define STM_TIM1011_CCER_CC1E 0
+
+#define STM_TIM1011_OR_TI1_RMP_RI 3
+#define STM_TIM1011_ETR_RMP 2
+#define STM_TIM1011_TI1_RMP 0
+#define STM_TIM1011_TI1_RMP_GPIO 0
+#define STM_TIM1011_TI1_RMP_LSI 1
+#define STM_TIM1011_TI1_RMP_LSE 2
+#define STM_TIM1011_TI1_RMP_RTC 3
+#define STM_TIM1011_TI1_RMP_MASK 3
/* Flash interface */