网上下的--ARM入门笔记

发布者:CrystalSparkle最新更新时间:2024-11-15 来源: cnblogs关键字:ARM  入门笔记 手机看文章 扫描二维码
随时随地手机看文章

十二 关于JTAG访真器
JTAG访真器现在用的多是简板的,一个244那种,用的没什么不好。
按照并口定义不同分几种,建议选WIFFLER定义的,因为支持的软件多。这个网上多的是,不多说了。
值得提的是有的JTAG访真器原理图上有跳线用来使能复位信号,这个一般不跳上。就是不用复位信号,因为JTAG协议里本身也可以控制44B0复位。
当然,板子上的复位信号跳线也不用跳。

十三 哪个公司的ARM
这个是问题比较简单。
1 ARM7主要就几个公司的
三星,PHILIP,ATMEL的
ATMEL的有比较便宜的AT91SAM7S32 和AT91SAM7S64 专为8位应用产品量身定做,价格很便宜好象《3刀吧。和PHILIP的21XX差不多,资料太少,项目中选还不错。
其他两家上面说了的不多说了吧

2 ARM9
这个玩2410和2440的多吧,现在2440还比较火啊 可以考虑买个了
但是2410就比较便宜了,作为学习来说反到和不错,推荐整一个:)
其实ARM9用的最多的领域应该是消费电子,比如手机PDA,而这上面用的多的应该是INTEL的和TI的吧。
但是INTEL的TI的入门材料少,价格高,自己看情况定吧。

UBOOT命令总结(转)
很好的UBOOT命令总结,我在起步时就是看的这篇东西,熟悉了以后就用“?”看自带帮助就行:)

Printenv 打印环境变量。

Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
Environment size: 80/8188 bytes

Setenv 设置新的变量

Uboot> setenv myboard AT91RM9200DK
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
myboard=AT91RM9200DK
Environment size: 102/8188 bytes

Saveenv 保存变量

命令将当前定义的所有的变量及其值存入flash中。用来存储变量及其值的空间只有8k字节,应不要超过。

Loadb 通过串口Kermit协议下载二进制数据。

Tftp 通过网络下载程序,需要先设置好网络配置

Uboot> setenv ethaddr 12:34:56:78:9A:BC
Uboot> setenv ipaddr 192.168.1.1
Uboot> setenv serverip 192.168.1.254 (tftp服务器的地址)
下载bin文件到地址0x20000000处。
Uboot> tftp 20000000 application.bin (application.bin应位于tftp服务程序的目录)

Uboot> tftp 32000000 vmlinux
把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。

Md 显示内存区的内容。

Mm 修改内存,地址自动递增。

Nm 修改内存,地址不自动递增。

Mw 用模型填充内存

mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)

Cp 拷贝一块内存到另一块

Cmp 比较两块内存区

这些内存操作命令后都可加一个后缀表示操作数据的大小,比如cp.b表示按字节拷贝。

Protect 写保护操作

protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护)
protect off 1:0-3取消写保护

Erase 擦除扇区。

erase: 删除FLASH的扇区
erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)

对DataFlash的操作

U-Boot在引导时如果发现NPCS0和NPCS3上连有DataFlash,就会分配虚拟的地址给它,具体为 :
0xC0000000---NPCS0
0xD0000000---NPCS3

run 执行设置好的脚本

Uboot> setenv flashit tftp 20000000 mycode.bin; erase 10020000 1002FFFF;
cp.b 20000000 10020000 8000
Uboot> saveenv
Uboot> run flashit

bootcmd 保留的环境变量,也是一种脚本

如果定义了该变量,在autoboot模式下,将会执行该脚本的内容。

Go 执行内存中的二进制代码,一个简单的跳转到指定地址

Bootm 执行内存中的二进制代码

要求二进制代码为制定格式的。通常为mkimage处理过的二进制文件。
起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000

Bootp 通过网络启动,需要提前设置好硬件地址。

? 得到所有命令列表

help help usb, 列出USB功能的使用说明

ping 注:只能开发板PING别的机器

usb

