作者:GWD 时间:2019.7.6
一、课程内容
1、改进上一节的LED灯程序,改进内容如下1)、关闭看门狗防止程序终止死循环;2)、程序自动识别nor启动或者nand启动,烧写代码进不同的存储器;3)、引入宏定义头文件;
1)、问:如何关闭看门狗?
答:
2)、问:如何实现代码自动判断nor或者nand启动,将程序烧写进不同的地址?
答:nor时不可以直接写入的,利用这个特点写入一个值给地址0,然后判断与之前的值一样否?若一样就是nand否则是nor。
2.使用按键控制LED灯程序,按一个亮一个。
二、学习要点:
1、问:在按键控制程序中为什么三盏灯上电就常亮?
答:在引脚做输出时要在程序中做高电平初始化。
三、代码:
(一)led改进代码
1、代码功能;
2、代码:
1)、查询手册,和原理图确定LED引脚
Led.c
#include "s3c2440_soc.h"
int led_on(unsigned int num)
{
if(0 == num )
{
GPFCON = 0x100;
GPFDAT &= ~(1<<4);
}
if(1 == num )
{
GPFCON = 0x400;
GPFDAT &= ~(1<<5);
}
if(2 == num )
{
GPFCON = 0x1000;
GPFDAT &= ~(1<<6);
}
return 0;
}
int delay(unsigned int timer)
{
while(timer--);
}
Start.S
.text
.global _start
_start:
/*关闭看门狗*/
ldr r0,=0x53000000
mov r1,#0;
str r1,[r0]
//设置nor或者nand
mov r0,#0
ldr r1,[r0]//立即数加取地址符
str r0,[r0]
ldr r2,[r0]//外人,邻居的角色
cmp r0,r2
ldr sp,=0x40000000+4096
moveq sp,#4096
streq r0,[r1]
mov r0,#0
bl led_on
ldr r0,=100000
bl delay
mov r0,#1
bl led_on
ldr r0,=100000
bl delay
mov r0,#2
bl led_on
LOOP:
b LOOP
(二)、按键点亮LED灯泡代码
1、代码功能:使用按键控制LED灯程序,按一个亮一个
2、代码
1)、查询原理图,找到三个按键的引脚;
2)、EINT0控制LED0, EINT2控制LED1, EINT11控制LED2
3)、代码
Led.c
#include "s3c2440_soc.h"
int main(void)
{
int val ;
GPFCON &= ~((3<<8) | (3<<10) | (3<<12));
GPFCON |= ((1<<8) | (1<<10) | (1<<12));
GPFCON &= ~((3<<0) | (3<<4)); /* gpf0,2 */
GPGCON &= ~((3<<6)); /* gpg3 */
while(1)
{
if( GPFDAT &(1<<0) )
{
GPFDAT |= (1<<6);
}
else
{
GPFDAT &= ~(1<<6);
}
if( GPFDAT &(1<<2) )
{
GPFDAT |= (1<<5);
}
else
{
GPFDAT &= ~(1<<5);
}
if( GPGDAT &(1<<3) )
{
val = 0;
GPFDAT |= (1<<4);
}
else
{
val = 3;
}
if( val == 3 )
{
GPFDAT &= ~(1<<4);
}
}
return 0;
start.S
.text
.global _start
_start:
/*关闭看门狗*/
ldr r0,=0x53000000
mov r1,#0;
str r1,[r0]
//设置nor或者nand
mov r0,#0
ldr r1,[r0]//立即数加取地址符
str r0,[r0]
ldr r2,[r0]//外人,邻居的角色
cmp r0,r2
ldr sp,=0x40000000+4096
moveq sp,#4096
streq r0,[r1]
bl main
LOOP:
b LOOP