1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
看门狗
一般CPU的设计在CPU启动后看门狗默认是工作的,在S5pV210内部的iROM代码(BL0)中,其实已经关过看门狗了。很多CPU内部是没有BL0的因此都要在启动代码的前段自己写代码关闭看门狗。 如果看门狗没有关闭,需要在启动代码前段先去关闭看门狗。如果没有关闭且没有喂狗,看门狗就会复位。一般关闭看门狗,在需要时打开看门狗,一旦打开就必须提供喂狗。 在正常程序之前关闭看门狗,一般来说关闭看门狗越早越好。 //看门狗控制寄存器的地址为0xE2700000 //在该地址的第五位是看门狗的使能位 //所以以下代码关闭看门狗 ldr r0, =0xE2700000 ldr r1, =0x0 str r1, [r0] 因为汇编语言的繁琐性,所以在编写程序时,一般都是使用汇编编写启动代码,然后调用C语言的函数执行。而汇编编写的启动代码,为C语言提供运行时环境。C语言运行时主要需要栈。 C语言与栈的关系:C语言中的局部变量都是用栈来实现的,如果汇编没有为C预先设置合理合法的栈地址,C代码中的局部变量就会落空,整个程序就死掉了。 在51等单片机中,由硬件初始化时提供了默认的可用栈。在应用程序编写的C程序,编译器gcc在链接时自动添加一个头,这个头就是一段引导C程序能够执行一段汇编实现的代码,这段代码中完成了相应的设计。 在ARM的37个寄存器中,每种模式下都有一个独立的sp寄存器(r13)这样避免了多个程序共用一个栈,当一个程序崩溃时,所有的同时崩溃。 s5pv210系统复位后直接默认进入SVC模式,所以直接设置sp即可。 CPU刚复位(刚启动)外部的DRAM没有初始化,所以的可用的内存只有内部的SRAM(不需初始化即可使用)因此只能在SRAM中找一段内存来作为SVC的栈。 栈的类型分为四种:满减栈,满增栈,空减栈,空增栈 满栈:先移动sp指针,再存数据 在S5pv210中的SRAM数据手册中,有专门的栈区域,因此,不需要我们自己去寻找栈的内存,只要将sp指向该区域即可。通常我们使用栈都是使用满减栈。所以令sp=0xd0037D80 具体的启动代码的编写和C语言函数的编写如下: 首先在start.S中编写启动代码: 第一步:关闭看门狗 第二步:设置C语言的栈 第三步:调用C语言函数 第四步:死循环 具体代码: .global _start _start: ldr r0, =0xE2700000 ldr r1, =0x0 str r1, [r0] ldr sp, =0xd0037d80 bl led_blink b . 在led_upgrade.c文件中编写C函数,将之前使用汇编点亮的LED使用C语言再次点亮。 具体操作代码如下: #define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 #define rGPJ0CON *((volatile unsigned int *)GPJ0CON) #define rGPJ0DAT *((volatile unsigned int *)GPJ0DAT) void delay(void); void led_blink(void) { //unsigned int *add = (unsigned int *)GPJ0CON; //unsigned int *data = (unsigned int *)GPJ0DAT; rGPJ0CON = 0x11111111; while(1) { rGPJ0DAT = (1<<3)|(1<<4)|(0<<5); delay(); rGPJ0DAT = (1<<3)|(0<<4)|(1<<5); delay(); rGPJ0DAT = (0<<3)|(1<<4)|(1<<5); delay(); rGPJ0DAT = (0<<3)|(1<<4)|(1<<5); delay(); rGPJ0DAT = (0<<3)|(0<<4)|(1<<5); delay(); rGPJ0DAT = (0<<3)|(0<<4)|(0<<5); delay(); } } void delay(void) { volatile unsigned int i = 1000000; while(i--); } 在C代码和汇编启动代码编写完成以后,需要在Makefile中做一点小小的改变 led.bin:start.o led_upgrade.o //在依赖部分需要添加C代码的文件 arm-none-linux-gnueabi-ld -Ttext 0x0 -o led.elf $^ arm-none-linux-gnueabi-objcopy -O binary led.elf led.bin arm-none-linux-gnueabi-objdump -D led.elf >led.dis %.o:%.S arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib//在编译器后加-nostdlib意思是不使用标准库进行编译,防止命名冲突。 %.o:%.c arm-none-linux-gnueabi-gcc -o $@ $< -c -nostdlib clean: rm *.o *.elf *.bin *.dis -f |
|
|
|
只有小组成员才能发言,加入小组>>
788 浏览 0 评论
1151 浏览 1 评论
2527 浏览 5 评论
2860 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2709 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1068浏览 3评论
193浏览 2评论
455浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 18:37 , Processed in 0.990708 second(s), Total 74, Slave 55 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号