本文是基于韦东山视频的学习笔记
汇编文件
看门狗
上篇的程序实际上是有缺陷的,在程序运行一段时间后,程序会自动由头重新开始,这都是开门狗的作用,目前都不用开门狗,所以这次先把看门狗关了。
先在手册上找到这一章,看来寄存器就是WTCON,第零位就是开关的,把第零位设置为0就可以了,简单。
代码
不仅在开头关闭了开门狗,也加入了自动判别nor启动和nand启动的代码。
.text
.global _start
_start:
/* 关闭看门狗 */
ldr r0, =0x53000000
ldr r1, =0
str r1, [r0] /* 把WTCON第零位设置为0,关看门狗 */
/* 设置sp栈,自动识别nor启动还是nand启动
* nor启动时对应nor flash,nand启动时对应片内内存
* 在nor flash 写数据时必须有一定格式,否则写入不了数据
* 把0写入0地址,再读出来看有没有修改,有修改就是nand启动,没修改就是nor启动
*/
mov r1, #0
ldr r0, [r1] /* 先把[0]地址的值备份到r0 */
str r1, [r1] /* 把0写入[0]地址 */
ldr r2, [r1] /* 再把[0]地址的值读出来 */
cmp r1,r2 /* 比较 */
ldr sp, =0x40000000+4096 /* nor启动 */
moveq sp , #4096 /*nand 启动*/
streq r0, [r1] /* 恢复数据 */
bl main
halt:
b halt
C文件
我们看回原理图,LED1、2、4 分别对应GPF4、5、6,我们一一对应即可。
关于寄存器可以看回 Linux嵌入式学习——点个灯(二)
void delay(volatile d)
{
while(d--);
}
int main(void)
{
unsigned int *pGPFCON = (unsigned int *)0X56000050;
unsigned int *pGPFDAT = (unsigned int *)0X56000054;
int val = 0;
*pGPFCON &= ~((3<<8)| (3<<10) | (3<<12)); /* 把GPFCON 8~13位清零 */
*pGPFCON |= ((1<<8)| (1<<10) | (1<<12)); /* 把GPFCON 9、11、13位置1,即设置为输出模式*/
/*
while(1)
{
*pGPFDAT &= ~(7<<4); /* 清零
*pGPFDAT |= (val<<4);
delay(100000);
val++;
if (val ==8)
val =0;
}
*/
val = 4;
while(1)
{
*pGPFDAT |= (7<<4); /* 把GPFDAT 4~6置1,即熄灭LED */
*pGPFDAT &= ~(1<<val); /* 循环点亮 */
delay(100000);
val++;
if(val==7) val=4; /* */
}
}