usb start: 起动usb 功能
usb info: 列出设备
usb scan: 扫描usb storage(u 盘)设备

kgo 起动没有压缩的linux内核

kgo 32000000

fatls 列出DOS FAT文件系统

fatls usb 0列出第一块U盘中的文件

fatload 读入FAT中的一个文件

fatload usb 0:0 32000000 aa.txt 把USB中的aa.txt 读到物理内存0x32000000处!

flinfo 列出flash的信息

nfs

nfs 32000000 192.168.0.2:aa.txt
把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。

CPU频率计算方法---PLL设置
看见很多朋友不会计算PLL分频和串口频率,整理个笔记发上来

cpu时钟频率和串口波特率的计算公式
S3C44B0的系统时钟设置公式
Fpllo 为系统的主频,此处为60MHz
Fin 为晶振的频率,此处为10MHz
一. 通过PLL输出时钟脉冲频率的计算:
a) Fpllo = (m × Fin)/ (p × 2^s)
b) m = (MDIV + 8) , p = (PDIV + 2), s = SDIV
c) 20MHz < Fpllo < 66MHz
d) Fpllo * 2s < 170MHz (s应该尽可能的大)
e) 1MHz <= Fin/p < 2MHz (最好是Fin/p = 1MHz)
f) 如果PLL打开则:Fpllo = Fout
g) 这样计算出MDIV, PDIV, SDIV的值写入PLLCON寄存器中就可设置Fpllo的输出频率。
根据 d)知道s=1
根据 e)知道p=10
再根据 a)就知道了m=120,注意2^s代表2的s次方
再根据 b)知道MDIV=112, PDIV=8, SDIV=1
根据44B0数据手册5-14页算出 PLLCON=0X70081
注意:PLLCON的结果不为一!比如P可以取8 取7……
注意:PLLCON寄存器是20位的 各个区域中间有空的
比如MDIV是寄存器里19-12位,PDIV是9-4位两个中间有11,10位空,如果用2进制算就添0

不过做过硬件的就知道 大可不必只要把MDIV, PDIV, SDIV用WEINDOWS自带计算机直接由2进制转换成16进制顺序写就行
比如MDIV=112=0x70, PDIV=8=0x08, SDIV=1=0x1
PLLCON寄存器就是0x70081(看到这 连手册都不用翻了吧?:))
还得多说一句 不是0x700801,因为SDIV=1=0x1不是0X01,跟PDIV=8=0x08不一样

S3C44B0的UART波特率计算公式---分频设置
S3C44B0的UART波特率计算公式
MCLK即主频 此处为60MHz
UBRDIVn(又称divisor) = ( (int)(MCLK / (bps * 16) + 0.5) – 1 )
MCLK = Fout = Fpllo
Bps = 1200,9600,19200,38400,57600,115200
例如 主频=60MHz=60000000Hz
串口速度选115200

divisor=取整[60000000/(115200*16) + 0.5] -1 = 32

MINICOM设置
最近的朋友很多问MINICOM设置的问题
把原来写的整理一下 发一下 现成的还行 有朋友问我驱动怎么开发
这个就比较麻烦了:)还是等我过段时间了也把手头的几个驱动搞定了再说

---------正文-------------
MINICOM是LINUX提供的和WEINDOWS超级终端一样的工具,一般用做串口与开发板通信,当然有的板子也用USB,但这里只介绍串口的设置

一 VMWARE虚拟机添加串口(如果没用虚拟机可以跳过这步)
如果在VMWARE虚拟机下 一定要记得先确认这步 要不不好使 很多朋友的问题就在这里!
先关闭虚拟机下的LINUX,然后设置一下虚拟机:在vm-〉settings-〉hardware里添加串口 COM1 COM2都加上吧

