找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 928|回复: 3
打印 上一主题 下一主题
收起左侧

关于stm32 内存地址和位带别名计算

[复制链接]
跳转到指定楼层
楼主

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2023-5-3 14:59 | 只看该作者
位带就是个鸡肋,食之无味弃之可惜。8051体系太落后了,RAM太小,一个字节要掰成8个位来用。ARM的位带,为了节约1个字节的7个位,只操作1个位,需要32个位地址空间,实在是没意义。
回复

使用道具 举报

板凳
ID:73992 发表于 2023-5-4 16:34 | 只看该作者
Hephaestus 发表于 2023-5-3 14:59
位带就是个鸡肋,食之无味弃之可惜。8051体系太落后了,RAM太小,一个字节要掰成8个位来用。ARM的位带,为 ...

51单片机子程序以  loop......  ........ ret 或者 reti 结束   stm32有的 以 MOV PC,LR结束, 但多个子程序编译时候会警告。还有以PROC ENDP 结尾的。还有BX LR 结尾的。
请问有没有标准的通用格式。上图是12864仿真,程序在箭头的位置死循环,以下是代码。

  1. *************12864亮屏程序 stm32f103c8t6*************************
  2. *************************************************************************
  3. *12864_RS位A10,ODR位带别名                0X422101A8                              
  4. *12864_RW位A09,ODR位带别名                0X422101A4
  5. *12864_EN位A08,ODR位带别名                0X422101A0
  6. *12864_BUSY_BIT        位GPIOA_IDR07  别名        0X4221011C        忙标志位
  7. *RCC_APB2ENR地址 0X40021018
  8. *GPIOA_CRL地址        0X40010800
  9. *GPIOA_CRH地址        0X40010804
  10. *GPIOA_ODR地址        0X4001080C
  11. *GPIOA_IDR地址        0X40010808
  12. *GPIOA_00地址        0X42210180
  13. *
  14. *
  15. *************************************************************************
  16. RCC_APB2ENR        EQU        0X40021018
  17. GPIOA_CRL        EQU        0X40010800
  18. GPIOA_CRH        EQU        0X40010804
  19. GPIOA_ODR        EQU        0X4001080C
  20. LCD12864_RS        EQU        0X422101A8
  21. LCD12864_RW        EQU        0X422101A4
  22. LCD12864_EN        EQU        0X422101A0      
  23. LCD12864_BUSY_BIT        EQU                0X4221011C
  24. GPIOA_00        EQU        0X42210180
  25.         AREA        ICODE,CODE
  26.         ENTRY
  27.         EXPORT        __main
  28. __main
  29.         BL        SYSTEM_BIOS                        ;调用系统设置
  30.         BL        LCD12864INIT                ;调用屏幕初始化
  31.         MOV        R3,#0X80                        ;12864第一格
  32.         BL        LCD12864WRITE_CMD        ;
  33.         MOV        R4,#0X41                        ;显示字符A


  34. LOOP        B        LOOP




  35. *************系统设置子程序********************
  36. SYSTEM_BIOS      
  37.         LDR        R0,=RCC_APB2ENR                ;打开RCC_APB2ENR
  38.         MOV        R1,#0X0000000C                ;打开GPIOA时钟
  39.         STR        R1,[R0]                              
  40.       
  41.         LDR        R0,=GPIOA_CRL                ;设置GPIOA低8位为输出
  42.         MOV        R1,#0X33333333               
  43.         STR        R1,[R0]
  44.       
  45.         LDR        R0,=GPIOA_CRH                ;设置GPIOA_08_09_10为输出
  46.         MOV        R1,#0X00000333               
  47.         STR        R1,[R0]
  48.       
  49.         LDR        R0,=LCD12864_EN                ;设置12864_EN为0
  50.         MOV        R1,#0               
  51.         STR        R1,[R0]
  52.       
  53.         BX LR                        ;子程序返回语句
  54. SYSTEM_BIOS_END                                ;返回




  55. *************LCD12864初始化子程序********************
  56. LCD12864INIT      
  57.         MOV        R3,#0X38
  58.         BL        LCD12864WRITE_CMD
  59.         MOV        R3,#0X38
  60.         BL        LCD12864WRITE_CMD
  61.         MOV        R3,#0X0C
  62.         BL        LCD12864WRITE_CMD
  63.         MOV        R3,#0X06
  64.         BL        LCD12864WRITE_CMD
  65.         MOV        R3,#0X01
  66.         BL        LCD12864WRITE_CMD
  67.         BX LR
  68. LCD12864INIT_END


  69. *************LCD12864读状态孙程序********************
  70. LCD12864_BUSY      


  71.         LDR        R0,=LCD12864_EN                ;EN=0
  72.         MOV        R1,#0               
  73.         STR        R1,[R0]
  74.       
  75.         LDR        R0,=LCD12864_RS                ;RS=0
  76.         MOV        R1,#0               
  77.         STR        R1,[R0]


  78.         LDR        R0,=LCD12864_RW                ;RW=1
  79.         MOV        R1,#1               
  80.         STR        R1,[R0]
  81.       
  82.         LDR        R0,=LCD12864_EN                ;EN=1
  83.         MOV        R1,#1               
  84.         STR        R1,[R0]
  85.       
  86. LCD12864_BUSY1


  87.         LDR        R0,=LCD12864_BUSY_BIT               
  88.         LDR        R1,[R0]                                ;读标志
  89.       
  90.         MOVS        R0,R1                        ;显示标志到APSR
  91.         BNE        LCD12864_BUSY1                ;标志判断,为0重新则读取
  92.       
  93.         LDR        R0,=LCD12864_EN                ;EN=0
  94.         MOV        R1,#0               
  95.         STR        R1,[R0]
  96.       
  97.         ;LDR        R0,=GPIOA_00                ;GPIOA00=1
  98.         ;MOV        R1,#1               
  99.         ;STR        R1,[R0]
  100.       
  101.         BX LR                ;子程序返回语句               
  102. LCD12864__BUSY_END      




  103. *************LCD12864写指令子程序********************
  104. LCD12864WRITE_CMD                        ;R3作为指令传递      
  105.         LDR        R0,=LCD12864_EN                ;EN=0
  106.         MOV        R1,#0               
  107.         STR        R1,[R0]
  108.       
  109.         BL        LCD12864_BUSY                ;调用判忙程序
  110.       
  111.         LDR        R0,=LCD12864_RS                ;RS=0
  112.         MOV        R1,#0               
  113.         STR        R1,[R0]


  114.         LDR        R0,=LCD12864_RW                ;RW=0
  115.         MOV        R1,#0               
  116.         STR        R1,[R0]
  117.       
  118.         LDR        R0,=LCD12864_EN                ;EN=1
  119.         MOV        R1,#1               
  120.         STR        R1,[R0]
  121.       
  122.         LDR        R0,=GPIOA_ODR                ;
  123.         LDR        R1,[R0]                                ;取出ODR值
  124.         LDR        R2,=0X0000FF00
  125.         AND        R1,R2                                ;ODR低八位置0
  126.         ORR        R3,R1                                ;GPIOA高八位写入R3
  127.         STR        R3,[R0]                                ;指令写入显示屏
  128.       
  129.         LDR        R0,=LCD12864_EN                ;EN=0
  130.         MOV        R1,#0               
  131.         STR        R1,[R0]
  132.       
  133.         BX LR;子程序返回语句
  134. LCD12864WRITE_CMD_END      
  135.       
  136. *************LCD12864写数据孙程序********************
  137. LCD12864WRITE_DAT                        ;R4作为数据传递
  138.         LDR        R0,=LCD12864_EN                ;EN=0
  139.         MOV        R1,#0               
  140.         STR        R1,[R0]
  141.       
  142.         BL        LCD12864_BUSY                ;调用判忙
  143.       
  144.         LDR        R0,=LCD12864_RS                ;RS=1
  145.         MOV        R1,#1               
  146.         STR        R1,[R0]


  147.         LDR        R0,=LCD12864_RW                ;RW=0
  148.         MOV        R1,#0               
  149.         STR        R1,[R0]
  150.       
  151.         LDR        R0,=LCD12864_EN                ;EN=1
  152.         MOV        R1,#1               
  153.         STR        R1,[R0]
  154.       
  155.         LDR        R0,=GPIOA_ODR                ;
  156.         LDR        R1,[R0]                                ;取出ODR值
  157.         LDR        R2,=0X0000FF00
  158.         AND        R1,R2                                ;ODR低八位置0
  159.         ORR        R4,R1                                ;GPIOA高八位写入R3
  160.         STR        R4,[R0]                                ;数据写入显示屏
  161.       
  162.         LDR        R0,=LCD12864_EN                ;EN=0
  163.         MOV        R1,#0               
  164.         STR        R1,[R0]
  165.       
  166.         BX LR                                ;子程序返回语句
  167. LCD12864WRITE_DAT_END      
  168.         END
  169.                
复制代码


回复

使用道具 举报

地板
ID:883242 发表于 2023-5-5 17:16 | 只看该作者
知道你什么意思了,你以为汇编语言是一门“语言”,学会了一门就可以融会贯通学会别的了,你的理解完全错误。

汇编只是机器码助记符的汇集、组合。在不同平台上面,二进制机器码完全不一样,自然汇编也就完全不一样。你天真的以为学了51汇编就能整ARM汇编,事实却是,你学的51汇编对你学ARM汇编不但没有任何帮助,反而会起到反作用。正确的做法是完全忘掉以前你学的汇编,从头开始虚心的学习新的一个指令体系。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表