dspic33ep128MC506汇编C语言2——启动文件的编写

.include "..\include\p33EP128MC506.inc"

头文件包含

.section .start_section,code

代码段的定义

.global __reset

标识符声明
接下来要写启动文件的实现功能:关闭中断,关闭看门狗、堆栈设置、数据RAM清零、跳转主程序

一、关闭中断 在这里插入图片描述

在这里插入图片描述
将IPL<2:0>设置为111即可关闭中断,我们采用或操作,将该寄存器和00E0(即0000 0000 1110 0000)进行或操作,可改变IPL<2:0>数据,而对其它位数据进行保留。

	mov   SR,w0  //将SR数据送入到w0
    mov   #0x00e0,w1 //将0x00e0送入到w1
    ior   w0,w1,w0  //进行或操作
    mov   w0,SR //将w0中的数据送入到SR

ior表示将w0和w1的数据或操作后,结果送入到w0中。另外代码中w0,w1都表示该单片机的工作寄存器。
在这里插入图片描述

二、关闭看门狗

在这里插入图片描述
在这里插入图片描述
关闭看门狗,我们只需在RCON寄存器对bit5为0,即可禁止看门狗,我们对该寄存器执行与操作,使得只改变该位的数据,而不改变其它为的数据。

    mov  RCON,w0 
    mov  #0xffdf,w1 
    and w0,w1,w0  //1111 1111 1101 1111 & w0
    mov w0,RCON

三、堆栈设置

在链接描述文件中间中定义:

 .stack 0x1050(NOLOAD):
 {
    __SP_init = .;/*-堆栈起始地址为0x1050--*/
    . += 0x00a8;/*--堆栈大小为168字节---*/
    __SPLIM_init = .;/*---堆栈限制上溢地址为0x10F8--*/
    . += 0x0008;
 } > data

在这里插入图片描述
在启动文件中设置:

    mov	    #__SP_init,w15  ;堆栈的开始
    mov	    #__SPLIM_init,w0
    mov	    w0,SPLIM ;堆栈限制寄存器

四、数据RAM清除

在这里插入图片描述
将 RAM 从 0x1000 - 0x4FFFE 范围数据清 0

    mov #0x1000,w0
    mov #0x5000,w1
    clr [w0++] //清零
    xor w0,w1,w2 //异或
    bra NZ,$-4  //非零跳转

[w0++]表示w0中的数据地址里的值,即一开始w0存放0x1000,接着是clr [w0++]清除0x1000地址中数据单元的值,并递增一个字即0x1002。以一个例子说明如下:
在这里插入图片描述
w0为何是加2,而不是加1,是因为该指令是16 位操作,只需要考虑偶数地址,每次清 2 个字节,每次把奇数地址和偶数地址都清了
下一步 xor w0,w1,w2,xor是异或指令,w0和w1数据相同则w2为0,不同为1,这条指令的目的是判断RAM清零数据有没有全部清零。值得一提的是,为什么第二条指令w1要存放0x5000而不是0x4FFE,原因是当w0加到0x4FFE时,clr指令清零0x4FFE数据单元里的值,然后加2,此时RAM空间已经全部清零,循环结束,w0变为0x5000,故要和0x5000做比较而不是0x4FFE.
bra NZ,$-4 bra为转移指令,具体用法如下:
在这里插入图片描述
$-4表示PC值减4,由于每执行一条指令PC值加2,所以是跳到clr [w0++] 指令。具体来说,当w0和w1不同时,即异或操作后输出为1,bra NZ 判断非零时,就跳到clr [w0++]指令进行数据清零,知道所有数据清零后才退出循环。

五、跳转主程序

以上单片机在启动前所有配置设置完毕后,就要跳到主程序了,只需一条指令:

goto _main

六、启动文件完整代码

.include "..\include\p33EP128MC506.inc"
.section .start_section,code
.global __reset
.global _main
 __reset: 
   /*------------关闭中断----------*/
    mov   SR,w0
    mov   #0x00e0,w1
    ior   w0,w1,w0
    mov   w0,SR     
  /*------------关闭看门狗----------*/
    mov  RCON,w0
    mov  #0xffdf,w1
    and w0,w1,w0
    mov w0,RCON
  /*------------堆栈设置----------*/
    mov	    #__SP_init,w15  ;堆栈的开始
    mov	    #__SPLIM_init,w0
    mov	    w0,SPLIM ;堆栈限制寄存器
    /*------------RAM清零----------*/
    mov #0x1000,w0
    mov #0x5000,w1
    clr [w0++]
    xor w0,w1,w2
    bra NZ,$-4
    /*------------主程序跳转----------*/
    goto _main
    .end

启动先从__reset ,汇编要以.end 结束文件。链接文件定义了 复位跳转地址,复位跳转地址就是__reset。所以我们的启动文件从__reset 处开始往下执行
在这里插入图片描述
在这里插入图片描述

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

硬件菜菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值