Cortex-M内核学习
资料¶
- Cortex-M处理器入门
- https://zh-cn.manuals.plus/_st/cortex-m0-plus-microcontrollers-manual
- https://github.com/JayHeng/cortex-m-spec
内核对比¶

存储器映射¶
Cortex-M0(+) 处理器的 4G 存储空间从架构上被分为多个区域。总的被分成 8 大部分,每个部分 512M。

虽然映射已经被架构预先定义,但是实际分配却是很灵活的。 1. 代码区域 (0x0000 0000~0x1FFF FFFF) 512M,主要用于存储代码 2. SRAM区域 (0x2000 0000~0x3FFF FFFF) 512M,主要用于数据存储 3. 外设区域 (0x4000 0000~0x5FFF FFFF) 512M,主要用于外设及数据存储。不允许执行程序 4. RAM区域 (0x6000 0000~0x9FFF FFFF) 1GB,外部RAM区域,由两个512M区域组成 5. 设备区域 (0xA000 0000~0xDFFF FFFF) 1GB,由两个512M组成。属性不同。主要用于外设和IO口,不允许程序执行,但是可以用作通用数据存储。 6. 内部私有总线区域(0xE000 0000~0xE00F FFFF) 1MB。用于处理器内部的外设,包括中断控制器NVIC和调试部件,还有systick。不允许程序执行。 7. 保留存储器空间 (0xE010 0000~0xFFFF FFFF) 511M用于保留。

上图为基于Cortex-M0+的stm32L053的存储器映射图。我们可以看到基本是与Cortex-M0内核是符合的。但是具体的分配具有很大的灵活性。
片上FLASH在 0x08000000,SRAM在 0x20000000。
IO口在 0x50000000 - 0x50001FFF,占用了8K。
APB1上的器件基地址为0x4000 0000; APB2上的外设基地址为0x4001 0000; AHB上的外设基地址为 0x4002 0000。
时钟系统¶


F0 的时钟树

- HSI,高速内部时钟
- HSE,高速外部时钟
- LSI,低速内部时钟
- LSE,低速外部时钟
向量表¶
向量表是存储在闪存中的地址表,用于存储中断处理程序的入口地址。向量表通常位于闪存的起始位置,在复位时被加载到内存中。向量表中的每个条目都指向一个中断处理程序,当相应的中断发生时,处理器会跳转到该地址并执行中断处理程序。
; Vector Table Mapped to Address 0 at Reset-------------------------------------
AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors DCD __initial_sp ; 0, load top of stack
DCD Reset_Handler ; 1, reset handler
DCD NMI_Handler ; 2, nmi handler
DCD HardFault_Handler ; 3, hard fault handler
DCD 0 ; 4, Reserved
DCD 0 ; 5, Reserved
DCD 0 ; 6, Reserved
DCD 0 ; 7, Reserved
DCD 0 ; 8, Reserved
DCD 0 ; 9, Reserved
DCD 0 ; 10, Reserved
DCD SVCall_Handler ; 11, svcall handler
DCD 0 ; 12, Reserved
DCD 0 ; 13, Reserved
DCD PendSV_Handler ; 14, pendsv handler
DCD SysTick_Handler ; 15, systick handler
; External Interrupts
DCD EXTI_IRQHandler ; irq0 EXTI
DCD WWDG_IRQHandler ; irq1 WWDG
DCD AON_WKUP_IRQHandler ; irq2 APB2AON Wakeup
DCD BLE_IRQHandler ; irq3 BLE Combined
DCD RTC_IRQHandler ; irq4 RTC
DCD DMAC_IRQHandler ; irq5 DMAC
DCD QSPI_IRQHandler ; irq6 QSPI
DCD 0 ; irq7 Reserved
DCD CRYPT_IRQHandler ; irq8 CRYPT
DCD BOD_IRQHandler ; irq9 BOD
DCD IWDG_IRQHandler ; irq10 IWDG
DCD 0 ; irq11 Reserved
DCD 0 ; irq12 Reserved
DCD BLE_WKUP_IRQHandler ; irq13 BLE Wakeup
DCD 0 ; irq14 Reserved
DCD ATMR_IRQHandler ; irq15 Advance Timer
DCD BTMR_IRQHandler ; irq16 Base Timer
DCD CTMR2_IRQHandler ; irq17 Common Timer2
DCD CTMR1_IRQHandler ; irq18 Common Timer1
DCD 0 ; irq19 Reserved
DCD 0 ; irq20 Reserved
DCD CTMR3_IRQHandler ; irq21 Common Timer3
DCD LTMR_IRQHandler ; irq22 Lowpower Timer
DCD I2C1_IRQHandler ; irq23 I2C1
DCD 0 ; irq24 Reserved
DCD SPI1_IRQHandler ; irq25 SPI1
DCD SPI2_IRQHandler ; irq26 SPI2
DCD UART1_IRQHandler ; irq27 UART1
DCD UART2_IRQHandler ; irq28 UART2
DCD 0 ; irq29 Reserved
DCD SUART1_IRQHandler ; irq30 SUART1
DCD 0 ; irq31 Reserved
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
上面向量表长度 16+32 = 48
上电启动,把向量表拷贝到 sram 起始地址