2024年5月28日发(作者:昌明)
STM8启动流程
流程
说明:原创文章,转载请注明出处。
STM8启动过程:
1)首先bootloader(ROM中)从0x6000地址启动。
2)从bootloader跳转到0x8000(内部FLASH起始地址),0x8000后面才是软件设计
可以控制的。很多人不明白的是stm8库里面提供的相关代码,具体流程如下:
a)中断向量表:大家都知道0x8000地址放的是中断函数的地址,而‘0x82’则是stm8
内部的中断指令。程序执行到这会自动跳转到中断向量地址所在函数。
b)mian函数到底从哪开始?
这也许是大家最纳闷的了,起始原来很简单:关键是stm8有个复位中断,定义
在
stm8_interrupt_vector.c中:
(void @near (*)())0x8200,
_stext, /* RESET */”
1.
2.
3.
4.
5.
6.
7.
8.
9.
extern void @near _stext(); /* startup routine */
void @near (* const _vectab[])() =
{
(void @near (*)())0x8200,
_stext, /* RESET */
(void @near (*)())0x8200,
TRAP_IRQHandler, /* TRAP ‐ Software interrupt */
10.
11. (void @near (*)())0x8200,
12. TLI_IRQHandler, /* irq0 ‐ External Top Level interrupt (TLI) */
13.
14. (void @near (*)())0x8200,
15. AWU_IRQHandler, /* irq1 ‐ Auto Wake Up from Halt interrupt */
16. (void @near (*)())0x8200,
17. CLK_IRQHandler, /* irq2 ‐ Clock Controller interrupt */
18. (void @near (*)())0x8200,
19. EXTI_PORTA_IRQHandler, /* irq3 ‐ External interrupt 0 (GPIOA) */
20. (void @near (*)())0x8200,
21. EXTI_PORTB_IRQHandler, /* irq4 ‐ External interrupt 1 (GPIOB) */
22. (void @near (*)())0x8200,
23. EXTI_PORTC_IRQHandler, /* irq5 ‐ External interrupt 2 (GPIOC) */
24. (void @near (*)())0x8200,
25. EXTI_PORTD_IRQHandler, /* irq6 ‐ External interrupt 3 (GPIOD) */
26. (void @near (*)())0x8200,
27. EXTI_PORTE_IRQHandler, /* irq7 ‐ External interrupt 4 (GPIOE) */
28.
29. #ifdef STM8S208
30. (void @near (*)())0x8200,
31. CAN_RX_IRQHandler, /* irq8 ‐ CAN Rx interrupt */
32. (void @near (*)())0x8200,
33. CAN_TX_IRQHandler, /* irq9 ‐ CAN Tx/ER/SC interrupt */
34.
35. #elif defined (STM8S903)
36. (void @near (*)())0x8200,
37. EXTI_PORTF_IRQHandler, /* irq8 ‐ External interrupt 5 (GPIOF) */
38. (void @near (*)())0x8200,
39. NonHandledInterrupt, /* irq9 ‐ Reserved */
40. #else /*STM8S207, STM8S105 or STM8S103*/
41. (void @near (*)())0x8200,
42. NonHandledInterrupt, /* irq8 ‐ Reserved */
43. (void @near (*)())0x8200,
44. NonHandledInterrupt, /* irq9 ‐ Reserved */
45. #endif /*STM8S208*/
46. (void @near (*)())0x8200,
47. SPI_IRQHandler, /* irq10 ‐ SPI End of transfer interrupt */
48. (void @near (*)())0x8200,
49. TIM1_UPD_OVF_TRG_BRK_IRQHandler, /* irq11 ‐ TIM1
Update/Overflow/Trigger/Break interrupt */
2024年5月28日发(作者:昌明)
STM8启动流程
流程
说明:原创文章,转载请注明出处。
STM8启动过程:
1)首先bootloader(ROM中)从0x6000地址启动。
2)从bootloader跳转到0x8000(内部FLASH起始地址),0x8000后面才是软件设计
可以控制的。很多人不明白的是stm8库里面提供的相关代码,具体流程如下:
a)中断向量表:大家都知道0x8000地址放的是中断函数的地址,而‘0x82’则是stm8
内部的中断指令。程序执行到这会自动跳转到中断向量地址所在函数。
b)mian函数到底从哪开始?
这也许是大家最纳闷的了,起始原来很简单:关键是stm8有个复位中断,定义
在
stm8_interrupt_vector.c中:
(void @near (*)())0x8200,
_stext, /* RESET */”
1.
2.
3.
4.
5.
6.
7.
8.
9.
extern void @near _stext(); /* startup routine */
void @near (* const _vectab[])() =
{
(void @near (*)())0x8200,
_stext, /* RESET */
(void @near (*)())0x8200,
TRAP_IRQHandler, /* TRAP ‐ Software interrupt */
10.
11. (void @near (*)())0x8200,
12. TLI_IRQHandler, /* irq0 ‐ External Top Level interrupt (TLI) */
13.
14. (void @near (*)())0x8200,
15. AWU_IRQHandler, /* irq1 ‐ Auto Wake Up from Halt interrupt */
16. (void @near (*)())0x8200,
17. CLK_IRQHandler, /* irq2 ‐ Clock Controller interrupt */
18. (void @near (*)())0x8200,
19. EXTI_PORTA_IRQHandler, /* irq3 ‐ External interrupt 0 (GPIOA) */
20. (void @near (*)())0x8200,
21. EXTI_PORTB_IRQHandler, /* irq4 ‐ External interrupt 1 (GPIOB) */
22. (void @near (*)())0x8200,
23. EXTI_PORTC_IRQHandler, /* irq5 ‐ External interrupt 2 (GPIOC) */
24. (void @near (*)())0x8200,
25. EXTI_PORTD_IRQHandler, /* irq6 ‐ External interrupt 3 (GPIOD) */
26. (void @near (*)())0x8200,
27. EXTI_PORTE_IRQHandler, /* irq7 ‐ External interrupt 4 (GPIOE) */
28.
29. #ifdef STM8S208
30. (void @near (*)())0x8200,
31. CAN_RX_IRQHandler, /* irq8 ‐ CAN Rx interrupt */
32. (void @near (*)())0x8200,
33. CAN_TX_IRQHandler, /* irq9 ‐ CAN Tx/ER/SC interrupt */
34.
35. #elif defined (STM8S903)
36. (void @near (*)())0x8200,
37. EXTI_PORTF_IRQHandler, /* irq8 ‐ External interrupt 5 (GPIOF) */
38. (void @near (*)())0x8200,
39. NonHandledInterrupt, /* irq9 ‐ Reserved */
40. #else /*STM8S207, STM8S105 or STM8S103*/
41. (void @near (*)())0x8200,
42. NonHandledInterrupt, /* irq8 ‐ Reserved */
43. (void @near (*)())0x8200,
44. NonHandledInterrupt, /* irq9 ‐ Reserved */
45. #endif /*STM8S208*/
46. (void @near (*)())0x8200,
47. SPI_IRQHandler, /* irq10 ‐ SPI End of transfer interrupt */
48. (void @near (*)())0x8200,
49. TIM1_UPD_OVF_TRG_BRK_IRQHandler, /* irq11 ‐ TIM1
Update/Overflow/Trigger/Break interrupt */