点亮开发板上的led灯,需先查看原理图,找到对应引脚,以及搞清楚原理图,如何电路上灯会亮。
1、看原理图 JZ2440v2_sch.pdf 找到对应的引脚
nLED_1 对应 GPF4
nLED_2 对应 GPF5
nLED_4 对应 GPF6
2、看芯片手册 S3C2440A_UserManual_Rev13.pdf 设置对应 I/O 寄存器
CPFCON 控制寄存器
GPFCON 数据寄存器
将引脚对应控制寄存器设置为输出,数据寄存器设置为0(表示输出低电平),即可点亮对应LED灯
汇编点亮nLED_1代码如下:
.global _start
_start:
LDR R0,=0x56000050 @ R0设为 GPFCON 寄存器
@ 此寄存器用于选择端口各引脚的功能
@ 是输出、输入还是其他
MOV R1,#0x00000100
STR R1,[R0] @ 设置 GPF4 为输出口, 位[9:8] = 01
LDR R0,=0x56000054 @ R0设为 GPFDAT 寄存器
@ 用于读/写端口引脚的数据
MOV R1,#0x00000000 @ 将此值改为 0x00000010 可让LED熄灭
STR R1,[R0] @ GPF4 输出0,点亮LED1
MAIN_LOOP:
B MAIN_LOOP
在使用C语言写裸机程序时,需要自己编写启动文件。(常规程序中,启动文件是由操作系统完成的,而逻辑中没有操作系统)启动文件的功能是初始化堆栈,调用 main 函数, 当 main 函数执行完返回时,做清理工作。
启动文件至少包含:
软件初始化:
1、设置栈:所谓设置栈就是将 栈指针(sp=>)指向内存,当内存为 片内的SRAM时,可以直接使用,而为SDRAM时,需要先初始化。
2、设置返回地址。
3、调用 main 函数。
4、清理工作。(一般用来回收资源等)
硬件的初始化:
1、关闭看门狗。当 2440 启动时,看门狗就会倒计时,如果3秒内没有关闭它,它就会重启开发板。
2、初始化时钟。2440 最快可以跑到 400 Mhz。但是上电的时候时钟频率只有 12 Mhz。
3、初始化SDRAM。
启动文件内容:
@******************************************************************************
@ File:crt0.S
@ 功能: 启动文件(通过它转入C程序)
@******************************************************************************
.text
.global _start
_start:
ldr r0, =0x53000000 @ WATCHDOG 寄存器地址
mov r1, #0x0
str r1, [r0] @ 向watchdog寄存器写入0,禁止watchdog。否则cpu不断重启。
ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4K,因为现在可用的内存只有4K
@ nand flash 中的代码在复位后会移动到内部ram中,此ram 只有4K
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop
C语言点亮 nLED_1 (实现汇编同样的功能)源码:
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
int main(int argc,char **argv){
GPFCON |= (1 << 8); // 设置GPF4为输出口, 位 [9:8] = 01
GPFDAT &= (0 << 4); // GPF4输出0,点亮LED
return 0;
}
C语言写一个流水灯
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define CPF4_OUT (1 << 8)
#define CPF5_OUT (1 << 10)
#define CPF6_OUT (1 << 12)
void delay_time(unsigned int sec){
for(;sec > 0; sec--);
}
int main(int argc, char **argv){
GPFCON = CPF4_OUT | CPF5_OUT | CPF6_OUT;
unsigned int i = 0;
while(1){
delay_time(4000);
GPFDAT = (~(i << 4));
if(++i == 8)
i = 0;
}
return 0;
}
C语言写一个按键控制灯
与点灯原理一样,只是多了一部分(需要判断按键是否按下)。那么需要查看原理图,找到按键对应的引脚,以及如何判断按键按下还是松开。需要设置哪些寄存器。
1、查看原理图 JZ2440v2_sch 找到按键对应的引脚
s2 对应 GPF0
s3 对应 GPF2
s4 对应 GPG3
2、看芯片手册 S3C2440A_UserManual_Rev13.pdf 设置对应 I/O 寄存器
GPFCON 控制寄存器
GPFCON 数据寄存器
GPGCON 控制寄存器
GPGDAT 数据寄存器
将引脚对应控制寄存器设置为输入,读取数据寄存器的值,为0(表示接通低电平),即相应按键被按下,点亮需要控制的led,检测到1,说明松开按键,熄灭要控制的led。
源码:
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064)
//将 led 对应的引脚设置为 输出
#define GPF4_OUT (1 << 8)
#define GPF5_OUT (1 << 10)
#define GPF6_OUT (1 << 12)
//led 控制寄存器掩码
#define GPF4_MASK (3 << 8)
#define GPF5_MASK (3 << 10)
#define GPF6_MASK (3 << 12)
//将 按键对应的引脚设置为 输入
#define GPF0_IN (0 << 0)
#define GPF2_IN (0 << 4)
#define GPG3_IN (0 << 6)
//按键控制寄存器掩码
#define GPF0_MASK (3 << 0)
#define GPF2_MASK (3 << 4)
#define GPG3_MASK (3 << 6)
int main(int argc, char **argv){
GPFCON &= ~(GPF0_MASK | GPF2_MASK | GPF4_MASK | GPF5_MASK | GPF6_MASK);
GPFCON |= (GPF4_OUT | GPF5_OUT | GPF6_OUT | GPF0_IN | GPF2_IN);
GPGCON &= ~GPG3_MASK;
GPGCON |= GPG3_IN;
unsigned long dwDat;
while(1){
//取出数据寄存器的值,判断响应数据位为 1 还是 0 ,0点亮对应LED
dwDat = GPFDAT;
if (dwDat & 1)
GPFDAT |= (1 << 4);
else
GPFDAT &= ~(1 << 4);
if (dwDat & (1 << 2))
GPFDAT |= (1 << 5);
else
GPFDAT &= ~(1 << 5);
dwDat = GPGDAT;
if (dwDat & (1 << 3))
GPFDAT |= (1 << 6);
else
GPFDAT &= ~(1 << 6);
}
return 0;
}
以上C语言,在编译的时候需要和启动文件一起编译。下面是最后一个程序为例子的简单Makefile。
key_led.bin : crt0.S key_led.c
arm-linux-gcc -g -c -o crt0.o crt0.S
arm-linux-gcc -g -c -o key_led.o key_led.c
arm-linux-ld -Ttext 0x00000000 -g crt0.o key_led.o -o key_led_elf
arm-linux-objcopy -O binary -S key_led_elf key_led.bin
clean:
rm -f key_led.bin key_led_elf *.o
上一篇:S3C2440 中断控制寄存器
下一篇:内存管理单元 MMU
推荐阅读最新更新时间:2024-11-17 06:15
设计资源 培训 开发板 精华推荐
- 汽车多线圈无线充电发射器
- 使用 Analog Devices 的 LTC6404CUD-4 的参考设计
- ESP-12F钥匙挂件
- 基于 ADXL362 的超低功耗、3 轴、运动激活开关
- NCP703 300 mA、超低静态电流、IQ 12 A、超低噪声、LDO 稳压器的典型应用
- 使用 Silicon Labs 的 Si1024-A-GM 的参考设计
- MC34074DR2G光伏电池放大器的典型应用
- 使用 ROHM Semiconductor 的 BU4212 的参考设计
- 【涂鸦智能】智能门磁
- 适用于使用 SiGe:C BFP740F 晶体管的 1575MHz GPS 应用的 1.8V 低噪声放大器
- 有奖看视频|2022台北国际电脑展——美光主题演讲精选
- 家电新风尚,PI开启您的家电新生活!下载产品资料答题赢好礼!
- 下载安森美半导体 KNX 技术文档赢精美礼品!
- 预约有奖直播:享受纯净 ams主动降噪与接近传感带来耳机设计新境界
- 下资料赢京东卡|泰克“软硬”兼施 打造超值示波器
- TI隔离技术知多少?答题赢好礼!
- 下载有礼|是德科技电子书 《通过了解测试精度的基础知识, 提高良率并降低风险》,不做“差不多先生”
- 直播【英飞凌应用于变频家电和中小功率工业变频控制领域的产品:iMOTION™】
- 学习 Mentor 白皮书《端到端车辆验证》,涨知识赢好礼!
- 用 TI 汽车电子方案充充电吧,看你止步不前还是勇往直前!