流水灯


本文是基于韦东山视频的学习笔记

汇总点这

汇编文件

看门狗

上篇的程序实际上是有缺陷的,在程序运行一段时间后,程序会自动由头重新开始,这都是开门狗的作用,目前都不用开门狗,所以这次先把看门狗关了。

先在手册上找到这一章,看来寄存器就是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; /*  */
	} 
}	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值