[STM32F1] STM32F103C8T6汇编点灯

[复制链接]
548|13
 楼主| 慢醇 发表于 2023-10-18 15:10 | 显示全部楼层 |阅读模式

[color=rgb(180, 180, 180) !important]最简单的结构,只有一个数据段(只是为了不报错而已):

area Reset,data,readonly,align=3
如图所示 56182652f84ee315f2.png
其中Reset为数据段段名,不可随意更改为别的名称。

 楼主| 慢醇 发表于 2023-10-18 15:15 | 显示全部楼层
sct文件: 6189652f861df2bb5.png
 楼主| 慢醇 发表于 2023-10-18 15:15 | 显示全部楼层
 楼主| 慢醇 发表于 2023-10-18 15:16 | 显示全部楼层
在启动延迟之后,CPU从地址0x0000 0000获取堆栈顶的地址,并从启动
存储器的0x0000 0004指示的地址开始执行代码。 因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。
 楼主| 慢醇 发表于 2023-10-18 15:17 | 显示全部楼层
Flash && SRAM: 87565652f8676f37d4.png
 楼主| 慢醇 发表于 2023-10-18 15:17 | 显示全部楼层
起始地址:
86438652f86885c71c.png
 楼主| 慢醇 发表于 2023-10-18 15:17 | 显示全部楼层
area: 指令指示汇编程序汇编新的代码节或数据节。节是不可分的已命名独立代码或数据块,它们由链接器处理有关。

readwrite: 指定本段为可读可写。

data: 表明是数据段。

align: 2^3对齐(8字节对齐),字节对齐的主要原因是为了提高访问效率。
 楼主| 慢醇 发表于 2023-10-18 15:18 | 显示全部楼层
内核寄存器:
95434652f86b0da831.png
 楼主| 慢醇 发表于 2023-10-18 15:22 | 显示全部楼层
基本的结构:

  1. ;①.栈
  2. area stack,noinit,readwrite,align=3 ;noinit:指定不初始化
  3. Stack_Start
  4.         space 0x400 ;1024Byte
  5. Stack_End                ;栈顶地址(由高向低生长)
  6.          
  7. ;②.堆(暂未用到)
  8. area heap,noinit,readwrite,align=3
  9. Heap_Start
  10.         space 0x200 ;512Byte
  11. Heap_End               

  12. ;③.数据段(只读的属性)
  13. area Reset,data,readonly,align=3
  14.        
  15. ;④.代码段         
  16. area |.text|,code,readonly,align=3

  17.          end ;汇编代码结束
 楼主| 慢醇 发表于 2023-10-18 15:25 | 显示全部楼层
基本的结构是这样,但目前还无法运行任何代码。因为还未设置SP,PC指针!
 楼主| 慢醇 发表于 2023-10-18 15:25 | 显示全部楼层
完整版:
  1. ;要使用的外设寄存器地址  GPIOC_13
  2. RCC_APB2ENR   equ   0x40021018
  3. GPIOC_CRH          equ   0x40011004
  4. GPIOC_ODR     equ   0x4001100C

  5. ;①.栈
  6. area stack,noinit,readwrite,align=3 ;noinit:指定不初始化
  7. Stack_Start
  8.         space 0x400 ;1024Byte
  9. Stack_End               
  10.          
  11. ;②.堆(暂未用到)
  12. area heap,noinit,readwrite,align=3
  13. Heap_Start
  14.         space 0x200 ;512Byte
  15. Heap_End               

  16. ;③.数据段(只读的属性)
  17. area Reset,data,readonly,align=3
  18.         dcd  Stack_End ;开辟4个字节空间,MCU一上电将自动将此地址传给SP(R13)指针,等同于dcd 0x20000400
  19.         dcd  reset__   ;开辟4个字节空间,地址传递给PC(R15),程序开始运行的地方。
  20.                  
  21. ;④.代码段         
  22. area |.text|,code,readonly,align=3
  23.          entry                 ;只有出现bl指令时,才能写entry
  24.          
  25. reset__        proc
  26.             bl LED_Init ;bl指令将自动把当前pc值赋给lr寄存器
  27.                 endp
  28.                          
  29. loop proc
  30.          bl LED_ON
  31.          ldr r0,=0xffff1 ;使用寄存器传递delay的参数
  32.          bl delay

  33.          bl LED_OFF
  34.          ldr r0,=0xffff1 ;使用寄存器传递delay的参数
  35.          bl delay
  36.          b loop        ;无条件转移
  37.          endp
  38.                          
  39.                          
  40. LED_Init proc
  41.                  push{lr}
  42.                  ;RCC
  43.                  ldr r0,=RCC_APB2ENR               
  44.                  ldr r1,=0x00000010
  45.                  str r1,[r0]               
  46.                  ;GPIOC_IO
  47.                  ldr r0,=GPIOC_CRH
  48.                  ldr r1,=0x00300000        ;推挽输出
  49.                  str r1,[r0]
  50.                  ;LED ON
  51.                  bl LED_ON
  52.                  pop{pc}       
  53.                  endp
  54.                          
  55. LED_ON        proc
  56.                 push{lr}
  57.                 ldr  r0,=GPIOC_ODR
  58.                 ldr r1,=0xdfff
  59.                 str r1,[r0]
  60.                 pop{pc}
  61.                 endp
  62.                
  63. LED_OFF proc
  64.                 push{lr}
  65.                 ldr  r0,=GPIOC_ODR
  66.                 ldr  r1,=0x2000
  67.                 str r1,[r0]
  68.                 pop{pc}
  69.                 endp
  70.                
  71. delay proc
  72.           sub r0,r0,#1
  73.           cmp r0,#0
  74.           bgt delay ;满足r0>=0这个条件时,跳转
  75.           mov pc,lr     ;其实和push,pop实现的功能是一样的,将lr的值赋给pc,完成子函数的返回。
  76.           endp
  77.          end ;汇编代码结束
 楼主| 慢醇 发表于 2023-10-18 15:26 | 显示全部楼层
MAP文件:查看内存的分配情况
35157652f8893207e2.png
 楼主| 慢醇 发表于 2023-10-18 15:26 | 显示全部楼层
STM32启动代码:
  1. stack_size equ 0x400
  2.         area stack,noinit,readwrite,align=3                        ;栈段
  3. stack_start
  4.                 space stack_size
  5. stack_end
  6.                

  7. heap_size equ 0x200
  8.         area heap,noinit,readwrite,align=3                        ;堆段
  9. heap_base
  10.                 space heap_size
  11. heap_end               

  12.                  preserve8
  13.          thumb
  14.                
  15.         area reset,data,readonly,align=3                        ;数据段(只读)
  16.                 export Verctors__
  17.                 ;不写Verctors__end && Verctors__size也不会启动失败
  18.                 ;export Verctors__end               
  19.                 ;export Verctors__size
  20. Verctors__                                                                                ;建立中断向量表
  21.                 dcd         stack_end
  22.                 ;如果dcd xxxx中断函数后,还要在code区域export
  23.                 dcd         Reset_Handler
  24.                 ;内核中断
  25.                 dcd     NMI_Handler                ; NMI Handler
  26.         dcd     HardFault_Handler          ; Hard Fault Handler
  27.         dcd     MemManage_Handler          ; MPU Fault Handler
  28.         dcd     BusFault_Handler           ; Bus Fault Handler
  29.         dcd     UsageFault_Handler         ; Usage Fault Handler
  30.         dcd     0                          ; Reserved
  31.         dcd     0                          ; Reserved
  32.         dcd     0                          ; Reserved
  33.         dcd     0                          ; Reserved
  34.         dcd     SVC_Handler                ; SVCall Handler
  35.         dcd     DebugMon_Handler           ; Debug Monitor Handler
  36.         dcd     0                          ; Reserved
  37.         dcd     PendSV_Handler             ; PendSV Handler
  38.         dcd     SysTick_Handler            ; SysTick Handler         
  39.                
  40.                 ;外部中断
  41.                 dcd     WWDG_IRQHandler            ; Window Watchdog
  42.         dcd     PVD_IRQHandler             ; PVD through EXTI Line detect
  43.         dcd     TAMPER_IRQHandler          ; Tamper
  44.         dcd     RTC_IRQHandler             ; RTC
  45.         dcd     FLASH_IRQHandler           ; Flash
  46.         dcd     RCC_IRQHandler             ; RCC
  47.         dcd     EXTI0_IRQHandler           ; EXTI Line 0
  48.         dcd     EXTI1_IRQHandler           ; EXTI Line 1
  49.         dcd     EXTI2_IRQHandler           ; EXTI Line 2
  50.         dcd     EXTI3_IRQHandler           ; EXTI Line 3
  51.         dcd     EXTI4_IRQHandler           ; EXTI Line 4
  52.         dcd     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1
  53.         dcd     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2
  54.         dcd     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3
  55.         dcd     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4
  56.         dcd     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5
  57.         dcd     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6
  58.         dcd     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7
  59.         dcd     ADC1_2_IRQHandler          ; ADC1_2
  60.         dcd     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX
  61.         dcd     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0
  62.         dcd     CAN1_RX1_IRQHandler        ; CAN1 RX1
  63.         dcd     CAN1_SCE_IRQHandler        ; CAN1 SCE
  64.         dcd     EXTI9_5_IRQHandler         ; EXTI Line 9..5
  65.         dcd     TIM1_BRK_IRQHandler        ; TIM1 Break
  66.         dcd     TIM1_UP_IRQHandler         ; TIM1 Update
  67.         dcd     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation
  68.         dcd     TIM1_CC_IRQHandler         ; TIM1 Capture Compare
  69.         dcd     TIM2_IRQHandler            ; TIM2
  70.         dcd     TIM3_IRQHandler            ; TIM3
  71.         dcd     TIM4_IRQHandler            ; TIM4
  72.         dcd     I2C1_EV_IRQHandler         ; I2C1 Event
  73.         dcd     I2C1_ER_IRQHandler         ; I2C1 Error
  74.         dcd     I2C2_EV_IRQHandler         ; I2C2 Event
  75.         dcd     I2C2_ER_IRQHandler         ; I2C2 Error
  76.         dcd     SPI1_IRQHandler            ; SPI1
  77.         dcd     SPI2_IRQHandler            ; SPI2
  78.         dcd     USART1_IRQHandler          ; USART1
  79.         dcd     USART2_IRQHandler          ; USART2
  80.         dcd     USART3_IRQHandler          ; USART3
  81.         dcd     EXTI15_10_IRQHandler       ; EXTI Line 15..10
  82.         dcd     RTCAlarm_IRQHandler        ; RTC Alarm through EXTI Line
  83.         dcd     USBWakeUp_IRQHandler       ; USB Wakeup from suspend               
  84. Verctors__end
  85. Verctors__size equ Verctors__end - Verctors__
  86.        
  87.        
  88.        
  89.         area |.text|,code,readonly,align=3                        ;代码段(只读)
  90.                 entry
  91. Reset_Handler        proc        ;由于Reset_Handler执行了SystemInit && __main函数所以要单独处理
  92.                                 ;export Reset_Handler [weak]
  93.                                 import __main
  94.                                 import SystemInit
  95.                                        
  96.                                 ldr r0,=SystemInit        ;使用'='为ldr伪指令,不使用'='则为ldr指令
  97.                                 blx r0
  98.                                 ldr r1,=__main        ;将__main地址传给r0寄存器
  99.                                 blx r1                        ;执行r0中的地址函数
  100.                                 endp
  101. ;内核中断                                       
  102. CoreInterrupt proc
  103.                         export           Reset_Handler                 [weak]
  104.                         export    NMI_Handler           [weak]
  105.                         export    HardFault_Handler     [weak]
  106.                         export    MemManage_Handler     [weak]
  107.                         export    BusFault_Handler      [weak]
  108.                         export    UsageFault_Handler    [weak]
  109.                         export    SVC_Handler           [weak]
  110.                         export    DebugMon_Handler      [weak]
  111.                         export    PendSV_Handler        [weak]
  112.                         export          SysTick_Handler       [weak]                       
  113. NMI_Handler        
  114. HardFault_Handler  
  115. MemManage_Handler  
  116. BusFault_Handler   
  117. UsageFault_Handler  
  118. SVC_Handler        
  119. DebugMon_Handler   
  120. PendSV_Handler  
  121. SysTick_Handler   
  122.                                 b .
  123.                                 endp   
  124. ;外设中断
  125. ExternInterrupt proc                                                ;导出外部中断服务函数
  126.         export WWDG_IRQHandler                                         [weak]
  127.         export PVD_IRQHandler                            [weak]
  128.         export TAMPER_IRQHandler                [weak]
  129.         export RTC_IRQHandler                   [weak]
  130.         export FLASH_IRQHandler                 [weak]
  131.         export RCC_IRQHandler                   [weak]
  132.         export EXTI0_IRQHandler                 [weak]
  133.         export EXTI1_IRQHandler                 [weak]
  134.         export EXTI2_IRQHandler                 [weak]
  135.         export EXTI3_IRQHandler                 [weak]
  136.         export EXTI4_IRQHandler                 [weak]
  137.         export DMA1_Channel1_IRQHandler         [weak]
  138.         export DMA1_Channel2_IRQHandler         [weak]
  139.         export DMA1_Channel3_IRQHandler         [weak]
  140.         export DMA1_Channel4_IRQHandler         [weak]
  141.         export DMA1_Channel5_IRQHandler         [weak]
  142.         export DMA1_Channel6_IRQHandler         [weak]
  143.         export DMA1_Channel7_IRQHandler         [weak]
  144.         export ADC1_2_IRQHandler                [weak]
  145.         export USB_HP_CAN1_TX_IRQHandler        [weak]
  146.         export USB_LP_CAN1_RX0_IRQHandler       [weak]
  147.         export CAN1_RX1_IRQHandler              [weak]
  148.         export CAN1_SCE_IRQHandler              [weak]
  149.         export EXTI9_5_IRQHandler               [weak]
  150.         export TIM1_BRK_IRQHandler              [weak]
  151.         export TIM1_UP_IRQHandler               [weak]
  152.         export TIM1_TRG_COM_IRQHandler          [weak]
  153.         export TIM1_CC_IRQHandler               [weak]
  154.         export TIM2_IRQHandler                  [weak]
  155.         export TIM3_IRQHandler                  [weak]
  156.         export TIM4_IRQHandler                  [weak]
  157.         export I2C1_EV_IRQHandler               [weak]
  158.         export I2C1_ER_IRQHandler               [weak]
  159.         export I2C2_EV_IRQHandler               [weak]
  160.         export I2C2_ER_IRQHandler               [weak]
  161.         export SPI1_IRQHandler                  [weak]
  162.         export SPI2_IRQHandler                  [weak]
  163.         export USART1_IRQHandler                [weak]
  164.         export USART2_IRQHandler                [weak]
  165.         export USART3_IRQHandler                [weak]
  166.         export EXTI15_10_IRQHandler             [weak]
  167.         export RTCAlarm_IRQHandler              [weak]
  168.         export USBWakeUp_IRQHandler             [weak]
  169. WWDG_IRQHandler
  170. PVD_IRQHandler            
  171. TAMPER_IRQHandler         
  172. RTC_IRQHandler            
  173. FLASH_IRQHandler         
  174. RCC_IRQHandler            
  175. EXTI0_IRQHandler         
  176. EXTI1_IRQHandler         
  177. EXTI2_IRQHandler         
  178. EXTI3_IRQHandler         
  179. EXTI4_IRQHandler         
  180. DMA1_Channel1_IRQHandler  
  181. DMA1_Channel2_IRQHandler  
  182. DMA1_Channel3_IRQHandler  
  183. DMA1_Channel4_IRQHandler  
  184. DMA1_Channel5_IRQHandler  
  185. DMA1_Channel6_IRQHandler  
  186. DMA1_Channel7_IRQHandler  
  187. ADC1_2_IRQHandler         
  188. USB_HP_CAN1_TX_IRQHandler
  189. USB_LP_CAN1_RX0_IRQHandler
  190. CAN1_RX1_IRQHandler      
  191. CAN1_SCE_IRQHandler      
  192. EXTI9_5_IRQHandler        
  193. TIM1_BRK_IRQHandler      
  194. TIM1_UP_IRQHandler        
  195. TIM1_TRG_COM_IRQHandler   
  196. TIM1_CC_IRQHandler        
  197. TIM2_IRQHandler           
  198. TIM3_IRQHandler           
  199. TIM4_IRQHandler           
  200. I2C1_EV_IRQHandler        
  201. I2C1_ER_IRQHandler        
  202. I2C2_EV_IRQHandler        
  203. I2C2_ER_IRQHandler        
  204. SPI1_IRQHandler           
  205. SPI2_IRQHandler           
  206. USART1_IRQHandler         
  207. USART2_IRQHandler         
  208. USART3_IRQHandler         
  209. EXTI15_10_IRQHandler      
  210. RTCAlarm_IRQHandler      
  211. USBWakeUp_IRQHandler      
  212.                                 b .
  213.                                 endp
  214.                        

  215. ; 在分散加载时,连接器会将用户的__user_initial_stackheap()函数
  216. ;代替C库函数默认的堆栈和堆初始化函数,并将其连接到用户的镜像文件中,
  217. ;用户可通过重新实现__user_initial_stackheap()函数来改变堆栈和堆的位置,从而适合自己的目标硬件。
  218. ;__user_initial_stackheap()可以用C或汇编语言来实现。它必须返回如下参数:
  219. ;      R0—堆基地址(heap base)
  220. ;      R1—堆栈基地址(Stack base)
  221. ;      R2—堆长度限制值(heap limit)
  222. ;           R3—堆栈长度限制值(Stacklimit)
  223. ;当用户使用分散加载功能的时候,必须重新实现__user_initial_stackheap ()
  224.                                  import  __use_two_region_memory
  225.                  export  __user_initial_stackheap
  226.                  
  227. __user_initial_stackheap

  228.                  ldr     R0, =  heap_size
  229.                  ldr     R1, =(stack_start + stack_size)
  230.                  ldr     R2, = (heap_size +  heap_size)
  231.                  ldr     R3, = stack_start
  232.                  bx      LR

  233.                  align
  234.                                  end
Jacquetry 发表于 2023-10-18 19:42 | 显示全部楼层
用汇编的都是大佬啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

136

主题

1384

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部