Forum: Mikrocontroller und Digitale Elektronik Bootloader für Cortex-M0+ ohne VTOR und ohne Mem-Remap?


von Alex (Gast)


Lesenswert?

Moin,

Ich nutze einen recht unbekannten APM32 Cortex-M0+, ohne VTOR (vector 
offset register) und ohne Mem-Remap.

Wie werden da in einem eigenen Bootloader am besten die Interrupts an 
die User-Firmware übergeben?
Meine Idee wäre ein universeller ISR Handler im Bootloader, der über 
IPSR den aktiven interrupt rausfindet und dann den entsprechenden 
ISR-Handler aus der Firmware aufruft. Gibt natürlich ziemlich overhead 
bei jedem Interrupt...
Müsste das so gehen und ist das so üblich oder gibt es eine schönere 
Methode?

Vielen Dank!
Alex

von JoergF (Gast)


Lesenswert?

Das habe ich bereits so bei einem STM32F051K8 gemacht

Die Vektortabelle der Applikation liegt hier bei 0x08001000
1
void COMMON_IRQHandler(void)
2
{
3
    unsigned int irq_no;
4
    unsigned int * addr;
5
    void (*irq_func)(void);
6
    
7
    irq_no = __get_IPSR() & 0x3F;
8
        
9
    addr = (unsigned int *)(0x08001000 + irq_no*4);
10
    
11
    irq_func = (void (*)(void))*addr;
12
    (*irq_func)();
13
}

Die Vektortabelle des Bootloaders sieht dann so aus:
1
__vector_table
2
        DCD     sfe(CSTACK)
3
        DCD     SystemStart                    ; Reset Handler
4
5
        DCD     bl_NMI_Handler                 ; NMI Handler
6
        DCD     bl_HardFault_Handler           ; Hard Fault Handler
7
        DCD     0                              ; Reserved
8
        DCD     0                              ; Reserved
9
        DCD     0                              ; Reserved
10
        DCD     0                              ; Reserved
11
        DCD     0                              ; Reserved
12
        DCD     0                              ; Reserved
13
        DCD     0                              ; Reserved
14
        DCD     SVC_Handler                    ; SVCall Handler
15
        DCD     0                              ; Reserved
16
        DCD     0                              ; Reserved
17
        DCD     PendSV_Handler                 ; PendSV Handler
18
        DCD     COMMON_IRQHandler              ; SysTick Handler
19
20
        ; External Interrupts
21
        DCD     COMMON_IRQHandler              ; Window Watchdog
22
        DCD     COMMON_IRQHandler              ; PVD through EXTI Line detect
23
        DCD     COMMON_IRQHandler              ; RTC through EXTI Line
24
        DCD     COMMON_IRQHandler              ; FLASH
25
        DCD     COMMON_IRQHandler              ; RCC
26
        DCD     COMMON_IRQHandler              ; EXTI Line 0 and 1
27
        DCD     COMMON_IRQHandler              ; EXTI Line 2 and 3
28
        DCD     COMMON_IRQHandler              ; EXTI Line 4 to 15
29
        DCD     COMMON_IRQHandler              ; TS
30
        DCD     COMMON_IRQHandler              ; DMA1 Channel 1
31
        DCD     COMMON_IRQHandler              ; DMA1 Channel 2 and Channel 3
32
        DCD     COMMON_IRQHandler              ; DMA1 Channel 4 and Channel 5
33
        DCD     COMMON_IRQHandler              ; ADC1, COMP1 and COMP2 
34
        DCD     COMMON_IRQHandler              ; TIM1 Break, Update, Trigger and Commutation
35
        DCD     COMMON_IRQHandler              ; TIM1 Capture Compare
36
        DCD     COMMON_IRQHandler              ; TIM2
37
        DCD     COMMON_IRQHandler              ; TIM3
38
        DCD     COMMON_IRQHandler              ; TIM6 and DAC
39
        DCD     0                              ; Reserved
40
        DCD     COMMON_IRQHandler              ; TIM14
41
        DCD     COMMON_IRQHandler              ; TIM15
42
        DCD     COMMON_IRQHandler              ; TIM16
43
        DCD     COMMON_IRQHandler              ; TIM17
44
        DCD     COMMON_IRQHandler              ; I2C1
45
        DCD     COMMON_IRQHandler              ; I2C2
46
        DCD     COMMON_IRQHandler              ; SPI1
47
        DCD     COMMON_IRQHandler              ; SPI2
48
        DCD     COMMON_IRQHandler              ; USART1
49
        DCD     COMMON_IRQHandler              ; USART2
50
        DCD     0                              ; Reserved
51
        DCD     COMMON_IRQHandler              ; CEC
52
        DCD     0                              ; Reserved

von Alex (Gast)


Lesenswert?

Moin,

Grüß dich & danke für die schnelle Antwort. Läuft bei mir nun auch so 
:).

schönen Gruß,
Alex

von Cartman (Gast)


Lesenswert?

> unbekannten APM32 Cortex-M0+, ohne VTOR
Die haben dann einen Bootloader im ROM und ein Firmwareblob
kuemmert sich um sowas und anderes.
Infineon hat sowas auch verbrochen. Da liegt die Vektortabelle
dann auch noch in Stein gemeisselt im ROM.

Am einfachsten und besten ist es, sowas in die Ecke zu legen
und zu warten, dass das Silizium Rost ansetzt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.