二 设置MINICOM
进LINUX系统 开个控制台 字符里输入minicom 就启动了
这时一般还要设置一下
Ctrl+A进入控制界面(Esc返回)按Z进设置
一般设置两个
1 按O(注意:是O不是零)设置第三第四项,分别是串口设置与MODEM设置
串口设置:不用说了吧 进去都看明白了 敲字母 设置相应项目 比如“115200 8-N-1”
MODEM设置:也要设置一下 要不有的看不到东西 把上面两个选项都清空 就是按那行前面的字母(好象是‘A’和什么)然后光标就跳过去了 删之
回车 到开始选第三第四项的菜单 选下面的保存(别忘了保存 菜鸟们常犯)
2 回到刚才按O的界面 看一下P 里面的串口设置对不对
对就不用改了 不对改之

提醒一下:LINUX设备的编号是从0开始的 比如串口1也就是COM1在LINUX里的设备号叫ttyS0
串口设置里面要用到 那里添全部路径也就是'/dev/ttyS0'
好了 就这么简单

uclinux编译文档
user94/mamajinco/upload/1012638628.rarUCLINUX编译的过程是非常折磨人的,我在这整了3天!妈的!把很多公司的都试遍了。第3天的晚上10点搞定了~~

但说真的,很难写下来整体过程,因为跟版本有关,跟各个板子也有关系……

所有的移植都是用2.4做的,谁让咱是菜鸟呢,先从简单的做。
总结几点吧,介绍个现在主流的立宇泰的板子UCLINUX编译方法和我自己拿HFRK的板子提供的UCLINUX改的8019和NFS的方法
一 立宇泰(凭回忆,有些地方当时没记下来)
1下载
arm-elf-tools-20030314.sh//开发工具
uClinux-dist-20040408.tar.gz//源代码包
uClinux-20040408-ARMSYS.rar//立宇泰的补丁
configfiledemo.rar//立宇泰的设置文件

前两个UCLINUX的网站有下的,很快。
后两个立宇泰公司网站有下的,很小,也很快。

2 安装
arm-elf-tools-20030314.sh
在LINUX(我用的VMWARE跑的PC4)下双击,选运行就行,不多说了,有人这里出过问题,提示一个错误,去21IC搜索一下,把一个参数改一下就行。但我的没这个问题。

uClinux-dist-20040408.tar.gz
考到/usr/src/下,右键截压缩到当前目录,也没什么说的。就是记得硬盘要有足够的空间,这个比较大,一般还得有几个备份,得2G左右。

uClinux-20040408-ARMSYS.rar
这个补丁确实不错!!好商家!还共享了,改了一堆文件。
截压缩不说了,得到PARCH文件,拷贝到刚才UCLINUX源代码包目录下,注意,要到uClinux-dist目录里。不是uClinux-dist-20040408.tar.gz目录里。

还不能直接补丁,需要改一下uClinux-dist/vector/Samsung/4510B这个文件夹,直接把名字改成44B0就行了。

打开终端吧,CD到uClinux-dist目录里输入以下命令:
patch -p1 < uClinux-20040408-ARMSYS.patch
注意-P1是数字一不是L字母,命令什么意思就不解释了,GOOGLE一下,有个兄弟专门讲了。
打包到最后会有问题,因为刚才咱们把4510直接改成44B0了嘛,问你问题的时候敲的N吧,退出。
把uClinux-dist/vector/Samsung/44B0里Makefile 和 rc打开,对着uClinux-20040408-ARMSYS.patch改。
具体方法是:双击(这里PC机都默认使用GNOME,比KDE方便,比如双击打开)查看PATCH文件。对着改吧。
补充个语法知识:.patch里面主要有几种符号分别是“+++”“---”'+''-''@@''diff'
每个区域都是diff --- +++ @@四行开始 之后是+ -或者无符号的行,+代表在一个位置加一行,-代表删除一行,什么都不带就什么都不做,用来定位的。
好了,文件最后可以找到 diff uClinux-dist/vector/Samsung/44B0开始的文件了吧?
对着把Makefile 和 rc改了吧。

打完补丁,还得做一件事,把/uClinux-dist/Linux-2.4.x/Driver/Block/blkmem.c改了
#ifdef CONFIG_BOARD_SNDS100
extern char romfs_data[];
extern char romfs_data_end[];
#endif
后加个
#ifdef CONFIG_BOARD_MBA44
extern char romfs_data[];
extern char romfs_data_end[];
#endif

