Używam STM32L151. Nie sądzę, żeby takie proste obliczenia tak mi zapchały pamięć, że się razem zjadą ze sobą sterta ze stosem. Żadne przerwanie nie może wejść bo jeszcze nic nie jest aktywne. Timery są mi potrzebne od na samym początku więc ich internalizacją zajmuję się na samym starcie, zaraz po wystartowaniu zegara.
A piszę w Eclipsie i nie używam żadnego modułu do SFR (choć czasem by się przydał).
Poniżej zamieszczam kod ASM z optymalizacją.
86 {
timerBaseConfig(TIM_TypeDef*, unsigned long, unsigned long):
080029cc: push {r4, r5, r6, lr}
080029ce: mov r4, r0
080029d0: mov r5, r1
080029d2: mov r6, r2
87 uint32_t clock_speed=rccGetCoreFrequency();
080029d4: bl 0x800278c <rccGetCoreFrequency()>
89 timer->PSC |= clock_speed/speed_hz -1; // Set prescaler to defined speed in hz
080029d8: ldrh r3, [r4, #40] ; 0x28
080029da: udiv r0, r0, r5
080029de: subs r0, #1
90 timer->ARR |= (speed_hz/1000)*period_ms; // Auto reload value // @error trzba dojśc co zle liczy - dziwne zachowanie debuga
080029e0: mov.w r2, #1000 ; 0x3e8
89 timer->PSC |= clock_speed/speed_hz -1; // Set prescaler to defined speed in hz
080029e4: orrs r3, r0
90 timer->ARR |= (speed_hz/1000)*period_ms; // Auto reload value // @error trzba dojśc co zle liczy - dziwne zachowanie debuga
080029e6: udiv r5, r5, r2
89 timer->PSC |= clock_speed/speed_hz -1; // Set prescaler to defined speed in hz
080029ea: uxth r3, r3
90 timer->ARR |= (speed_hz/1000)*period_ms; // Auto reload value // @error trzba dojśc co zle liczy - dziwne zachowanie debuga
080029ec: muls r6, r5
89 timer->PSC |= clock_speed/speed_hz -1; // Set prescaler to defined speed in hz
080029ee: strh r3, [r4, #40] ; 0x28
90 timer->ARR |= (speed_hz/1000)*period_ms; // Auto reload value // @error trzba dojśc co zle liczy - dziwne zachowanie debuga
080029f0: ldr r3, [r4, #44] ; 0x2c
080029f2: orrs r6, r3
080029f4: str r6, [r4, #44] ; 0x2c
91 timer->DIER |= TIM_DIER_UIE;
080029f6: ldrh r3, [r4, #12]
080029f8: uxth r3, r3
080029fa: orr.w r3, r3, #1
080029fe: strh r3, [r4, #12]
92 timer->CR1 |= TIM_CR1_CEN;// Enable timer
08002a00: ldrh r3, [r4, #0]
08002a02: uxth r3, r3
08002a04: orr.w r3, r3, #1
08002a08: strh r3, [r4, #0]
08002a0a: pop {r4, r5, r6, pc} {
A tu bez optymalizacji
86 {
timerBaseConfig(TIM_TypeDef*, unsigned long, unsigned long):
080029f4: push {r7, lr}
080029f6: sub sp, #24
080029f8: add r7, sp, #0
080029fa: str r0, [r7, #12]
080029fc: str r1, [r7, #8]
080029fe: str r2, [r7, #4]
87 uint32_t clock_speed=rccGetCoreFrequency();
08002a00: bl 0x800278c <rccGetCoreFrequency()>
08002a04: str r0, [r7, #20]
89 timer->PSC |= clock_speed/speed_hz -1; // Set prescaler to defined speed in hz
08002a06: ldr r3, [r7, #12]
08002a08: ldrh r3, [r3, #40] ; 0x28
08002a0a: uxth r2, r3
08002a0c: ldr r1, [r7, #20]
08002a0e: ldr r3, [r7, #8]
08002a10: udiv r3, r1, r3
08002a14: uxth r3, r3
08002a16: subs r3, #1
08002a18: uxth r3, r3
08002a1a: orrs r3, r2
08002a1c: uxth r2, r3
08002a1e: ldr r3, [r7, #12]
08002a20: strh r2, [r3, #40] ; 0x28
90 timer->ARR |= (speed_hz/1000)*period_ms; // Auto reload value // @error trzba dojśc co zle liczy - dziwne zachowanie debuga
08002a22: ldr r3, [r7, #12]
08002a24: ldr r2, [r3, #44] ; 0x2c
08002a26: ldr r1, [r7, #8]
08002a28: ldr r3, [pc, #56] ; (0x8002a64 <timerBaseConfig(TIM_TypeDef*, unsigned long, unsigned long)+112>)
08002a2a: umull r0, r3, r3, r1
08002a2e: lsrs r3, r3, #6
08002a30: ldr r1, [r7, #4]
08002a32: mul.w r3, r1, r3
08002a36: orrs r2, r3
08002a38: ldr r3, [r7, #12]
08002a3a: str r2, [r3, #44] ; 0x2c
91 timer->DIER |= TIM_DIER_UIE;
08002a3c: ldr r3, [r7, #12]
08002a3e: ldrh r3, [r3, #12]
08002a40: uxth r3, r3
08002a42: orr.w r3, r3, #1
08002a46: uxth r2, r3
08002a48: ldr r3, [r7, #12]
08002a4a: strh r2, [r3, #12]
92 timer->CR1 |= TIM_CR1_CEN;// Enable timer
08002a4c: ldr r3, [r7, #12]
08002a4e: ldrh r3, [r3, #0]
08002a50: uxth r3, r3
08002a52: orr.w r3, r3, #1
08002a56: uxth r2, r3
08002a58: ldr r3, [r7, #12]
08002a5a: strh r2, [r3, #0]
93 }
08002a5c: adds r7, #24
08002a5e: mov sp, r7
08002a60: pop {r7, pc}
08002a62: nop
08002a64: ldr r5, [pc, #844] ; (0x8002db4 <usartPrintf(unsigned long, char const*, ...)+20>)
08002a66: asrs r2, r4, #1