开发板
约 1845 字大约 6 分钟
2026-01-28
开发板相关
这里以正点原子的MX6U-ALPHA作为例子
简述
一般来说包括
电源
开关
排针
usb_host:利用hub芯片集成多个usb合而为一
网口
串口脚针(RS485、RS232)
can接口
SPI外设
RGB平脚
OTG(USB):可以作为server也可以作为client
TTL串口
AP3216C:多合一传感器
SDIO:WIFI
RESET键
USERKEY键
MX6U芯片与Cortex-A7架构
MX6U资料:基本资料
Cortex-A7架构:基本资料见ARM官网
I.MX6U的IO
STM32、管脚名字:PA0-15、PB0-15 PC、PD
管脚具有复用的能力
参考手册、找到32章IO复用章节、查找对应的管脚(带有MUX的)
汇编
Cotex-A下:
需要用汇编初始化一些soc外设
使用汇编初始化一些DDR
设置SP指针一般指向DDR,设置C语言运行环境
LED的硬件原理分析:
1、使能时钟,将所有的寄存器全部设置为1 .即四个字节的0xffff
STM32 io初始化流程
设置GPIO时钟
设置IO复用,将其设置为GPIO
配置GPIO的电气属性
使用GPIO,输出高低电平
2、设置IO复用,将寄存器复用为想要设置的GPIO。
3、设置电气属性的寄存器,包括压摆率、速度、驱动能力、开漏、磁滞、上下拉等。
4、配置GPIO功能,设置输入输出。
GPIO_DR GPIO_GDIR:一个设置对应的GPIO寄存器一个设置GPIO的方向
GPIO_PSR GPIO_ICR1 GPIO_ICR2
GNU汇编
采用gcc交叉编译,汇编需要遵循汇GNU汇编语法
label: instruction @comment
//label可以取消,comment也可以没有
//eg:
add:
MOVS R0,#0X12汇编的默认入口是_start,可以在链接脚本中使用ENTRY来指明其他的入口点。
GNU有一些伪操作
.byte:定义一个单字节数据
.short:定义一个双字节数据
.long:定义一个四字节数据
.equ:赋值
.align:数据字节对齐
.end:表示源文件结束
.gloabl:定义一个全局符号.global _start
_start:
ld r0,=0x12
//.global是一个伪操作,将_start声明为一个全局变量同时也支持一些函数定义的操作
函数名:
函数体:
跳转语句:汇编由指令构成,常用指令有:
- 数据内部传输
| 指令 | 目的 | 源 | 描述 |
|---|---|---|---|
| MOV | R0 | R1 | 将R1数据复制到R0 |
| MRS | R0 | CPSR | 将特殊寄存器CPSR里面数据复制到R0 |
| MSR | CPSR | R1 | 将R1数据复制到特殊寄存器CPSR里面 |
- 存储器访问指令
| 指令 | 描述 |
|---|---|
| LDR Rd,[Rn, #offest] | 从存储器Rn+offest位置读取数据存放到Rd中 |
| STR Rd,[Rn, #offest] | 从Rd中的数据写入存储器中的Rn+offest位置 |
LDR R0, =0X21341 @表示将寄存器地址加载到R0里面,等价于R0 = 0X21341
LDR R0, [R1] @读取地址里面的数据到R1里面
//STR
LDR R0, =0X0209C004
LDR R1, =0X12343434
STR R1, [R0] @将R1中的值写入到R0中保存的地址中- 压栈以及出栈指令
| 指令 | 描述 |
|---|---|
| PUSH < reg list > | 将寄存器列表存入栈中 |
| POP < reg lsit > | 从栈中恢复寄存器列表 |
寄存器
ARM架构提供了16个32为的通用寄存器(R0-R15)可以供给软件使用,前15个可以用作通用的数据存储,R15是程序计数器,用来保存将要执行的指令。ARM还提供另一个CPSR寄存器和一个备份程序状态寄存器的SPSR,SPSR寄存器是CPSR寄存器的备份。
R13->SP:堆栈指针
R14->LR:堆栈指针
R15->PC:程序计数器
Cortex-A7有9种模式,不同模式对应的寄存器组不一样。
编写并烧写
.global _start @全局标号
_start:
@使能所有的外设时钟
ldr r0, =0x020c4068 @将地址值保存到寄存器里面, CCGR0
ldr r1, =0xffffffff @向CCGR写入的数据
str r1, [r0] @向r0的地址写入0xffffffff
ldr r0, =0x020c406c @CCGR1
str r1, [r0]
ldr r0, =0x020c4070 @CCGR2
str r1, [r0]
ldr r0, =0x020c4074 @CCGR3
str r1, [r0]
ldr r0, =0x020c4078 @CCGR4
str r1, [r0]
ldr r0, =0x020c407c @CCGR5
str r1, [r0]
ldr r0, =0x020c4080 @CCGR6
str r1, [r0]
@设置IO复用,设置pin复用为GPIO设置对应寄存器为说明对应数值
ldr r0, =0x020e0068 @寄存器地址IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
ldr r1, =0x5 @设置对应的r0的寄存器为GPIO复用
str r1, [r0]
@配置电气属性 GPIO_DR GPIO_GDIR等
/* 配置GPIO1_IO03电气属性,也就是寄存器:
*IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03
*IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03寄存器地址为0x020e02f4
*
* bit0-:设置压摆率为低速率
* bit5:3(DSE)设置驱动能力, 110--R0/6
* bit 7-6:设置io速度 01--100MHZ
* bit11: 关闭开漏输出0
* bit12: 1 使能pull/keeper
* bit13: 0 keeper
* bit15-14: 设置上下拉阻值 00 :100k ohm pull down
* bit 16: 设置为关闭hys
*/
ldr r0, =0x020e02f4@将该值暂时存储到r1
ldr r1, =0x10B0
str r1,[r0]
@设置GPIO的属性DR 以及GDIR
/*
* 设置GPIO01_GDIR寄存器,设置GPIO01_GPIO03为输出
* GPIO1_GDIR寄存器地址是0x0209c004,设置GPIO1_GDIRbit3为1
*/
ldr r0, =0x0209c004
ldr r1, =0x8
str r1, [r0]
@设置led开关
/*
* GPIO1_DR寄存器地址为0x0209c000
*/
ldr r0, =0x0209c000
ldr r1, 0
str r1, [r0]
loop:
b loop编译文件
.c .s 变成.o文件再将所有.o文件链接为elf格式的可执行文件,将elf文件转换为Bin文件,也可以将elf文件转换为反汇编
链接起始地址:代码运行的起始地址。
对于6ULL来说链接起始地址,应该指向RAM地址,RAM分为内部和外部。6ULL内部有128K的RAM,也可以放到外部DDR中。
手动选择链接地址为DDR地址。就取用0X87800000作为链接地址。
一般来说Bin文件不能直接烧写到SD卡、EMMC、NAND等外存中,从外存中启动,而是必须拷贝到内存中在内存中运行。
对于bin文件来说需要添加一个头部,这个头部信息包含了DDR的初始化参数,LMX系列SOC内部boot rom 会从外存中读取头部信息然后初始化DDR并且将bin文件拷贝到指定的地方。
烧写bin文件
6ULL支持SD卡等外存以及NAND、Nor、SPI flash启动。裸机选择烧写到sd里面,选择从SD卡启动。
在ubuntu下向sd卡烧写,将bin烧写到sd卡的绝对地址。而且对应LMX而言不能直接烧写BiN文件,必须现在bin文件前面添加头部。
jlink?
- 6ULL支持JLINK、JTAG,因为没有烧写算法所以无法烧写
- 但是可以通过JTAG将BIN文件下载到内部RAM
- 6ULL的JTAG口和SAI复用,SAI链接了WM8960音频DAC。
- 在嵌入式开发中,基本不是用JLINK。
- 使用点灯、串口调试程序。
IMX启动方式选项
LED启动,从SD卡读取BIN文件并启动,说明6UL支持从SD卡启动。6UL支持多种启动方式。
如何支持多种外置FLASH启动程序。
1、启动方式的选择
BOOT_MODE0和BOOT_MODE1,是两个IO控制。这是两个Pin引脚。要烧写系统到开发板中选择从USB下载,下载到SD卡,EMMC、NADN等外置存储中。烧写完成之后从相应的外置存储中启动。
2、选择启动设备