#ifdef CONFIG_BOARD_MBA44
{0, 0xc700000, -1},
#endif
改策成
#ifdef CONFIG_BOARD_MBA44
{0, romfs_data, -1},
#endif

要不编译后的内核运行的时候会有“Kernel panic: VFS: Unable to mount root fs on XXXXX”错误

3 设置
make menuconfig
当然 也可以make Xconfig 但不推荐,虽然显示很好,但速度慢~~
进了菜单,基本就几个键子上 下 左 右 回车 空格。
选什么比较麻烦,建议第一次先用刚才下的configfiledemo立宇泰的设置文件,解压以后是三个文件,分别对应主菜单,内核和用户菜单。
选择Load an Alternate Configuration File
里面输入文件的地址与名称,记得开始的时候说的VMWARE-TOOS共享吧?把这几个文件拷贝到合适的目录下吧,我就放在uClinux-dist-20040408.tar.gz下了。
左右选《EXIT》退出。选保存。

一会自动弹出KERNEL设置菜单,和上面一样Load an Alternate Configuration File,选config_kernel文件。
需要注意的是这里的USB好象不对,因为板子上没整USB(以后再整)就把USB的选项直接去掉了(到USB子菜单下把[*]去了)。
要不会有hcb.c错误。

System Type里要改一下
(Samsung) ARM system type
[*] Set flash/sdram size and base addr
(00800000) (S)DRAM Size
(00200000) FLASH Size
(S3C44B0X-MBA44) Board Implementation

Block devices也改一下
[*] RAM disk support
(4096) Default RAM disk size
(AMD) FLASH type
(AUTO) FLASH size
(AUTO) FLASH bit width

General setup改一下
[*] Timer and CPU usage LEDs
[*] Timer LED
[*] CPU usage LED

其他没说就是别动

左右选《EXIT》退出。选保存

一会自动弹出USER设置菜单,和上面一样Load an Alternate Configuration File,选config_user文件。(语法多整齐)
没有注意了,直接左右选《EXIT》退出。选保存。

说实在的,要是没有这些CONFIG文件,自己改是件很麻烦的事,本人就尝试了自己增加NFS和修改8019(我的板子是自己画的和这个不一样)那叫一个麻烦~~~。建议大家新手还是先把这些顺利的做完了再说改的。

退出以后就是编译了。
4 编译
几大命令
make dep
make clean
make lib_only
make user_only
make romfs
make
顺利的话一次全的执行了,但第3步要是自己鼓捣过在这里就要受苦了,比如后面要讲的把驱动编译进内核里。
这里要说的是,出问题不可怕,但一要做好记录,知道自己改什么,错误可能出现在什么地方,因为报告的错误很可能不是出现错误的位置。二要善于搜索,使用GOOGLE搜索。三 要BBS提问的时候把错误,操作记录都说清楚了,等待高手给你解答。四就是自己要积累看MAKE错误的知识。此外别无他法!

二 好了
我最后用的是HFRK的包,版本是2005311,不用打补丁。但听说所有2005311的包都不用打了,好消息啊。但编译的过程仍然折磨人。
设置与编译的过程仍然和上面一样,这里共项我的CONFIG文件供大家参考吧。就不多说了。
下面说我自己改8019驱动的方法。
8019用的是drivers/net/下的ne.c文件改的。
改之前要差几点:8019是8位还是16位,地址线是怎么对应的(8019是ADDR1对44B0的ADDR几?),8019挂在44B0的哪个BANK上,8019使用哪个中断,中断号多少。

好了,对应的改吧。
先改文件。
drivers/net/ne.c
找到CONFIG_BOARD_MBA44,修改一下中断号dev-irq,改成我们电路中使用的EINT1(中断号24),挂在BANK3上地址0x06000000
……
#elif defined(CONFIG_BOARD_MBA44)
static int once = 0;
if (once)
return -ENXIO;
dev->base_addr = base_addr = 0x06000000;
dev->irq = 24 ;
once++;
……

