快捷搜索:  汽车  科技

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)片内FALSH不适合运行文件系统,每个扇区空间太大,一般前面扇区作为存储程序使用,后面扇区作为文件系统,但是每个扇区128KB太大(一般SPI FLASH的扇区大小为512字节) 导致只有几个扇区,文件创建都是以扇区为单位,没有意义。可通过调用fal_blk_device_create注册一个块设备,然后可以通过open函数打开设备,进行FLASH的相关读写。0x8000000-0x80FFFFF为FLASH空间,0x20000000-0x2001BFFF为SRAM空间,其内存模型如下:通过上述的链接脚本指isr_vector段即定向量表的地址位于代码起始处,其libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\gcc\startup_stm32f407xx.s启动代码中的下图代码表明向量表的布局,与向量表图

STM32F4xx包含16个32位核心(整数)寄存器。它们被标记为R0-R15。寄存器名可以在汇编语言中以大写或小写形式出现。当寄存器在过程调用标准中具有固定角色时,使用大写。STM32F4xx支持的核心寄存器如下图:

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(1)

程序计数器(PC)是寄存器R15。它包含当前程序地址。处理器复位时,处理器用复位向量的值加载PC,该值位于0x00000004。编写汇编时需要遵循ABI规范,该规范规定了寄存器的相关用法,函数调用规范如下:

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(2)

前四个寄存器r0-r3(a1-a4)用于将参数值传递给子程序,并从函数返回结果值。它们还可用于在例程中保存中间值(但通常仅在子例程调用之间)。在一些变体中,r11(FP)可以用作帧指针。通常寄存器r4-r8、r10和r11(v1-v5、v7和v8)用于保存例程局部变量的值。

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(3)

向量表包含复位时堆栈指针的值、复位起始地址以及所有异常处理程序入口地址。在系统复位时,向量表固定在地址0x00000000。特权软件可以写入VTOR寄存器以将矢量表的起始地址重新定位到不同的内存位置,在范围0x00000080到0x3FFFFF80。

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(4)

通过上述的链接脚本指isr_vector段即定向量表的地址位于代码起始处,其libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\gcc\startup_stm32f407xx.s启动代码中的下图代码表明向量表的布局,与向量表图吻合,其处理器的执行的第一条指令为Reset_Handler函数的第一条指令。

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(5)

Reset_Handler函数主要负责把数据段搬移到SRAM和BSS段清零操作,然后跳转到SystemInit函数设置微控制器系统,初始化FPU设置、矢量表位置和外部存储器配置,最后调用entry函数进入RT-Thread内核初始化。其数据段和BSS段的起始地址和结束地址由链接脚本指定,其数据段的起始地址和结束地址变量为_sdata和_edata。BSS段的起始地址和结束地址为_sbss和_ebss。其初始化流程如下:

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(6)

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(7)

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(8)

系统采用SysTick timer (STK)做为系统时钟,默认配置每秒钟1000次tick,其定时器处理函数为SysTick_Handler。SysTick异常是系统计时器在计数达到零时产生,SysTick异常位于15号中断向量。

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(9)

0x8000000-0x80FFFFF为FLASH空间,0x20000000-0x2001BFFF为SRAM空间,其内存模型如下:

stm32rtos系统(RT-Thread操作系统及STM32F4xx体系结构详解)(10)

片内FALSH不适合运行文件系统,每个扇区空间太大,一般前面扇区作为存储程序使用,后面扇区作为文件系统,但是每个扇区128KB太大(一般SPI FLASH的扇区大小为512字节) 导致只有几个扇区,文件创建都是以扇区为单位,没有意义。可通过调用fal_blk_device_create注册一个块设备,然后可以通过open函数打开设备,进行FLASH的相关读写。

猜您喜欢: