arm基础1
ATPSCS: 传参怎么传
函数的调用,函数的跳转 利用栈传递参数。
overview
S5PV210 is 32 ARM Coretex-A8 64bit外部存储。LPDDR低功耗 NAND Flash base: NOR-FLASH(base, loader),
cpu: 结构布局: cpu : 计算器,通用的可编程接口GPIO:Memory Interface
BUS总线; UART 64个字节的缓冲。
通用的可编程的端口。
237个GPIO。
物理地址: DRAM: 物理内存,通过地址查找。
200 0000 地址。
可以接内存。特俗功能寄存器。
0x0000_0000
RAM_ROM 在cpu内部。
硬件工程师。可用。
时钟,电源 ,芯片的常识。计算机的存储。
输入输出。数据库,存在内盘。 输入输出。
介质: 金字塔。 塔尖的读取速度越高。寄存器,---》 cache :SRAM,随机存储器---》 内存:DRAM SDRAM DDRAM 介质:硅。IO,存储设备:
核心板,底板。
标号定格写:
控制寄存器: 使能
数据寄存器: 给数据
看电路图,看数据手册。
开启超级终端。
初始化开发板上的主要硬件,把操作系统从硬盘拷贝到内存,然后让cpu跳到内存中执行kernal
bootloader:
看门狗: 防止程序死机。喂狗程序,
boot阶段:
1关闭影响cpu正常执行的外设。
--关闭看门狗
--关闭中断
2 初始化时钟
目的: 把开发的倍频到1GHZ,外设分频
3 内存不能容,初始化内存控制器。DDRAM内存。
怎么验证内存可以工作了:忘内存中写,再读。读出的数据,赋值到灯gpio.
4 初始化硬盘: NAND FLASH
-nand flash 读驱动(从nang)
loader阶段:
1 从硬盘指定的地址加载kernal到内存指定位置。
2 跳转到内存kernal所在的地址,执行
常用调试手段:
1 led点灯
2 蜂鸣器,
3 串口调试输入输出。T R int getchar(void) void putchar(int)
uart_getchar(),uart_putchar(char)
字符串的函数: strstr()
字符串,数据结构(逻辑水平),项目经验
uart_gets()
uart_puts()
uart_printf()
uart_scanf()
超级终端:收发数据,重要的手段。
快速实现stdio.h中的方法:
开发板加电后不能调用任何函数。
串口的驱动位置:放在初始化时钟。115200依赖时钟。
最小bootloader.
附加功能: 实现bootloader中的shell
mw 0xe02000a0 0x1
mw 0xe0200040 0x1
命令解析器:
执行bootloader 进入androi
找看门狗:中断:
1 有没有
2 状态
3 关闭
第一章:
timer 看门狗再芯片中:
Reset enable/disable 设置定时器是否发送信号。
Watchdog timer 开关。
pclk 输入时钟源: 设置分频器。 WTDAT 数据
WTCNT(RESET ,INTERU信号)
0xE2700000 WTCON 把第一位和第0位置零。
关闭中断: CPSR I和F位都关闭,设置为1不影响任何中断
防止cpu跑飞
初始化时钟: COLOCK CONTROLLER
12MHZ 外部时钟s3c2440 pll 倍频304MHZ 分频器分频: HCLK 100MHZ mem控制器PCLK 50MHZ gpio PLCK 304ARM920t处理核心
设置寄存器目标:产生所需的HCLK,PCLK,FCLK
MPLL倍频器:
HCLK: USB Nand flash 降低频率可以省点
PCLK: WT UART GPIO,
UPLL: USB设备。UPLL
锁定时间:不让cpu执行程序
ckermit : 超级终端。配置文件 /etc/kermit/kermrc 指定串口和波特率 权限问题
命令模式: c 从命令切换到 通信模式,ctrl+c+\
send file 发送文件
通信模式:
bootloader :
make disclean
make
uboot: shell 加载操作系统
sudo fdisk l 查看U盘
sdb1 烧录: sudo dd iflag=dsync oflag=dsync if=xxx.bin of=/dev/sdb seek=1 跳过第一个扇区
异步通信:RSTXD0, RSRXD0 MAX3232CSE 电压转换,210芯片:
com1
数据宽度: 5,6,7,8.
奇偶校验:
停止位:
配置功能模式:串口控制器。
uart-gethcar()
uart_putchar()
在芯片手册: cache
时钟来之PCLK,低速时钟。
接受移位寄存器,接受缓存寄存器。
fifo Register:
buad-rate Generator:
行功能寄存器:
波特率要匹配: 不匹配造成乱码
串口的工作模式: control 轮询模式
串口的队列: 默认关闭
串口状态寄存器: 接受数据,当接受缓冲区有有效数据,自动置位1 transmit 发送
波特率寄存器。
实现串口收和发:
串口变编写的完整示例:
#define ULCON0 *((volatile unsigned int *)0XE2900000)
#define UCON0 *((volatile unsigned int *)0XE2900004)
#define UTRSTAT0 *((volatile unsigned int *)0XE2900010)
#define UTXH0 *((volatile unsigned int *)0XE2900020)
#define URXH0 *((volatile unsigned int *)0XE2900024)
#define UBRDIV0 *((volatile unsigned int *)0XE2900028)
#define UDIVSLOT0 *((volatile unsigned int *)0XE290002C)
#define GPACON0 *((volatile unsigned int *)0XE0200000)
void uart_init(void)
{
//设置 波特率 模式 管脚
GPACON0 = 0X22;
轮询模式
UCON0 = 0X5
}
char uart_getchar(void)
{
//如果有数 状态寄存器为1
//判断状态是否为1
char ch;
while(!(UTRSTAT0 & 0X1));
ch = URXH0;
return ch;
}
char uart_putchar(char ch)
{
//如果状态寄存器状态为1
}
void uart_test(void)
{
char ch;
uart_init();
uart_putchar();
while(1)
{
ch = uart_getchar();
uart_putchar(ch);
}
}
启动代码:
内存的地址管脚 数据管脚连接数据总线
控制总线: 控制片选信号
驱动内存: 定时的充电,
初始化内存的代码: 原理
*(unsigned int*)0x8000 = 0x1234567
*(unsigned int*)0x2000 8000
1 产生片选内存被片选选中
2 发送地址,计算偏移地址。
3发送8000这个偏移地址。
4 每片内存都选中字节的8000这个单元
5 每篇内存都去读取总线上的数据,存储到0x8000
nandflash工作原理:
一个页面有多大,串行读速度快。十万次擦写。
pin description ALE 地址锁存。
高电平有效。地址,命令,数据。 盲写类:反映芯片状态。
5个周期传输地址。
1page = (2k+64)byte
1block = (2k+64)b*64page
1device=(2k+64)
从nandflash读写擦除。
SLC 每个存储单元只能存一个数据
贵 速度块 写稳定 保存时间长
MLC 每个存储单元可以存2个数据
便宜 速度慢 写不稳定 保存时间短