点亮LED灯
1.开发板介绍
2.cpu控制硬件原理
六大指令里边,只有内存访问指令能访问cpu之外的内容。那cpu如何控制硬件?
*load/store指令-->操作4G内存
任何一个芯片都有一个地址映射表。告诉地址空间是如何映射的,便于我们找到对应的硬件地址。
我们的SOC型号是S5P6818,对应的芯片用户手册为:S5P6818X 用户手册V0.00,其中一章是:Memory map或Memory Controller 中的一张表中可以看地址隐射关系。
硬件控制原理:
CPU不能直接控制硬件,硬件是由其对应的控制器(寄存器)来控制的
每个控制器(寄存器)都会映射到CPU寻址范围内的一段空间
CPU通过对控制器(寄存器)的读和写实现对硬件间接的控制
CPU间接控制硬件。
3.本地开发和交叉开发
本地开发:本地编写代码,本地编译代码,本地运行代码
交叉开发:本地编写代码,本地编译代码,开发板运行代码
PC中Linux下,程序也能执行,但不是仿真。他是真正的运行。但你移植到ARM平台就不一定能执行,需要转化代码的指令。这个转换过程你可以当成是交叉编译。
4.点灯实验
分析电路图
1、分析电路图的思路:从外设(地板)---》SOC(核心板)分析
2、 分析LED
3、 在电路板上找到led灯的位置
LED灯旁边会有白色的字,此白字为丝印,LED灯旁边的字,是led灯的编号
打开底板的原理图,在原理图上搜索led灯编号(RGB)
4、分析led的电路图
共阳三色二极管:三个二极管的,正极接到一起
RGB_R/RGB_G/RGB_B 表示网络标号
5、网络标号名字相同表示具有相同的,电气连接属性,反应到电路板上,他们通过导线连接到一起
6、根据网络标号到核心板原理图,找到soc哪个引脚驱动着LED灯
控制思想
工作寄存器:R0-R15,cpsr,spsr,由ARM公司提供,没有地址
控制寄存器:就是内存的一块空间,具有地址,由芯片厂家提供。寄存器是在GPIO章节被使用,所以看芯片手册的时候看GPIO章节,里面一定有相关寄存器的使用和功能实现。
我们只需要向控制寄存器中写值或者读值,就可以让我们处理器完成一定的功能。这也就是我们软件编程控制硬件的思想。
读懂芯片手册
概述:简介->特点->框图
机械尺寸->IO功能描述表
系统引导:概述->功能描述->内部引导->外部引导
1、GPIOxOUT:控制引脚输出高低电平
2、RED_LED--->GPIOA28
3、GPIOAOUT ---> 0xC001A000
4、GPIOA28输出高电平:
GPIOAOUT[28] <--写-- 1
5、GPIOA28输出低电平:
GPIOAOUT[28] <--写-- 0
6、GPIOxOUTENB:控制引脚的输入输出模式
GPIOAOUTENB ---> 0xC001A004
7、 设置GPIOA28引脚为输出模式:
GPIOAOUTENB[28] <--写-- 1
8、GPIOxALTFN:控制引脚功能的选择
GPIOAALTFN1 ---> 0xC001A024
9、设置GPIOA28引脚为GPIO功能:
GPIOAALTFN1[25:24] <--写-- 0b00
00 = ALT Function0
01 = ALT Function1
10 = ALT Function2
11 = ALT Function3
GPIO引脚功能的选择:每两位控制一个GPIO引脚,
编写程序
汇编
.text @代码段
.global _start @将_start声明成一个全局的符号,其他.s文件也可以引用
_start: @汇编的入口
/*
实验步骤:
1)分析电路原理图,得出LED的控制方式->高电平亮,低电平灭
2)分析电路原理图,得出LED与SOC的连接关系->GPIOA28
3)分析芯片手册,找到对应的寄存器将GPIOA28设置成GPIO功能->GPIOAALTFN1(0XC001A024)
4)分析芯片手册,找到对应的寄存器将GPIOA28设置成OUTPUT功能->GPIOAOUTENB(0XC001A004)
5)分析芯片手册,找到对应的寄存器将GPIOA28设置输出高低电平->GPIOAOUT(0XC001A000)
*/
/*
地址:0xc001A024 数据:0x00000000
地址:0xc001A004 数据:0x10000000
地址:0xc001a000 数据:0x10000000/0x00000000
GPIOAOUTENB
地址:0xc001a000 数据:0x10000000/0x00000000
*/
@设置GPIOA28为GPIO功能
LDR R1,=0x00000000
lDR R2,=0XC001A024
STR R1,[R2]
@设置GPIOA28为OUTPUT功能
LDR R1,=0x10000000
lDR R2,=0XC001A004
STR R1,[R2]
@设置GPIOA28为高电平
LDR R1,=0x00000000
lDR R2,=0XC001A000
STR R1,[R2]
stop:
B stop
.end @汇编的结束
下载调试程序
1、拷贝.bin文件到windows中
2、开发板和电脑进行硬件连接
串口线的USB端插到电脑的USB口
串口线的串口端插到开发板的UART0端口上
开发板插上电源
3、配置windows超级终端
可以查看配置超级终端的使用说明文档资料中有, 如果串口线第一次使用需要安装串口驱动,串口驱动文件在资料中
4、配置超级终端:
在设备管理器中,查看串口线使用的那个端口号
配置端口属性:
波特率:115200
数据位:8
停止位:1
校验位:无
流控:无
5、开发板上电,超级终端会有打印信息
在倒计时减到0之前按任意键,进入到FS6818#界面
执行命令 loadb 0x43c00000 --》下载二进制文件到内存的0x43c00000
传送--》发送文件--》选择要下载.bin文件,选择Kermit协议 --》 确定下载
执行命令:go 0x43c00000 --》到0x43c00000位置运行代码
如果需要重新下载代码,重复步骤4
闪灯
用汇编写C逻辑
.text
.global _start
_start:
MAIN:
BL LED_CONFIG
LOOP:
BL LED_ON
BL DELAY
BL LED_OFF
BL DELAY
BL LOOP
LED_CONFIG:
LDR R1,=0X00000000
LDR R2,=0XC001A024
STR R1,[R2]
LDR R1,=0X10000000
LDR R2,=0XC001A004
STR R1,[R2]
MOV PC,LR
LED_OFF:
LDR R1,=0X00000000
LDR R2,=0XC001A000
STR R1,[R2]
MOV PC,LR
LED_ON:
LDR R1,=0X10000000
LDR R2,=0XC001A000
STR R1,[R2]
MOV PC,LR
DELAY:
LDR R1,=100000000
T:
SUB R1,R1,#1
CMP R1,#0
BNE T
MOV PC,LR
.end