13508|30

241

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

Helper2416-10——裸机第四弹——关狗&调用C函数(附上源码包) [复制链接]

 
本帖最后由 yuanlai2010 于 2014-7-14 08:20 编辑

关狗&调用C函数

参与Helper2416开发板助学计划心得

07-14 应网友要求 已附上源码包 欢迎下载
游客,如果您要查看本帖隐藏内容请回复

直接make就行了



看门狗背景简介:

   看门狗的作用在于监控CPU的运行,保证在诸如噪音和系统错误等这样的故障干扰情况下能尽快恢复正常工作。看门狗与PWM定时器都能实现定时的功能,两者的区别在于看门狗能发出复位信号而PWM定时器不能,后面将会有具体的章节讲解看门狗的定时和复位功能,这里我们只是简单的将其关闭。
程序源码即讲解:
led_blink.S
  1. @******************************************************************************
  2. @ File:led_blink.S
  3. @ 功能:关闭看门狗,跳转到C函数
  4. @******************************************************************************   
  5. .text
  6. .global _start
  7. _start:
  8.                 LDR                R0,        =0x53000000         @关闭看门狗
  9.                 MOV  R1, #0x00
  10.                 STR                R1,        [R0]
  11.                
  12.                 LDR     R0,        =0x56000010                @ 把GPB1配置为输出模式
  13.                 MOV     R1,        #0x00000004
  14.                 STR     R1,        [R0]
  15. MAIN_LOOP:                  
  16.                 LDR     R0,        =0x56000014     @ GPB1输出低点亮LED
  17.                 MOV     R1,        #0x00000000
  18.                 STR     R1,        [R0]
  19.                
  20.                 MOV                R0,        #0x400                        @用R0传递参数
  21.                 BL                delay                                @跳转到C函数:延时
  22.                
  23.                 LDR     R0,        =0x56000014     @ GPB1输出高熄灭LED
  24.                 MOV     R1,        #0x00000002
  25.                 STR     R1,        [R0]
  26.                
  27.                 MOV                R0,        #0x400                        @用R0传递参数
  28.                 BL                delay                                @跳转到C函数:延时

  29.                 B       MAIN_LOOP                        @不断循环
  30.                         
  31. .end
  32.                         
复制代码
1:用汇编手动关闭了看门狗。
2:调用C函数实现延时功能,这里并没有手动设置堆栈,目的在于测试IROM有没有帮我们设置好栈。

delay.c
  1. void delay(unsigned int time)
  2. {
  3.         unsigned int i=0,j=0;
  4.         for(i=0;i<time;i++)
  5.                 {
  6.                         for(j=0;j<1000;j++);
  7.                 }
  8. }
复制代码
*:汇编调用C函数时,当参数个数不超过4个,使用r0~r3这4个寄存器来传递参数;如果参数个数超过4个,剩余的参数通过栈来传递,delay()只有1个参数,所以用r0来传递。



编译代码及烧写:

这里还是附上连接脚本和Makefile吧!

link.lds

  1. MEMORY
  2. {
  3.     IRAM_MEM :   o = 0x40000000,  l = 0x1FFF      /* 8k internal Memory */
  4. }

  5. OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
  6. OUTPUT_ARCH(arm)

  7. SECTIONS
  8. {
  9.                 .start :
  10.         {
  11.             . = ALIGN(4);
  12.             led_blink.o        (.text)
  13.         } >IRAM_MEM
  14.                
  15.         .text :
  16.         {
  17.             . = ALIGN(4);
  18.             *(.text*)
  19.             *(.rodata*)
  20.         } >IRAM_MEM

  21.         .data :
  22.         {
  23.             . = ALIGN(4);
  24.             *(.data*)
  25.         } >IRAM_MEM

  26.         .bss :
  27.         {
  28.             . = ALIGN(4);
  29.             *(.bss*)
  30.             *(COMMON)
  31.         } >IRAM_MEM

  32. }
