STM32F103C8T6汇编点灯
最简单的结构,只有一个数据段(只是为了不报错而已):
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汇编点灯相关推荐
- S3C2440逻辑程序--从点灯开始
前言 有了2440开发板环境搭建.基于韦东山S3C2440开发板搭建arm-linux-gcc交叉编译环境基础,环境已经搭起来了,可以做些逻辑试验了,最经典的是点灯.按键.定时器.中断程序. 那就从点 ...
- i.MX6ULL(一) HelloWorld Led点灯
一 GPIO点灯,嵌入式的helloworld 1 何为GPIO? GPIO只是一个CPU内提供的一种功能外设,CPU外部的I/O引脚会被赋予一种功能(GPIO.UART.I2C等):该功能由CP ...
- 系统移植(系统移植环境搭建及简单概念)
linux系统 = linux内核 + 根文件系统; 根文件系统 = 库(/lib和/usr/lib) + 命令( /bin和/usr/bin) + 配置文件( /etc) + GUI(图形化界面,如 ...
- 妈蛋,终于在TQ2440上点亮一个led了。。。
刚接触TQ2440,几乎是一窍不通,只有一点之前玩stm32的经验. 在把NOR和NAND下载程序的方法学会后,迫不及待的想运行个自己写的程序看看,于是照着韦东山视频撸了一个汇编点灯(之前是用keil ...
- 用C/汇编代码实现imx6ull点灯
一.GPIO的操作方法(参考) 二.看原理图找到一个led灯,确定引脚(搜索led) 如图所示: ① 将GPIO5_3设置为输出引脚,输出低电平有压差灯就亮,输出高电平就灭 ② 将GPIO5_3设置为 ...
- STM32F103c8t6点灯
首先我们需要用到STM32CubeMX,Keil5,STM32F103C8T6原理图. 打开STM32CubeMX新建项目 在左上角找到STM32F103c8t6 加载完后会出现它的引脚图,打开我们的 ...
- 【嵌入式08】STM32F103C8T6寄存器方式借助面包板点亮LED流水灯详解
文章目录 一.题目简述 二.简述:初始化GPIO,点亮LED灯 三.工程文件模板的建立 四.使用寄存器点亮LED灯--代码部分 1.硬件连接设计 2.打开之前建立的工程模板 3.代码编写 4.硬件连接 ...
- 【嵌入式10】stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期
stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期 一.题目要求 二.STM32CubeMX简介 1.利用CubeMX新建工程点亮LED灯 1)前期准备 2)新建工程 2.界面 ...
- STM32最小系统核心板(STM32F103C8T6)实现流水灯
文章目录 一.题目要求 二.STM32简介 三.GPIO初始化 1.输入输出模式和输出速率设置 (1)找到GPIOA.GPIOB.GPIOC的地址 (2)配置对应引脚寄存器,基地址+偏移量 (3)设置 ...
最新文章
- Java finally语句到底是在return之前还是之后执行?
- for 创建一个方法:键盘录入一个数 ,求它的 阶乘 及 阶乘的和
- 【QGIS入门实战精品教程】4.7:QGIS如何将矢量数据转为GeoJSON格式?
- mysql获取一个表的数据作为值插入_请问如何在mysql中得到一个即将插入数据表中的那条数据的id值(id自增长)?...
- java 代码压缩javascript_通过Java压缩JavaScript代码实例分享
- Windows中MySQL主从数据库搭建(三)
- NodeJs——子进程
- synchronized 修饰在 static方法和非static方法的区别
- 微信小程序2048小游戏(上)
- 点云应用于电力行业助力输配电安全距离检测分析以及精细化巡检
- SpringCound-Alibaba
- Word高效指南 - 中文文档首行自动缩进2个字符
- linux渗透后清除日志,后渗透阶段清理痕迹方式总结
- 玩转MAC OS!实测DIY兼容机装苹果系统
- 《青春依然,再见理想——献给学弟学妹》大四学生的万字忏悔书,警示学弟学妹...
- uniapp 图片上传与展示
- 用ironic安装openstack的原理
- 如何快速高效出高质量效果图
- 快手引流犯法吗?如果发现造成具体损失以及影响恶劣的情况会被起诉
- 统一诊断服务(UDS)
热门文章
- 【spark on kubernetes】spark operator访问hdfs,hive
- 小白自学人工智能_神经网络_图像处理之安装软件之师兄的嘱托
- linux系统查看当前安装字库,Linux系统下安装和配置中文字库的方法
- ERP(企业资源管理)概述
- Phonetic symbol 单元音 - 短元音 -- ə
- CTC Global宣布ACCC InfoCore™系统和首次商业部署
- 《提示音在车载ADAU1452DSP音频产品中的应用》
- 发那科FANUC电路板图纸 全套驱动图纸 原理图
- FC冒险岛java版_FC冒险岛经典版
- Windows窗体应用c#制作屏保