最简单的结构,只有一个数据段(只是为了不报错而已):

 area Reset,data,readonly,align=3

如图所示

其中Reset为数据段段名,不可随意更改为别的名称。

sct文件:

BOOT:

在启动延迟之后,CPU从地址0x0000 0000获取堆栈顶的地址,并从启动
存储器的0x0000 0004指示的地址开始执行代码。 因为固定的存储器映像,代码区始终从地址0x0000 0000开始(通过ICode和DCode总线访问),而数据区(SRAM)始终从地址0x2000 0000开始(通过系统总线访问)。Cortex-M3的CPU始终从ICode总线获取复位向量,即启动仅适合于从代码区开始(典型地从Flash启动)。
Flash && SRAM:

起始地址:

area: 指令指示汇编程序汇编新的代码节或数据节。节是不可分的已命名独立代码或数据块,它们由链接器处理有关。

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

data: 表明是数据段。

align: 2^3对齐(8字节对齐),字节对齐的主要原因是为了提高访问效率。

内核寄存器:

基本的结构:

;①.栈area stack,noinit,readwrite,align=3 ;noinit:指定不初始化
Stack_Startspace 0x400 ;1024Byte
Stack_End       ;栈顶地址(由高向低生长);②.堆(暂未用到)area heap,noinit,readwrite,align=3
Heap_Startspace 0x200 ;512Byte
Heap_End        ;③.数据段(只读的属性)area Reset,data,readonly,align=3;④.代码段     area |.text|,code,readonly,align=3end ;汇编代码结束

基本的结构是这样,但目前还无法运行任何代码。因为还未设置SP,PC指针!
完整版:

;要使用的外设寄存器地址  GPIOC_13
RCC_APB2ENR   equ   0x40021018
GPIOC_CRH     equ   0x40011004
GPIOC_ODR     equ   0x4001100C;①.栈area stack,noinit,readwrite,align=3 ;noinit:指定不初始化
Stack_Startspace 0x400 ;1024Byte
Stack_End       ;②.堆(暂未用到)area heap,noinit,readwrite,align=3
Heap_Startspace 0x200 ;512Byte
Heap_End        ;③.数据段(只读的属性)area Reset,data,readonly,align=3dcd  Stack_End ;开辟4个字节空间,MCU一上电将自动将此地址传给SP(R13)指针,等同于dcd 0x20000400 dcd  reset__   ;开辟4个字节空间,地址传递给PC(R15),程序开始运行的地方。;④.代码段     area |.text|,code,readonly,align=3entry       ;只有出现bl指令时,才能写entryreset__  procbl LED_Init ;bl指令将自动把当前pc值赋给lr寄存器endploop procbl LED_ONldr r0,=0xffff1 ;使用寄存器传递delay的参数bl delaybl LED_OFFldr r0,=0xffff1 ;使用寄存器传递delay的参数bl delayb loop   ;无条件转移endpLED_Init procpush{lr};RCCldr r0,=RCC_APB2ENR     ldr r1,=0x00000010str r1,[r0]      ;GPIOC_IOldr r0,=GPIOC_CRHldr r1,=0x00300000  ;推挽输出str r1,[r0];LED ONbl LED_ONpop{pc} endpLED_ON  procpush{lr}ldr  r0,=GPIOC_ODRldr r1,=0xdfffstr r1,[r0]pop{pc}endpLED_OFF procpush{lr}ldr  r0,=GPIOC_ODRldr  r1,=0x2000str r1,[r0]pop{pc}endpdelay procsub r0,r0,#1cmp r0,#0bgt delay ;满足r0>=0这个条件时,跳转mov pc,lr     ;其实和push,pop实现的功能是一样的,将lr的值赋给pc,完成子函数的返回。endpend ;汇编代码结束

MAP文件:查看内存的分配情况

STM32启动代码(部分):