复制代码
Makefile:

  1. led_blink.bin :led_blink.o delay.o
  2.         arm-linux-ld -Tlink.lds -o led_blink.elf $^
  3.         arm-linux-objdump -D led_blink.elf > led_blink_elf.dis
  4.         arm-linux-objcopy -O binary -S led_blink.elf led_blink.bin
  5.         gcc mk2416sdbin.c -o mk2416sdbin
  6.         ./mk2416sdbin led_blink.bin app.bin
  7. %.o : %.S
  8.         arm-linux-gcc -o $@ [        DISCUZ_CODE_3        ]lt; -c

  9. %.o : %.c
  10.         arm-linux-gcc -o $@ [        DISCUZ_CODE_3        ]lt; -c
  11.         
  12. clean:
  13.         rm -f  mk2416sdbin led_blink.elf led_blink_elf.dis *.bin *.o
复制代码
其中
mk2416sdbin的作用是制作可以在SD启动的bin文件,源码在之前的帖子中:

编译:直接cd到工程目录后make即可

烧写:用IROM_Fusing_Tool直接烧写app.bin到SD卡即可

运行效果及结论:

效果:LED成功闪烁起来



结论:IROM已初始化栈

论坛ID:yuanlai2010


发表时间:2014-07-13



最新回复

太给力了  详情 回复 发表于 2015-6-11 20:55
点赞 关注

回复
举报

267

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
diso
 
 

回复

187

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
看看
 
 
 

回复

496

帖子

18

TA的资源

一粒金砂(高级)

4
 
谢谢分享!!!
 
个人签名相由心生,境随心转,一切法从心想生。
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

5
 
追了楼主八九个帖子了,继续学习
 
 
 

回复

240

帖子

4

TA的资源

一粒金砂(中级)

6
 
谢谢楼主    学习
 
 
 

回复

26

帖子

1

TA的资源

一粒金砂(中级)

7
 
学习了
 
 
 

回复

240

帖子

4

TA的资源

一粒金砂(中级)

8
 
楼主,能否请教个问题,非常感谢!
这个点亮LED的裸机程序,没有初始化系统时钟及PLL寄存器,这些设置是由哪段代码控制的呢?
默认情况下Msysclock是多少呢(我看友善的板子是800M),PCLK又是多少呢?HCLK呢?

点评

时钟和PLL以及堆栈什么的都是在IROM里面初始化的,SD卡启动就是IROM启动模式中的一种方式,至于具体的时钟配置为多少,我也不是很清楚,官方的文档没有讲清楚,或者是我没看仔细!希望能帮助到你  详情 回复 发表于 2014-7-15 21:58
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

9
 
abszy 发表于 2014-7-15 21:28
楼主,能否请教个问题,非常感谢!
这个点亮LED的裸机程序,没有初始化系统时钟及PLL寄存器,这些设置是由 ...

时钟和PLL以及堆栈什么的都是在IROM里面初始化的,SD卡启动就是IROM启动模式中的一种方式,至于具体的时钟配置为多少,我也不是很清楚,官方的文档没有讲清楚,或者是我没看仔细!希望能帮助到你

 
 
 

回复

65

帖子

2

TA的资源

一粒金砂(中级)

10
 
下载下来测试一下我的TF卡能不能启动,反正我的TF卡是启动不了UBOOT
 
 
 

回复

65

帖子

2

TA的资源

一粒金砂(中级)

11
 
测试过,可以从SD卡启动,但是我烧写mvoi版本的UBOOT确无法SD卡启动它,不知为什么,楼主,可否指点一二。

点评

不是很明白你的意思,但是movi版本的UBOOT是可以直接烧到SD启动的啊,我这里用的制作能从SD启动的bin文件的程序只能处理小于8KB的文件  详情 回复 发表于 2014-7-17 13:03
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

12
 
fwjieok 发表于 2014-7-17 12:31
测试过,可以从SD卡启动,但是我烧写mvoi版本的UBOOT确无法SD卡启动它,不知为什么,楼主,可否指点一二。

不是很明白你的意思,但是movi版本的UBOOT是可以直接烧到SD启动的啊,我这里用的制作能从SD启动的bin文件的程序只能处理小于8KB的文件
 
 
 

回复

65

帖子

