* STM32L definitions and code fragments for AltOS
*/
-#define AO_STACK_SIZE 1024
+#define AO_STACK_SIZE 512
+
+#define AO_LED_TYPE uint16_t
/* Various definitions to make GCC look more like SDCC */
#define __interrupt(n)
#define __at(n)
-#define ao_arch_reboot() /* XXX */
+#define CORTEX_M3_AIRCR ((uint32_t *) 0xe000ed0c)
+
+#define ao_arch_reboot() (*((uint32_t *) 0xe000ed0c) = 0x05fa0004)
#define ao_arch_nop() asm("nop")
uint32_t a = (uint32_t) start; \
int i; \
\
- /* APSR */ \
- ARM_PUSH32(sp, 0); \
- \
- /* PRIMASK with interrupts enabled */ \
- ARM_PUSH32(sp, 0); \
- \
/* Return address (goes into LR) */ \
ARM_PUSH32(sp, a); \
\
while (i--) \
ARM_PUSH32(sp, 0); \
\
+ /* APSR */ \
+ ARM_PUSH32(sp, 0); \
+ \
+ /* PRIMASK with interrupts enabled */ \
+ ARM_PUSH32(sp, 0); \
+ \
task->sp = sp; \
} while (0);
#define ao_arch_save_regs() do { \
- uint32_t apsr; \
- uint32_t primask; \
+ /* Save general registers */ \
+ asm("push {r0-r12,lr}\n"); \
\
/* Save APSR */ \
- asm("mrs %0,apsr" : "=&r" (apsr)); \
- asm("push {%0}" : : "r" (apsr)); \
+ asm("mrs r0,apsr"); \
+ asm("push {r0}"); \
\
/* Save PRIMASK */ \
- asm("mrs %0,primask" : "=&r" (primask)); \
- asm("push {%0}" : : "r" (primask)); \
+ asm("mrs r0,primask"); \
+ asm("push {r0}"); \
\
- /* Save general registers */ \
- asm("push {r0-r12,lr}\n"); \
+ /* Enable interrupts */ \
+ sei(); \
} while (0)
#define ao_arch_save_stack() do { \
uint32_t *sp; \
asm("mov %0,sp" : "=&r" (sp) ); \
ao_cur_task->sp = (sp); \
- if ((uint8_t *) sp < ao_cur_task->stack) \
+ if ((uint8_t *) sp < &ao_cur_task->stack[0]) \
ao_panic (AO_PANIC_STACK); \
} while (0)
-#define ao_arch_isr_stack() /* nothing */
+#if 0
+#define ao_arch_isr_stack() do { \
+ uint32_t *sp = (uint32_t *) 0x20004000; \
+ asm("mov %0,sp" : "=&r" (sp) ); \
+ } while (0)
+#else
+#define ao_arch_isr_stack()
+#endif
+
#define ao_arch_cpu_idle() do { \
- asm("wfi"); \
+ asm("wfi"); \
} while (0)
#define ao_arch_restore_stack() do { \
uint32_t sp; \
- uint32_t primask; \
- uint32_t apsr; \
sp = (uint32_t) ao_cur_task->sp; \
\
/* Switch stacks */ \
asm("mov sp, %0" : : "r" (sp) ); \
\
- /* Restore general registers */ \
- asm("pop {r0-r12,lr}\n"); \
- \
/* Restore PRIMASK */ \
- asm("pop {%0}" : "=&r" (primask) ); \
- asm("msr primask,%0" : : "r" (primask) ); \
+ asm("pop {r0}"); \
+ asm("msr primask,r0"); \
\
/* Restore APSR */ \
- asm("pop {%0}" : "=&r" (apsr) ); \
- asm("msr apsr,%0" : : "r" (apsr) ); \
+ asm("pop {r0}"); \
+ asm("msr apsr,r0"); \
+ \
+ /* Restore general registers */ \
+ asm("pop {r0-r12,lr}\n"); \
\
/* Return to calling function */ \
asm("bx lr"); \
#define ao_arch_critical(b) do { cli(); do { b } while (0); sei(); } while (0)
-#define AO_ARM_NUM_ADC 12
-
-struct ao_adc {
- uint16_t tick; /* tick when the sample was read */
- uint16_t adc[AO_ARM_NUM_ADC]; /* samples */
-};
-
/*
* For now, we're running at a weird frequency
*/
-#define STM_APB1 (16000000 * 6 / 4)
+
+#if AO_HSE
+#define AO_PLLSRC AO_HSE
+#else
+#define AO_PLLSRC STM_HSI_FREQ
+#endif
+
+#define AO_PLLVCO (AO_PLLSRC * AO_PLLMUL)
+#define AO_SYSCLK (AO_PLLVCO / AO_PLLDIV)
+#define AO_HCLK (AO_SYSCLK / AO_AHB_PRESCALER)
+#define AO_PCLK1 (AO_HCLK / AO_APB1_PRESCALER)
+#define AO_PCLK2 (AO_HCLK / AO_APB2_PRESCALER)
+
+#if AO_APB1_PRESCALER == 1
+#define AO_TIM23467_CLK AO_PCLK1
+#else
+#define AO_TIM23467_CLK (2 * AO_PCLK1)
+#endif
+
+#if AO_APB2_PRESCALER == 1
+#define AO_TIM91011_CLK AO_PCLK2
+#else
+#define AO_TIM91011_CLK (2 * AO_PCLK2)
+#endif
+
+#define AO_STM_NVIC_HIGH_PRIORITY 4
+#define AO_STM_NVIC_CLOCK_PRIORITY 6
+#define AO_STM_NVIC_MED_PRIORITY 8
+#define AO_STM_NVIC_LOW_PRIORITY 10
void ao_lcd_stm_init(void);
void ao_lcd_font_string(char *s);
-#define USE_SERIAL_STDIN (USE_SERIAL_1_STDIN + USE_SERIAL_2_STDIN + USE_SERIAL_3_STDIN)
+char
+ao_serial1_getchar(void);
+
+void
+ao_serial1_putchar(char c);
+
+char
+ao_serial1_pollchar(void);
+
+void
+ao_serial1_set_speed(uint8_t speed);
+
+char
+ao_serial2_getchar(void);
+
+void
+ao_serial2_putchar(char c);
+
+char
+ao_serial2_pollchar(void);
+
+void
+ao_serial2_set_speed(uint8_t speed);
+
+char
+ao_serial3_getchar(void);
+
+void
+ao_serial3_putchar(char c);
+
+char
+ao_serial3_pollchar(void);
+
+void
+ao_serial3_set_speed(uint8_t speed);
+
+extern const uint32_t ao_radio_cal;
+
+void
+ao_adc_init();
#endif /* _AO_ARCH_H_ */