stack_size equ 0x400area stack,noinit,readwrite,align=3         ;栈段
stack_startspace stack_size
stack_endheap_size equ 0x200area heap,noinit,readwrite,align=3         ;堆段
heap_basespace heap_size
heap_end        preserve8thumbarea reset,data,readonly,align=3         ;数据段(只读)export Verctors__;不写Verctors__end && Verctors__size也不会启动失败;export Verctors__end     ;export Verctors__size
Verctors__                                      ;建立中断向量表dcd     stack_enddcd    Reset_Handler;如果dcd xxxx中断函数后,还要在code区域exportdcd     NMI_Handler                ; NMI Handlerdcd     HardFault_Handler          ; Hard Fault Handlerdcd     MemManage_Handler          ; MPU Fault Handlerdcd     BusFault_Handler           ; Bus Fault Handlerdcd     UsageFault_Handler         ; Usage Fault Handlerdcd     0                          ; Reserveddcd     0                          ; Reserveddcd     0                          ; Reserveddcd     0                          ; Reserveddcd     SVC_Handler                ; SVCall Handlerdcd     DebugMon_Handler           ; Debug Monitor Handlerdcd     0                          ; Reserveddcd     PendSV_Handler             ; PendSV Handlerdcd     SysTick_Handler            ; SysTick Handler    滴答计时器的中断服务函数    Verctors__end
Verctors__size equ Verctors__end - Verctors__area |.text|,code,readonly,align=3            ;代码段(只读)
Reset_Handler   procexport Reset_Handler [weak]import __mainimport SystemInitldr r0,=SystemInit    ;使用'='为ldr伪指令,不使用'='则为ldr指令blx r0ldr r1,=__main  ;将__main地址传给r0寄存器blx r1         ;执行r0中的地址函数endpNMI_Handler proc         ;在数据段dcd申请之后还要在此处exportexport NMI_Handler [weak] ;[weak]为优先使用外部定义b .endp
HardFault_Handler proc          ;在数据段dcd申请之后还要在此处exportexport HardFault_Handler [weak] ;[weak]为优先使用外部定义b .endp
MemManage_Handler proc          ;在数据段dcd申请之后还要在此处exportexport MemManage_Handler [weak] ;[weak]为优先使用外部定义b .endp
BusFault_Handler proc           ;在数据段dcd申请之后还要在此处exportexport BusFault_Handler [weak] ;[weak]为优先使用外部定义b .endp
UsageFault_Handler proc         ;在数据段dcd申请之后还要在此处exportexport UsageFault_Handler [weak] ;[weak]为优先使用外部定义b .endp
SVC_Handler proc            ;在数据段dcd申请之后还要在此处exportexport SVC_Handler [weak] ;[weak]为优先使用外部定义b .endp
DebugMon_Handler proc           ;在数据段dcd申请之后还要在此处exportexport DebugMon_Handler [weak] ;[weak]为优先使用外部定义b .endp
PendSV_Handler proc         ;在数据段dcd申请之后还要在此处exportexport PendSV_Handler [weak] ;[weak]为优先使用外部定义b .endp
SysTick_Handler proc            ;在数据段dcd申请之后还要在此处exportexport SysTick_Handler [weak] ;[weak]为优先使用外部定义b .endp; 在分散加载时,连接器会将用户的__user_initial_stackheap()函数
;代替C库函数默认的堆栈和堆初始化函数,并将其连接到用户的镜像文件中,
;用户可通过重新实现__user_initial_stackheap()函数来改变堆栈和堆的位置,从而适合自己的目标硬件。
;__user_initial_stackheap()可以用C或汇编语言来实现。它必须返回如下参数:
;      R0—堆基地址(heap base)
;      R1—堆栈基地址(Stack base)
;      R2—堆长度限制值(heap limit)
;      R3—堆栈长度限制值(Stacklimit)
;当用户使用分散加载功能的时候,必须重新实现__user_initial_stackheap ()import  __use_two_region_memoryexport  __user_initial_stackheap__user_initial_stackheapldr     R0, =  heap_sizeldr     R1, =(stack_start + stack_size)ldr     R2, = (heap_size +  heap_size)ldr     R3, = stack_startbx      LRalignend

STM32F103C8T6汇编点灯相关推荐

  1. S3C2440逻辑程序--从点灯开始

    前言 有了2440开发板环境搭建.基于韦东山S3C2440开发板搭建arm-linux-gcc交叉编译环境基础,环境已经搭起来了,可以做些逻辑试验了,最经典的是点灯.按键.定时器.中断程序. 那就从点 ...

  2. i.MX6ULL(一) HelloWorld Led点灯

    一 GPIO点灯,嵌入式的helloworld 1   何为GPIO? GPIO只是一个CPU内提供的一种功能外设,CPU外部的I/O引脚会被赋予一种功能(GPIO.UART.I2C等):该功能由CP ...

  3. 系统移植(系统移植环境搭建及简单概念)

    linux系统 = linux内核 + 根文件系统; 根文件系统 = 库(/lib和/usr/lib) + 命令( /bin和/usr/bin) + 配置文件( /etc) + GUI(图形化界面,如 ...

  4. 妈蛋,终于在TQ2440上点亮一个led了。。。

    刚接触TQ2440,几乎是一窍不通,只有一点之前玩stm32的经验. 在把NOR和NAND下载程序的方法学会后,迫不及待的想运行个自己写的程序看看,于是照着韦东山视频撸了一个汇编点灯(之前是用keil ...

  5. 用C/汇编代码实现imx6ull点灯

    一.GPIO的操作方法(参考) 二.看原理图找到一个led灯,确定引脚(搜索led) 如图所示: ① 将GPIO5_3设置为输出引脚,输出低电平有压差灯就亮,输出高电平就灭 ② 将GPIO5_3设置为 ...

  6. STM32F103c8t6点灯

    首先我们需要用到STM32CubeMX,Keil5,STM32F103C8T6原理图. 打开STM32CubeMX新建项目 在左上角找到STM32F103c8t6 加载完后会出现它的引脚图,打开我们的 ...

  7. 【嵌入式08】STM32F103C8T6寄存器方式借助面包板点亮LED流水灯详解

    文章目录 一.题目简述 二.简述:初始化GPIO,点亮LED灯 三.工程文件模板的建立 四.使用寄存器点亮LED灯--代码部分 1.硬件连接设计 2.打开之前建立的工程模板 3.代码编写 4.硬件连接 ...

  8. 【嵌入式10】stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期

    stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期 一.题目要求 二.STM32CubeMX简介 1.利用CubeMX新建工程点亮LED灯 1)前期准备 2)新建工程 2.界面 ...

  9. STM32最小系统核心板(STM32F103C8T6)实现流水灯

    文章目录 一.题目要求 二.STM32简介 三.GPIO初始化 1.输入输出模式和输出速率设置 (1)找到GPIOA.GPIOB.GPIOC的地址 (2)配置对应引脚寄存器,基地址+偏移量 (3)设置 ...

最新文章

  1. Java finally语句到底是在return之前还是之后执行?
  2. for 创建一个方法:键盘录入一个数 ,求它的 阶乘 及 阶乘的和
  3. 【QGIS入门实战精品教程】4.7:QGIS如何将矢量数据转为GeoJSON格式?
  4. mysql获取一个表的数据作为值插入_请问如何在mysql中得到一个即将插入数据表中的那条数据的id值(id自增长)?...
  5. java 代码压缩javascript_通过Java压缩JavaScript代码实例分享
  6. Windows中MySQL主从数据库搭建(三)
  7. NodeJs——子进程
  8. synchronized 修饰在 static方法和非static方法的区别
  9. 微信小程序2048小游戏(上)
  10. 点云应用于电力行业助力输配电安全距离检测分析以及精细化巡检
  11. SpringCound-Alibaba
  12. Word高效指南 - 中文文档首行自动缩进2个字符
  13. linux渗透后清除日志,后渗透阶段清理痕迹方式总结
  14. 玩转MAC OS!实测DIY兼容机装苹果系统
  15. 《青春依然,再见理想——献给学弟学妹》大四学生的万字忏悔书,警示学弟学妹...
  16. uniapp 图片上传与展示
  17. 用ironic安装openstack的原理
  18. 如何快速高效出高质量效果图
  19. 快手引流犯法吗?如果发现造成具体损失以及影响恶劣的情况会被起诉
  20. 统一诊断服务(UDS)

热门文章

  1. 【spark on kubernetes】spark operator访问hdfs,hive
  2. 小白自学人工智能_神经网络_图像处理之安装软件之师兄的嘱托
  3. linux系统查看当前安装字库,Linux系统下安装和配置中文字库的方法
  4. ERP(企业资源管理)概述
  5. Phonetic symbol 单元音 - 短元音 -- ə
  6. CTC Global宣布ACCC InfoCore™系统和首次商业部署
  7. 《提示音在车载ADAU1452DSP音频产品中的应用》
  8. 发那科FANUC电路板图纸 全套驱动图纸 原理图
  9. FC冒险岛java版_FC冒险岛经典版
  10. Windows窗体应用c#制作屏保