注意:一定要知道8019地址线是怎么对应的,我的是0对0(8位)但有的朋友8019是7对0,就要改了,但是具体哪个文件忘了,GOOGLE搜索一下吧:)

进make menuconfig里把以下选了
1 General Setup --->
Networking Support

2Networking options --->
Packet socket
TCP/IP networking

3 进Networking device Support---》
4 File system --->
Network device support?

Ethernet (10 or 100Mbit) --->
Other ISA cards
NE2000/NE1000 support
注意:这里通过[ ] 16Bits mode support选择8019工作位,我没选,因为做的是8位的

4 Network Applications --->
arp
ifconfig
inetd
ping
route
好了,之后就是编译了,烧写,然后测试一下PING宿主机,NFS挂一下看看。
注意:宿主机的防火墙要关了,不然PING不通,当然NFS也不行。

好了,编译内核就到这里,因为过于繁琐,只能分部分来简化写了~~大家有问题再交流吧。

搞定UCLINUX移植以后就开始整个最小的程序吧,当然是HELLOWORLD了:)
一 先写个helloworld.c (对于小代码我喜欢先在WINDOW下建个“新建 文本文档.txt”再在里面写代码,然后保存后改名成helloworld.c 注意的是扩展名也要从TXT改成C才行,原来说过,不多说了)
里面写下面等号里的代码:
==================
#i nclude
#i nclude

int main(void)
{
printf('hello world ! I got it!n');
return 0;
}
==================
不用解释了吧:)

二 然后编写个makefile吧,别总用arm-elf-gcc了。
为以后编写大规模程序打个基础:)
建个makefile(和前面一样,先TXT然后改名,没有扩展名)
=====================
EXEC = helloworld
OBJS = helloworld.o

all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

romfs:
$(ROMFSINST) /bin/$(EXEC)
clean:
rm -f $(EXEC) *.elf *.gdb *.o
======================
基本能看明白吧?MAKE的语法比较复杂,就不多讲了,可以看我在前几篇笔记里推荐的ZLG那本书。但幸运的是基本不用自己动手了,LINUX源代码里有很多MAKE 拿来改改吧:)

三 下面就是有朋友问我怎么把程序下到板子里了
一般说来有几种方法。
1 板子挂载宿主机的NFS共享目录,把程序拷贝到/tmp目录(在RAM里)测试一下,但缺点是掉电要消失,只适合做调试时用。
2 做JFFS之类的日志文件系统,和上面一样NFS挂载拷贝过来,JFFS文件系统可以保证掉电不消失,类似U盘里拷贝程序(只是结果类似,原理完全不同)。
3 直接把程序烧写进ROMFS文件系统,这里就只介绍这种。原因有两点 首先 我还没学怎么做JFFS,其次 我还没学怎么做JFFS。哈哈
好了,那开工。

1)在uClinux-dist/user/下建立目录hello
把helloworld.c和makefile拷贝到里面,怎么拷贝不用说了吧?VMWARE-TOOLS共享文件夹吧。

2)修改uClinux-dist/user/makefile

在适当位置 找一行(这句语法扎堆的地方)加
dir_$(CONFIG_USER_HELLO) += hello

3)记住CONFIG_USER_HELLO这个名(自己可以改的 )
在uClinux-dist/config/Configure.help里加(扎堆)下面两行
CONFIG_USER_HELLO
Only print hello world
上面是名(和前面必须一致)下面是注释

4)改uClinux-dist/config/Configure.in里按照扎堆的原则加下面几行
#############################################################################
mainmenu_option next_comment
comment 'Hello World'
bool 'demo' CONFIG_USER_MYAPP_DEMO
endmenu
#############################################################################
#号中间加的就是语法了,基本意思就是在Hello World--->下加个[]demo
编译过内核的都熟悉吧:)

[1] [2] [3] [4] [5] [6]
关键字:ARM  入门笔记 引用地址:网上下的--ARM入门笔记

上一篇:学习ARM开发(23)
下一篇:ARM裸机篇--按键中断

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved