完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、三种BOOT模式的对比
CM-3 内核在离开复位状态后的工作过程如下:
上述过程由内核自动设置运行环境并执行主体程序,因此它被称为自举过程。 虽然内核是固定访问 0x00000000 和 0x00000004 地址的,但实际上这两个地址可以被重映射到其它地址空间。以 STM32F103 为例,根据芯片引出的 BOOT0 及 BOOT1 引脚的电平情况,这两个地址可以被映射到内部 FLASH、内部 SRAM以及系统存储器中。 不同的映射配置如下图: 内核在离开复位状态后会从映射的地址中取值给栈指针 MSP 及程序指针 PC,然后执行指令,我们一般以存储器的类型来区分自举过程,例如内部 FLASH 启动方式、内部SRAM 启动方式以及系统存储器启动方式。 1、内部 FLASH 启动方式
二、BOOT模式下代码运行后所在地址分析 1、从内部 FLASH 启动 BOOT0,B00T1都接低电平测试代码 int main(void) { static int m1=2, m2; int i = 1; char *p; char str[10] = "hello"; char *var1 = "123456"; char *var2 = "abcdef"; int *p1=malloc(4); int *p2=malloc(4); u16 t; u16 len; u16 times=0; free(p1); free(p2); delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //LED¶Ë¿Ú³õʼ»¯ KEY_Init(); //³õʼ»¯Óë°´¼üÁ¬½ÓµÄÓ²¼þ½Ó¿Ú while(f) { for(t=0;t USART_SendData(USART1, USART_RX_BUF[t]);//Ïò´®¿Ú1·¢ËÍÊý¾Ý while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø } printf("rnrn");//²åÈë»»ÐÐ USART_RX_STA=0; if(times%500==0) { printf("Õ»Çø-±äÁ¿µØÖ·rn"); printf(" i:%prn", &i); printf(" p:%prn", &p); printf(" str:%prn", str); printf("n¶ÑÇø-¶¯Ì¬ÉêÇëµØÖ·rn"); printf(" %prn", p1); printf(" %prn", p2); printf("rn.bss¶Îrn"); printf("nÈ«¾ÖÍⲿÎÞ³õÖµ k2£º%prn", &k2); printf("¾²Ì¬ÍⲿÎÞ³õÖµ k4£º%prn", &k4); printf("¾²Ì¬ÄÚ²¿ÎÞ³õÖµ m2£º%prn", &m2); printf("rn.data¶Îrn"); printf("nÈ«¾ÖÍⲿÓгõÖµ k1£º%prn", &k1); printf("¾²Ì¬ÍⲿÓгõÖµ k3£º%prn", &k3); printf("¾²Ì¬ÄÚ²¿ÓгõÖµ m1£º%prn", &m1); printf("rn³£Á¿Çøn"); printf("ÎÄ×Ö³£Á¿µØÖ· £º%prn",var1); printf("ÎÄ×Ö³£Á¿µØÖ· £º%prn",var2); printf("rn´úÂëÇøn"); printf("³ÌÐòÇøµØÖ· £º%pn",&main); printf("rn end rnrnrn"); } if(times%30==0)LED0=!LED0;//ÉÁ˸LED,ÌáʾϵͳÕýÔÚÔËÐÐ. delay_ms(10); f=0; } } 连接电脑和开发板 输出结果 此外,通过查询应用程序编译时产生的.map后缀文件,也可以了解程序存储到了哪些区域 打开 map 文件后,查看文件最后部分的区域,可以看到一段以“Memory Map of the image”开头的记录(若找不到可用查找功能定位) 这一段是即工程的 ROM 存储器分布映像,在 STM32芯片中,ROM 区域的内容就是指存储到内部 FLASH 的代码。 2、从内部 SRAM 启动 BOOT0 和 BOOT1 引脚均为高电平(1) 配置中断向量表
配置完成后重新编译工程,即可生成存储到 SRAM 空间地址的代码指令。 (2)修改FLASH下配置
三、总结 若使用STM32的内部SRAM存储程序,程序的执行速度与在FLASH上执行速度无异,但SRAM空间较小。若使用外部扩展的SRAM存储程序,程序空间非常大,但 STM32读取外部SRAM的速度比读取内部 FLASH 慢,这会导致程序总执行时间增加,因此在外部 SRAM中调试的程序无法完美仿真在内部FLASH运行时的环境。另外,由于STM32无法直接从外部SRAM中启动且应用程序复制到外部 SRAM的过程比较复杂(下载程序前需要使 STM32能正常控制外部SRAM),所以在很少会在STM32的外部 SRAM中调试程序。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1771 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1619 浏览 1 评论
1070 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
724 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1673 浏览 2 评论
1937浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
730浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
553浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 23:35 , Processed in 0.750927 second(s), Total 77, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号