2

TA的资源

一粒金砂(中级)

13
 
我的意思是,我把uboot烧到TF卡 上不能启动啊,是不是因为我是8G的SDHC卡啊,我也很不明白,就是烧写UBOOT不能启动,但是测了下你的代码,是可以从SD卡启动流水灯的

点评

8G的卡也是可以支持的,最大支持32G,但是如果卡不是足容量(或者叫做扩容的假卡)的话可能就不行,  详情 回复 发表于 2014-7-17 13:29
我的代码能启动的话,那就不是SD卡的问题,你烧的是哪个UBOOT?我试一试!  详情 回复 发表于 2014-7-17 13:14
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

14
 
fwjieok 发表于 2014-7-17 13:06
我的意思是,我把uboot烧到TF卡 上不能启动啊,是不是因为我是8G的SDHC卡啊,我也很不明白,就是烧写UBOOT ...

我的代码能启动的话,那就不是SD卡的问题,你烧的是哪个UBOOT?我试一试!

点评

u-boot.534.64m-movi.bin 在光盘目录下的image文件夹,应该没烧错吧,,烧进去候,死活打印不出Uboot  详情 回复 发表于 2014-7-18 14:24
 
 
 

回复

554

帖子

0

TA的资源

版主

15
 
fwjieok 发表于 2014-7-17 13:06
我的意思是,我把uboot烧到TF卡 上不能启动啊,是不是因为我是8G的SDHC卡啊,我也很不明白,就是烧写UBOOT ...

8G的卡也是可以支持的,最大支持32G,但是如果卡不是足容量(或者叫做扩容的假卡)的话可能就不行,
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

回复

65

帖子

2

TA的资源

一粒金砂(中级)

16
 
yuanlai2010 发表于 2014-7-17 13:14
我的代码能启动的话,那就不是SD卡的问题,你烧的是哪个UBOOT?我试一试!

u-boot.534.64m-movi.bin   在光盘目录下的image文件夹,应该没烧错吧,,烧进去候,死活打印不出Uboot

点评

我刚才也试了一下,确实不能打印出信息,但是烧写u-boot.600.64m-movi.bin是可以的!  详情 回复 发表于 2014-7-18 14:46
 
 
 

回复

241

帖子

4

TA的资源

纯净的硅(初级)

17
 
fwjieok 发表于 2014-7-18 14:24
u-boot.534.64m-movi.bin   在光盘目录下的image文件夹,应该没烧错吧,,烧进去候,死活打印不出Uboot

我刚才也试了一下,确实不能打印出信息,但是烧写u-boot.600.64m-movi.bin是可以的!

点评

,多谢楼主,刚才试了一下u-boot.600.64m-movi.bin,确实可以了,我一直试的534xx.xx.bin,不行,还咨询过老板,他让我烧这个,结果一直不能启动,这下能启动就好办多啦  详情 回复 发表于 2014-7-20 20:11
 
 
 

回复

65

帖子

2

TA的资源

一粒金砂(中级)

18
 
yuanlai2010 发表于 2014-7-18 14:46
我刚才也试了一下,确实不能打印出信息,但是烧写u-boot.600.64m-movi.bin是可以的!

,多谢楼主,刚才试了一下u-boot.600.64m-movi.bin,确实可以了,我一直试的534xx.xx.bin,不行,还咨询过老板,他让我烧这个,结果一直不能启动,这下能启动就好办多啦

点评

我让你烧那个??? 可能有时候我说得也不对,你还是好好看手册吧!  详情 回复 发表于 2014-7-20 20:26
 
 
 

回复

554

帖子

0

TA的资源

版主

19
 
fwjieok 发表于 2014-7-20 20:11
,多谢楼主,刚才试了一下u-boot.600.64m-movi.bin,确实可以了,我一直试的534xx.xx.bin,不行 ...

我让你烧那个???
可能有时候我说得也不对,你还是好好看手册吧!
 
个人签名My dreams will go on...
http://www.jyxtec.com
 
 

回复

113

帖子

0

TA的资源

一粒金砂(中级)

20
 
看看.....
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表