秋月通商出的AKI-H8开发板的开发环境非常简陋,但是作为系统学习嵌入式的教材非常不错,可以让学习者接触到编程中很底层的东西。
1:首先,从秋月通商得到的开发资料中提取ASM编译器和CC编译器,并将其的地址添加到PATH中。
2:因为程序开发都是使用C语言,那么就会经常使用到C的标准函数,而在连接的时候就会出现无法连接的情况。如果将ASM和CC中的文件放在一个文件夹里,那么就没什么问题了,但是如果想分开放置的话,一个比较简单的方法就是将CC下的两个lib文件放到ASM下去。这样连接就可以顺利通过。
3:选择软件运行模式。对于每个芯片都有很多种运行模式,不同的模式内存,引脚都不同。关于内存的分配对于Windows软件开发来说是不需要设置的,但是在单片机中代码被写在什么位置非常重要,单片机里存储空间分为ROM和RAM,什么东西放在什么地方都是要事先设计好的。
H8使用了7中工作模式,对于不同的模式它的寻址能力是不同的,简单的说,在需要很大的内存的时候就可以把更多的引脚拿去作为寻址的地址线使用,而在需要更多的引脚做I\O的时候,就把引脚去做I\O信号。
模式1,2 : 最大ROM 1M(无内藏ROM),对外引脚数多,外部ROM地址范围为H'60000-H'7FFFF。
引脚的分布,ROM地址完全相同,不同的只是BUS的初期状态不同(初始出力\入力\挂起)
模式3,4 : 最大ROM 16M(无内藏ROM),,对外引脚数多,外部ROM地址范围为H'600000-H'7FFFFF。
引脚的分布,ROM地址完全相同,不同的只是BUS的初期状态不同(初始出力\入力\挂起)
模式5 : 最大ROM 1M,对外引脚数多,外部ROM地址范围为H'80000-H'9FFFF。
模式6 : 最大ROM 16M,对外引脚数少,外部ROM地址范围为H'600000-H'7FFFFFF。
模式7 : 最大ROM 32K,对外引脚多,外部ROM无【单片机推荐模式】
对于大部分的芯片来说,选择模式都是要从硬件上来改变的,也就是设置跳线,然后基于这个模式设计代码。
4:H8程序开发主要是使用C语言,也就是说编译的对象主体是C语言,只有少量的启动代码是汇编,这也就是说需要一个混合的编译连接过程。假设我们写了一段C代码保存为text.c
2
3 void main()
4 {
5 while ( 1 )
6 SetLED( 0 , GetLED( 0 ) ^ 0x01 ) ;
7 }
8 }
9
一段ASM代码保存为Start.asm
2 .SECTION V,CODE,LOCATE = H ' 000000
3 .IMPORT _main
4
5 .DATA.L _start
6 .DATA.L int_error
7 .DATA.L int_error
8 .DATA.L int_error
9 ...省略部分
10 IRQ0: .DATA.L int_error
11 IRQ1: .DATA.L int_error
12 IRQ2: .DATA.L int_error
13 IRQ3: .DATA.L int_error
14 IRQ4: .DATA.L int_error
15 IRQ5: .DATA.L int_error
16
17 .SECTION P,CODE,ALIGN = 2
18 _start:
19 mov.l #H ' 0FFFF10, er7
20 jmp @_main
21 int_error:
22 rte
23
24 .SECTION D,DATA
25 .END
26
27
编译C代码: cc38h -cpu=300ha -include=C:\DevelopKit\H8\ASM, %CD%\src\ src\test.c
编译汇编代码:a38h src\start.asm
代码成功编译,怎么连接?怎么解决ROM上放置的问题?
5:使用连接脚本
连接代码要使用l38h连接器,它的输入为“ -subcommand = xxxxxx.sub”,一个扩展名为sub的脚本文件。
OUTPUT test
PRINT main
INPUT start, test
LIB C:\DevelopKit\H8\ASM\c38hab
START R(0FFEF10),P(200),D(8000),C(9000)
ROM (D,R)
EXIT
OUTPUT : 连接的结果文件名
PRINT : MAP文件名,如果写#则在标准输出上显示,这个段可以写为【NOPRINT】,表示不处理MAP。
INPUT : 连接源文件,用逗号分开
LIB : 连接的库文件地址
START : 段分区地址设置,这是最重要的设置。
P:代码段起始位置
C:常数起始位置 例:static const char* Path = “xxxxx”;
D:数据区起始位置
R:函数栈区域(一定是RAM区)
B:为初始化数据区起始位置(也一定是RAM区)
看起来头昏眼花的,但是对大部分代码时C语言写的情况下,C自己并不会理会C,D,B区的情况,而是编译到一个整体后作为一个整
体放置到ROM中。所以一定要设置的就是P和R。
ENTRY 指定程序的入口地址,如果没有指定就从P的第一个SECTION开始执行。
ROM 指定初始化RAM区域的设置。
设置完毕后调用
l38h -subcommand = LnkScript.sub
完成连接,最后使用
c38h test
转换为MOT文件进行烧写
(以上)