stm32 学习困惑
发布网友
发布时间:2022-05-05 02:36
我来回答
共2个回答
热心网友
时间:2022-06-28 16:35
因为STM32设计的Flash起始地址是在0x0800 0000位置开始的。全部代码都只能在从这里开始存储。详见STM32 referenc manual手册第54页。
那既然从这里才能存储代码,就必须在MDK里设置Flash地址为0x0800 0000,下面是MDK设置页面,这个应该都看到过:
这样就还有一个问题,理论上,CM3中规定上电后CPU是从0地址开始执行,但是这里中断向量表却被烧写在0x0800 0000地址里,这是因为STM32的Flash是从0x0800 0000开始才有。但SMT32也不能破坏ARM定下的“规矩”,所以它做了一个启动映射的过程,就是和芯片上总能见到的BOOT0和BOOT1有关了,当选择从主Flash启动模式后,芯片一上电,Flash的0x0800 0000地址被映射到0地址处,不影响CM3内核的读取,所以这时的CM3既可以在0地址处访问中断向量表,也可以在0x0800 0000地址处访问中断向量表,而代码还是在0x0800 0000地址处存储的。这就是最难理解的地方,其实,这是基本上所有ARM芯片采用的启动映射方法。ARM7,ARM9没有内部Flash的通常都是这样做的。这个过程出自STM32 referenc manual手册,里面是有说明的:
还要注意,这个中断向量表是可以在程序中再次被映射的。控制它的就是CM3已经规定的NVIC寄存器SCB->VTOR。在STM32库中给出的启动代码里,startup_stm32f10x_hd.s文件里,第146行,是上电后读取中断向量表中的复位中断位置,并执行复位中断处理代码,代码如下:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
注意复位后第一个被执行的是SystemInit代码,这个代码在库目录下的system_stm32f10x.c文件里,它初始化了时钟,NVIC等一系列操作,这里摘要与中断向量有关的代码:
void SystemInit (void)
{
......
#ifdef VECT_TAB_SRAM
SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */
#else
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */
#endif
}
可以看出中断向量重映射是一个选择性编译,通常宏定义VECT_TAB_SRAM都没有被定义,所以这里执行结束后,SCB->VTOR就是FLASH_BASE了,值为0x0800 0000。以后CM3再取中断向量里,就会根据SCB->VTOR的设置,从这里取向量执行了。中断向量自此终于转正。
注意这时连__main函数都还没进,看起来中断向量的重映射位置还是够早的。
热心网友
时间:2022-06-28 16:36
正点原子的IAP例程,应该能帮到你一点。
STM32的内部闪存(FLASH)地址起始于0x08000000,一般情况下,程序文件就从此地
址开始写入。此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张“中断向量表”
来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成
启动,而这张“中断向量表”的起始地址是0x08000004,当中断来临,STM32的内部硬件机
制亦会自动将PC指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断
服务程序。
在图53.1.1中,STM32在复位后,先从0X08000004地址取出复位中断向量的地址,并跳
转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到我们的
main函数,如图标号②所示;而我们的main函数一般都是一个死循环,在main函数执行过程
中,如果收到中断请求(发生重中断),此时STM32强制将PC指针指回中断向量表处,如图
标号③所示;然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中断服
务程序以后,程序再次返回main函数执行,如图标号⑤所示。
stm32 学习困惑
这个过程出自STM32 referenc manual手册,里面是有说明的:还要注意,这个中断向量表是可以在程序中再次被映射的。控制它的就是CM3已经规定的NVIC寄存器SCB->VTOR。在STM32库中给出的启动代码里,startup_stm32f10x_hd.s文件里,第146行,是上电后读取中断向量表中的复位中断位置,并执行复位中断处理代...
STM32F103,了解一下?
STM32F103是一款高性能的嵌入式芯片,由意法半导体(STMicroelectronics)公司生产。它是STM32系列芯片之一,具有紧凑、低功耗、高性能等特点,被广泛应用于嵌入式系统中。STM32F103的主要特点包括:1. 集成了ARM Cortex-M3内核,主频高达72MHz。2. 内置IO口和存储器接口,便于与外部器件进行通信和控制。3. 支持外部时钟和复位功能,可通过端口配置实现其他功能。4. 具有容忍5V电压的能力,适用于较宽的工作电压范围。5. 内置看门狗定时器和电源管理单元,可提高系统的稳定性和功耗效率。6. 支持多种外设接口,如ADC、DAC、UART、SPI等。7. 集成了…STM32是ARM Cortex内核单片机和微处理器市场和技术方面的佼佼者,目前提供16大产品线 (F0, G0, F1, F2, F3, G4, F4, F7, H7, MP1, L0, L1, L4, L4+,L5, WB),超过1000个型号。STM32产品广泛应用于工业控制、消费电子、物联网、通讯设备、医疗服...
关于程序是怎样在STM32里运行的,有点困惑
计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。一般计算机进行工作时,首先要通过外部设备把程序和数据通过输入接口电路和数据总线送入到存储器,然后逐条取出执行。但单片机中的程序一般事先我们都已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行...
一个计算机专业,嵌入式方向学生的疑惑。
关于选择方向,仁者见仁,智者见智,我还是比较偏向ARM方面(STM32使用的是ARM内核),应用范围广。DSP主要在数字处理方面应用多。有什么问题。可以追问我。
STM32的SysTick内设以及中断查询响应的深层次原理的困惑
“单片机每次扫描是否响应中断也会浪费时间”这是由独立的NVIC单元实现的,不影响内核中其它单元的工作。NVIC单元与处理器内核是紧密耦合的,其触发信号直接相连,是个位数纳秒级的延迟,所以不存在你所说的这种情况。
普通大学大三学生困惑,具体如题。科研 竞赛 发文章
所以在这方面,我的理解是,你可以不发文章,但在内涵上要有足够的水平和独到见解。2、你如果有时间,我觉得你可以做一些控制类的课题,哪怕是一些小课题,比如玩单片机如STM8,STM32等,这对你的经验和能力的提升很有好处,而且这东西很实用,以后对工作也有帮助。如果水平高,也可以参加一些比如电子...
8位和32位单片机变量占多少字节?
在Keil MDK配合STM32的测试中,我们同样针对数据占用大小进行了验证:char类型的变量仍旧占用1字节,这个结果可能让一些人感到困惑,因为它与32位系统下字节对齐规则有所不同。实际上,对于char而言,仅占用第一个字节,这是因为32位处理器以4字节为单位进行存储和对齐。短类型(short)数据同样占用2字节。
STM32f103C8T6的优势和作用是什么?
在使用STM32F103C8T6的过程中,用户会发现其拥有丰富且详细的资料教程。无论是对固件库的概念感到困惑,还是遇到特定问题,都能在网上找到详尽的答案。这种资源的丰富性降低了学习门槛,极大地提升了产品开发效率。这款单片机的稳定性与高性价比在市场中赢得了广泛认可。尽管早期价格较低,但近年来价格逐渐...
stm32这两种初始化有什么不同 GPIO_Init,GPIO_StructInit,各位路过的看...
param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that contains the configuration information for the specified GPIO peripheral.retval None / void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct){ uint32_t currentmode = 0x00, currentpin = 0x00, pinpos...
...If you're trying to connect to an STM32W1xx device,please解决办...
首先,若问题依旧存在,检查目标设置中"Hard"是否已更改为"Soft",但此方法并未解决我的问题。接着,确保正确连接单片机与ST-LINK工具,蓝色线缆应连接至单片机的GND端。随后,使用STM32 ST-LINK Utility工具进行连接。若对工具使用感到困惑,可以参考之前提供的链接以获取具体操作指南。遵循上述步骤后,...
嵌入式杂谈之中断向量表
理解了中断向量表,我们能看到汇编在嵌入式开发中的重要性,尤其是对于bootloader和某些定制函数。例如,STM32的启动文件也包含中断向量表设置,尽管细节可能有所不同。通过研究这些细节,我们不仅能掌握基本操作,还能应对更复杂的应用场景。总的来说,中断向量表是嵌入式开发中不可或缺的一部分,它揭示了...