找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1515|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

關(guān)于stm32 內(nèi)存地址和位帶別名計算

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:73992 發(fā)表于 2023-5-3 13:55 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:883242 發(fā)表于 2023-5-3 14:59 | 只看該作者
位帶就是個雞肋,食之無味棄之可惜。8051體系太落后了,RAM太小,一個字節(jié)要掰成8個位來用。ARM的位帶,為了節(jié)約1個字節(jié)的7個位,只操作1個位,需要32個位地址空間,實在是沒意義。
回復(fù)

使用道具 舉報

板凳
ID:73992 發(fā)表于 2023-5-4 16:34 | 只看該作者
Hephaestus 發(fā)表于 2023-5-3 14:59
位帶就是個雞肋,食之無味棄之可惜。8051體系太落后了,RAM太小,一個字節(jié)要掰成8個位來用。ARM的位帶,為 ...

51單片機子程序以  loop......  ........ ret 或者 reti 結(jié)束   stm32有的 以 MOV PC,LR結(jié)束, 但多個子程序編譯時候會警告。還有以PROC ENDP 結(jié)尾的。還有BX LR 結(jié)尾的。
請問有沒有標(biāo)準的通用格式。上圖是12864仿真,程序在箭頭的位置死循環(huán),以下是代碼。

  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        忙標(biāo)志位
  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                        ;調(diào)用系統(tǒng)設(shè)置
  30.         BL        LCD12864INIT                ;調(diào)用屏幕初始化
  31.         MOV        R3,#0X80                        ;12864第一格
  32.         BL        LCD12864WRITE_CMD        ;
  33.         MOV        R4,#0X41                        ;顯示字符A


  34. LOOP        B        LOOP




  35. *************系統(tǒng)設(shè)置子程序********************
  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                ;設(shè)置GPIOA低8位為輸出
  42.         MOV        R1,#0X33333333               
  43.         STR        R1,[R0]
  44.       
  45.         LDR        R0,=GPIOA_CRH                ;設(shè)置GPIOA_08_09_10為輸出
  46.         MOV        R1,#0X00000333               
  47.         STR        R1,[R0]
  48.       
  49.         LDR        R0,=LCD12864_EN                ;設(shè)置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讀狀態(tài)孫程序********************
  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]                                ;讀標(biāo)志
  89.       
  90.         MOVS        R0,R1                        ;顯示標(biāo)志到APSR
  91.         BNE        LCD12864_BUSY1                ;標(biāo)志判斷,為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                ;調(diào)用判忙程序
  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寫數(shù)據(jù)孫程序********************
  137. LCD12864WRITE_DAT                        ;R4作為數(shù)據(jù)傳遞
  138.         LDR        R0,=LCD12864_EN                ;EN=0
  139.         MOV        R1,#0               
  140.         STR        R1,[R0]
  141.       
  142.         BL        LCD12864_BUSY                ;調(diào)用判忙
  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]                                ;數(shù)據(jù)寫入顯示屏
  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.                
復(fù)制代碼


回復(fù)

使用道具 舉報

地板
ID:883242 發(fā)表于 2023-5-5 17:16 | 只看該作者
知道你什么意思了,你以為匯編語言是一門“語言”,學(xué)會了一門就可以融會貫通學(xué)會別的了,你的理解完全錯誤。

匯編只是機器碼助記符的匯集、組合。在不同平臺上面,二進制機器碼完全不一樣,自然匯編也就完全不一樣。你天真的以為學(xué)了51匯編就能整ARM匯編,事實卻是,你學(xué)的51匯編對你學(xué)ARM匯編不但沒有任何幫助,反而會起到反作用。正確的做法是完全忘掉以前你學(xué)的匯編,從頭開始虛心的學(xué)習(xí)新的一個指令體系。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表