请选择 进入手机版 | 继续访问电脑版

嵌入式作业(八):stm32汇编设计

[复制链接]
西小妹谈娱 发表于 2021-1-1 09:57:25 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
stm32汇编设计



0任务要求

  (1)
请说明STM32的三种Boot模式的差别,“C语言各种变量的存储地点”作业代码底子上,研究至少两种boot模式下,代码下载(烧录)运行后所在的地点位置,与理论对比验证。
  (2)在Keil下完成一个汇编步调的编写,学习动态调试变量;并注意观察最终生成
hex文件的各段的巨细,以及Hex文件前8个字节内容,解释其寄义。
  (3)在上面Keil 汇编底子上
  

  • 用汇编步调完成1~100 求和 (1+2+3+…+100)的步调,并将盘算效果通过串口输出;
  • 用汇编步调完成一个输出“Hello world”到串口的步调;
  • 用汇编步调完成 每隔断1秒钟闪烁一次LED的步调。
1 stm32的三种boot模式

1.1 boot模式
(此部门转载自STM32的BOOT(模式)STM32三种BOOT模式先容


  • stm32的片上存储区有3个部门:内置flash,内置sram,内置rom(system memory)这就决定了系统的启动方式有3种:从内置flash启动,从内置sram启动,从system memory启动,这三种启动方式是通过BOOT[1:0]这个两个脚来决定的。

  

  • Main Flash memory(主闪存存储器):
    是STM32内置的Flash,一般我们使用JTAG大概SWD模式下载步调时,就是下载到这个里面,重启后也直接从这启动步调。
  

  • System memory(系统存储器):
    从系统存储器启动,这种模式启动的步调功能是由厂家设置的。一般来说,这种启动方式用的比力少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP步调,这是stm32的内置rom。出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载步调,因为在厂家提供BootLoader中,提供了串口下载步调的固件,可以通过这个BootLoader将步调下载到系统的Flash中。
  

  • Embedded Memory: 内置SRAM,既然是SRAM,自然也就没有步调存储的本事了,这个模式一般用于步调调试。如果我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比力的费时,可以思量从这个模式启动代码(也就是STM32的内存中),用于快速的步调调试,等步调调试完成后,在将步调下载到SRAM中。


  • 在系统上电的时候,cpu首先根据这两个脚来确定是哪种模式的启动,然后就是把相应模式的起始地点映射到0地点处,并从0地点处开始执行。
1.2 实例
(1)keil步调
keil步调是接纳前面“C语言各种变量的存储地点”这一作业的串口通信步调,这里不再详细说明
  1. while(zxx){        if(USART_RX_STA&0x8000)        {                                   len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È                printf("\r\nhello windows!:\r\n\r\n");                for(t=0;t=10) {zxx=0;break;}}                                                                for(t=0;tNew uVision Project:
  2. [align=center][img]https://img-blog.csdnimg.cn/20201230112408295.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzAxNjQz,size_16,color_FFFFFF,t_70[/img][/align]在弹出的窗口分别设置;
  3. </ul> [indent]  
  4. [list]
  5. [*]设置项目工程的路径;
  6. [*]设置项目工程的名称,这里使用a;
  7. [*]点击生存;
  8. [/list] [/indent] [align=center][img]https://img-blog.csdnimg.cn/20201230112816826.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzAxNjQz,size_16,color_FFFFFF,t_70[/img][/align]
  9. [b]2.2设置情况[/b]
  10. (1)选择设备
  11. [align=center][img]https://img-blog.csdnimg.cn/20201230112857884.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzAxNjQz,size_16,color_FFFFFF,t_70[/img][/align]
  12. (2)选择运行情况
  13. [list]
  14. [*]ARM的CMSIS已经把开辟所需要的软件组件都封装好了,因此直接选择即可;
  15. [/list] [indent]  CMSIS下选择CORE; Device下Startup,此中包罗了启动文件;
  16. [align=center][img]https://img-blog.csdnimg.cn/20201230113151714.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzAxNjQz,size_16,color_FFFFFF,t_70[/img][/align]
  17. [/indent] (3) 添加源文件
  18. [align=center][img]https://img-blog.csdnimg.cn/20201230113421475.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzAxNjQz,size_16,color_FFFFFF,t_70[/img][/align]
  19. [align=center][img]https://img-blog.csdnimg.cn/20201230113520129.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzAxNjQz,size_16,color_FFFFFF,t_70[/img][/align]
  20. [b]2.3 测试代码[/b]
  21. (1) 源码
  22. [list]
  23. [*]编译并调试如下代码;
  24. [/list] [code] AREA MYDATA, DATA         AREA MYCODE, CODE        ENTRY        EXPORT __main__main        MOV R0, #10        MOV R1, #11        MOV R2, #12        MOV R3, #13        ;LDR R0, =func01        BL        func01        ;LDR R1, =func02        BL        func02                BL         func03        LDR LR, =func01        LDR PC, =func03        B .                func01        MOV R5, #05        BX LR        func02        MOV R6, #06        BX LR        func03        MOV R7, #07        MOV R8, #08                BX LR
复制代码
(2) 仿真器设置




  • 根据自己的硬件选择,乐成后如下图:

(3) 编译调试


  • 编译(左),调试(右)

  • 调试完成,代码正确

3 汇编步调

led闪烁:
  用汇编步调完成 每隔断1秒钟闪烁一次LED的步调。
参考自
  1. LED0 EQU 0x422101a0 (0x40011004)RCC_APB2ENR EQU 0x40021018GPIOA_CRH EQU 0x40010804Stack_Size      EQU     0x00000400                AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_Mem       SPACE   Stack_Size__initial_sp                AREA    RESET, DATA, READONLY__Vectors       DCD     __initial_sp               ; Top of Stack                DCD     Reset_Handler              ; Reset Handler                                                        AREA    |.text|, CODE, READONLY                                    THUMB                REQUIRE8                PRESERVE8                                    ENTRYReset_Handler                 BL LED_InitMainLoop        BL LED_ON                BL Delay                BL LED_OFF                BL Delay                                B MainLoop             LED_Init                PUSH {R0,R1, LR}                                LDR R0,=RCC_APB2ENR                ORR R0,R0,#0x04                LDR R1,=RCC_APB2ENR                STR R0,[R1]                                LDR R0,=GPIOA_CRH                BIC R0,R0,#0x0F                LDR R1,=GPIOA_CRH                STR R0,[R1]                                LDR R0,=GPIOA_CRH                ORR R0,R0,#0x03                LDR R1,=GPIOA_CRH                STR R0,[R1]                                MOV R0,#1                 LDR R1,=LED0                STR R0,[R1]                             POP {R0,R1,PC}             LED_ON                PUSH {R0,R1, LR}                                    MOV R0,#0                 LDR R1,=LED0                STR R0,[R1]                             POP {R0,R1,PC}             LED_OFF                PUSH {R0,R1, LR}                                    MOV R0,#1                 LDR R1,=LED0                STR R0,[R1]                             POP {R0,R1,PC}                          Delay                PUSH {R0,R1, LR}                                MOVS R0,#0                MOVS R1,#0                MOVS R2,#0                DelayLoop0                        ADDS R0,R0,#1                CMP R0,#330                BCC DelayLoop0                                MOVS R0,#0                ADDS R1,R1,#1                CMP R1,#330                BCC DelayLoop0                MOVS R0,#0                MOVS R1,#0                ADDS R2,R2,#1                CMP R2,#15                BCC DelayLoop0                                                POP {R0,R1,PC}                     ;         NOP             END
复制代码


  • 下载运行

4 总结

这次实验主要学习了三种不同的boot模式,另有汇编步调的基本语法,及如何用汇编步调写出简朴的小步调。

来源:https://blog.csdn.net/qq_44701643/article/details/111830228
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )