S3C2440-裸机篇-03 | GPIO的使用(点亮LED、按键检测)
2020-02-06 10:55
246 查看
实验1 —— 点亮一个LED
1.看原理图确定硬件如何连接
原理图中表示了芯片控制LED的硬件电路以及芯片的引脚与LED如何连接。
2. 看主芯片手册确定如何控制引脚
具体:如何让GPF4输出高低电平?
2.1.配置GPF4为输出模式(GPFCON)
设置
GPFCON寄存器的第[9:8]位=
0b01。
2.2.配置GPF4输出高/低电平(GPFDAT)
GPFDAT的第4位为0-低电平,1-高电平。(注:corresponding,相应的)
3.汇编程序访问寄存器控制LED
3.1.编辑程序
@ brief: 点亮连接在GPF4的LED @ author: mculover666 @ date: 2019/3/1 .text .global _start _start: @ 设置GPFCON寄存器,GPF4为输出模式 LDR R0,=0x56000050 LDR R1,=0x0100 STR R1,[R0] @ 设置GPFDAT寄存器,GPF4输出低电平 LDR R0,=0X56000054 LDR R1,=0 STR R1,[R0] @程序暂停 halt: B halt
3.2.编译程序
- 汇编为二进制目标文件
arm-linux-gcc -c led_on.s -Wall -o led_on.o
- 链接为可执行文件elf
arm-linux-ld -Ttext 0 led_on.o -o led_on.elf
- 转换为bin文件
arm-linux-objcopy -O binary -S led_on.elf led_on.bin
整个编译步骤可编写为一个makefile:
TARGET = led_on #输出所有warning CFLAGS = -Wall $(TARGET).bin:$(TARGET).elf arm-linux-objcopy -O binary -S $(TARGET).elf $(TARGET).bin $(TARGET).elf:$(TARGET).o arm-linux-ld -Ttext 0 $(TARGET).o -o $(TARGET).elf $(TARGET).o:$(TARGET).s arm-linux-gcc -c $(TARGET).s $(CFLAGS) -o $(TARGET).o clean: rm -rf *.o *.elf *.bin download_to_nand: #下载到nand flash oflash 0 1 0 0 0 $(TARGET).bin
3.3.烧写程序
使用oflash烧写bin文件到Nand Flash的0地址:
oflash 0 1 0 0 0 .\led_on.bin
3.4.运行程序
- 设置启动开关选择为Nand启动;
- 重新上电;
- 实验结果
4.C程序访问寄存器控制LED
4.1.运行C程序的前提——启动文件
- C语言入口函数是main()函数,main函数由启动文件(刚上电时执行的汇编程序)来调用;
- 在调用时会进行压栈操作,调用完毕进行出栈操作,所以需要设置好栈顶指针SP;
- main函数调用完毕返回启动文件调用处。
启动文件start.s:初始化C语言运行环境,引入C程序 @ brief: S3C2440启动文件 @ author: mculover666 .text .global _start _start: @ 关闭看门狗 LDR R0,=0x53000000 MOV R1,#0 STR R1,[R0] @ 设置栈顶指针SP(从Nand启动) LDR SP,=4096 @ 调用main函数,保存返回地址,转入C程序 BL main @ main函数返回,程序暂停 halt: B halt
4.2.编写C程序——指针+位操作
int main(void) { /* 设置GPFCON寄存器,配置GPF4引脚为输出模式 */ *(unsigned int *)0x56000050 &= ~(3<<(2*4)); *(unsigned int *)0x56000050 |= 1<<(2*4); /* 设置GPFDAT寄存器,GPF4输出低电平,点亮LED */ *(unsigned int *)0x56000054 &= ~(1<<4); /* 程序暂停 */ while(1); }
4.3.编译
TARGET = led_on CFLAGS = -Wall #输出所有warning $(TARGET).bin:$(TARGET).elf arm-linux-objcopy -O binary -S $(TARGET).elf $(TARGET).bin #注意:启动文件必须第一个链接 $(TARGET).elf:start.o $(TARGET).o arm-linux-ld -Ttext 0 start.o $(TARGET).o -o $(TARGET).elf $(TARGET).o:$(TARGET).c arm-linux-gcc -c $(TARGET).c $(CFLAGS) -o $(TARGET).o start.o:start.s arm-linux-gcc -c start.s $(CFLAGS) -o start.o clean: rm -rf *.o *.elf *.bin download_to_nand: #下载到nand flash oflash 0 1 0 0 0 $(TARGET).bin
4.4.烧写运行
oflash 0 1 0 0 0 .\led_on.bin
实验2 —— 按键检测
1.看原理图确定硬件如何连接
2. 看主芯片手册确定如何控制引脚
2.1.配置GPF0为输入模式(GPFCON)
2.2.读取GPF0的状态(高/低电平)(GPFDAT)
3.C程序访问寄存器检测按键
3.1.编写程序
int main(void) { volatile int GPF0_state; /* 设置GPFCON寄存器 */ //设置GPF4为输出 *(unsigned int *)0x56000050 &= ~(3<<(2*4)); *(unsigned int *)0x56000050 |= (1<<(2*4)); //设置GPF0为输入 *(unsigned int *)0x56000050 &= ~(3<<(2*0)); /* 程序死循环检测按键 */ while(1) { /* 读取GPFDAT寄存器 */ GPF0_state = *(unsigned int *)0x56000054; /* 检测GPF4引脚的状态 */ if(GPF0_state & 0x01) { //按键未按下,上拉电阻拉为高电平,熄灭LED *(unsigned int *)0x56000054 |= (1<<4); } else { //按键按下,低电平,点亮LED *(unsigned int *)0x56000054 &= ~(1<<4); } } }
3.2.编译程序
TARGET = key_scan CFLAGS = -Wall #输出所有warning $(TARGET).bin:$(TARGET).elf arm-linux-objcopy -O binary -S $(TARGET).elf $(TARGET).bin #注意:启动文件必须第一个链接 $(TARGET).elf:start.o $(TARGET).o arm-linux-ld -Ttext 0 start.o $(TARGET).o -o $(TARGET).elf $(TARGET).o:$(TARGET).c arm-linux-gcc -c $(TARGET).c $(CFLAGS) -o $(TARGET).o start.o:start.s arm-linux-gcc -c start.s $(CFLAGS) -o start.o clean: rm -rf *.o *.elf *.bin download_to_nand: #下载到nand flash oflash 0 1 0 0 0 $(TARGET).bin
3.3.烧写程序运行
oflash 0 1 0 0 0 .\led_on.bin
实验1、2总结
通过这两个实验:
- 在S3C2440这颗处理器方面,掌握了:
- 如何控制S3C2440的GPIO引脚:输出高低电平和检测外部输入电平(GPFCON寄存器和GPFDAT寄存器)
- 5条常用的ARM汇编指令:MOV、LDR、STR、BL、B;
- 编写汇编程序的基本格式;
- 在C语言方面,掌握了:
- 在启动文件中汇编是如何转入C语言的:BL调用main函数;
- 调用函数需要大量的使用栈,体现出启动时设置栈顶指针SP的重要性;
- 使用C语言指针访问寄存器,使用C语言位操作语法改变寄存器数据;
- 在开发工具方面,掌握了:
- arm-linux-gcc系列工具和makefile的使用;
- 点赞 1
- 收藏
- 分享
- 文章举报
![](https://g.csdnimg.cn/static/user-reg-year/1x/2.png)
相关文章推荐
- GPIO输入按键检测(使用STM32Cube_FW_F4_V1.16.0固件库)
- AVR外部中断INT1检测按键,使用LED作指示
- 【STM32Cube】(四)使用 STM32CubeMX初始化GPIO(按键检测)
- GPIO输出—使用固件库点亮LED
- S3C2440学习之GPIO按键控制LED灯
- HAL库学习笔记:一、按键检测点亮LED彩灯
- 裸机程序二:GPIO点亮led灯 c语言
- 第12章 GPIO输出—使用固件库点亮LED
- 第11章 GPIO输出-使用固件库点亮LED—零死角玩转STM32-F429系列
- 嵌入式s3c2440 裸机点亮LED灯
- ARM9 S3C2440按键中断方式点亮LED的汇编程序
- STM32 外部中断的使用(按键中断点亮LED)
- 基于TX2440开发板在ADS1.2中编写LED的驱动(GPIO的使用)裸机程序
- GPIO输出点亮LED灯(使用STM32Cube_FW_F4_V1.16.0固件库)
- stm8s开发(二) GPIO的使用:点亮LED!
- 第11章 GPIO输出-使用固件库点亮LED—零死角玩转STM32-F429系列
- GPIO-点亮一个LED(JZ2440-S3C2440)
- GPIO输出操作—使用固件库点亮LED--- 调试总结
- CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)
- GPIO 输入—按键检测