s3c6410裸机程序(1)

发布者:HappyHearted最新更新时间:2024-09-02 来源: cnblogs关键字:s3c6410  裸机程序  操作GPIO 手机看文章 扫描二维码
随时随地手机看文章

  以前实际上算的上是基本没有接触过嵌入式方面的东西,只是在以前学习过8位的单片机,可简单的东西哦!然后学过8086,80386的汇编语言编程和c语言以及windows的图形界面程序,所以这个飞凌的ok6410开发板拿到手以后真的觉得很陌生呢!都不知道怎么下手。看了看随板附带的视频和工具,大致有了一个了解。自己用一键烧写工具烧写了wince,linux,android系统,总算是有了一点点成就感了。当然了,不能停留在这个上面啦,本来安装了linux系统以后就可以用交叉编译工具编写c语言程序了,但是觉得没有意思啊,那样不是和pc机上写c语言大同小异了吗?于是我决定还是先写写裸机程序,熟悉一下ARM汇编语言和硬件吧!


  第一个程序当然要挑选简单的写哦,熟悉了一下GPIO,会了简单的输入输出,就可以写一个流水灯了呢!那么GPIO是个什么东东呢?记得在pc机上,cpu是不能直接连接外设的哟,要通过相应的设备控制器,为什么要设备控制器呢?设备控制器就是cpu和外设通讯的接口,充当的是翻译员的工作哦,接口上有接口寄存器,cpu通过操作寄存器就可以操作外设了,就可以不用直接向外设的引脚写1和0了,简化了编程的难度哦!GPIO就是ARM上的一个设备控制器,诸如LED、BUZZER、KEYPAD都是连接在GPIO上面的呢!我的第一个程序,就是通过GPIO实现按键驱动LED灯和蜂鸣器。


  操作GPIO必须要查看s3c6410的用户手册哦,没有这个可是不行的呢!当然笔者的英语也很差,能看懂的不到50%,但是对于现在来说,能看懂50%就够了哦,以后用到的东西,以后再说吧!@_@


  GPIO一共187ge引脚,分为17组,每组的引脚数并不是相同的,LED灯连接在GPM0到GPM3这四个引脚上,这是从哪里看来的呢?是从电路图上哦,而且从电路图上可以看出这个LED灯是低电平亮哦!蜂鸣器呢?它是接在GPF15上哦,而且是高电平响哦,至于KeyPad,六个键分别占用了GPN0到GPN5,地点平有效。

365c91bc28e4e59543de8e0f4bff0bbc_aVp09qwRTIAAAAASUVORK5CYII=.png

95b8f926fa946e9f1a02626bb0068500_wHz1mNvJu7bDAAAAABJRU5ErkJggg==.png

a8a1018ebac2001f3243c9ad9a432020_wfdrRhm2ZFRbQAAAABJRU5ErkJggg==.png

  现在我知道了我要操作的设备连在GPIO的哪个引脚上,那么我怎么来操作这些引脚呢?当然是用寄存器啦!去s3c6410的cpu手册中查看GPIO这一章节,就可以知道GPM,GPN,GPF分别的寄存器地址。我用到的寄存器有GPxCON和GPxDAT,首先要用GPxCON来配置引脚的功能,是用作输入、或者是输出。我把GPM0到GPM4配置为输出,把GPF15配置为输出,把GPN0到GPN5配置为输入,现在,就可以开始我们的主流程了哟!


  那么还要解决一个很重要的问题,那就是程序的基本结构。到底这个程序怎样组织呢?这里,我用了最简单的方法,那就是cpu反复查询的方法,在一个whie死循环中,cpu不断的检查是否有按键,然后去设置LED灯或者是蜂鸣器。其实这是不可取的呢!因为这样会非常耗费cpu的,那么用什么最好呢?当然是中断啦!可是,第一个程序嘛!就先来个简单的啦!O(∩_∩)O~

  首先是一段汇编:

        IMPORT    main
        
        AREA    Init, CODE, READONLY
        CODE32
        ENTRY
start
        b        main
        
        END

  为什么首先要有一段汇编呢?因为c编译器编出的程序是有一段头部的,在没有操作系统的情况下是不能正常运行的,所以一段汇编,直接跳到main函数处,这样就可以正常运行了哦!

  然后是c语言程序啦!

#define rGPMCON (*(volatile unsigned int *)(0x7F008820))
#define rGPMDAT (*(volatile unsigned int *)(0x7F008824))
#define rGPMPUD (*(volatile unsigned int *)(0x7F008828))

#define rGPFCON    (*(volatile unsigned int *)(0x7F0080A0))
#define rGPFDAT    (*(volatile unsigned int *)(0x7F0080A4))
#define rGPFPUD    (*(volatile unsigned int *)(0x7F0080A8))

#define rGPNCON    (*(volatile unsigned int *)(0x7F008830))
#define rGPNDAT    (*(volatile unsigned int *)(0x7F008834))
#define rGPNPUD    (*(volatile unsigned int *)(0x7F008838))


void GPIO_Init(void);
void TestPad(void);

int main(void)
{
    GPIO_Init();
    TestPad();    
}

void GPIO_Init(void)
{
    unsigned int tmp;
    
    /* Init Led regs */
    tmp &= ~(0xFFFF);
    tmp |= 0x1111;
    rGPMCON = tmp;
    rGPMPUD &= ~0xFF;
    rGPMDAT |= 0xF;
    /* Init Buzzer regs */
    rGPFCON &= ~(0x1 << 31);
    rGPFCON |= 0x1 << 30;
    rGPFPUD &= ~(0x3 << 30);
    rGPFDAT &= ~(0x1 << 15);
    /* Init Keypad regs */
    rGPNCON &= ~0xFFF;
    rGPNPUD &= ~0xFFF;
}


void TestPad(void)
{
    unsigned int KeyInput;
    
    while (1)
    {
        KeyInput = 0;
        KeyInput = rGPNDAT;
        KeyInput &= 0x3F;
        
        if ( (KeyInput & 1) == 0)   /* == 比 & 的优先级要高 */
        {
            rGPMDAT |= 0xF;
            rGPMDAT &= ~0x1;
        }
                
        else if ( (KeyInput & 2) == 0)
        {
            rGPMDAT |= 0xF;
            rGPMDAT &= ~0x2;
        }
        else if ( (KeyInput & 4) == 0)    
        {
            rGPMDAT |= 0xF;
            rGPMDAT &= ~0x4;

        }
        else if ( (KeyInput & 8) == 0)
        {
            rGPMDAT |= 0xF;
            rGPMDAT &= ~0x8;
        }
                
        else if ( (KeyInput & 16) == 0)
        {
            rGPFDAT |= (0x1 << 15);
        }
            
        else if ( (KeyInput & 32) == 0)
        {
            rGPFDAT &= ~(0x1 << 15);
        }
    }
}

  好了,写完了,现在可以通过dnw软件和usb OTG接口将程序下载到RAM中运行了,我用的是JLINK下载,因为这样可以单步调试哦!


关键字:s3c6410  裸机程序  操作GPIO 引用地址:s3c6410裸机程序(1)

上一篇:S3C2410——LED灯实验
下一篇:正在删除 s3c6410裸机程序(2)

推荐阅读最新更新时间:2024-11-11 12:03

stm32 起步 gpio操作
在工程中增加gpio lib.h和stm32头文件,如下: #include “stm32f10x.h” // Device header #include “stm32f10x_gpio.h” 调用lib配置gpio工作方式,先开启时钟,选GPIO,设置GPIO mode,gpio speed,主要看GPIO_InitTypeDef 结构体,芯片不同结构体不同,开始不清楚具体使用可以参考系统自带的example code,my setting如下: void GPIO_Initmain(void) { GPIO_InitTypeDef GPIO_InitStructure; /* Configure all
[单片机]
s3c6410 RomCode文档读后总结
最近无意中看到一篇关于s3c6410 RomCode的介绍,结合自己的经验,做个总结。 首先贴张图,具体描述下该芯片的启动方式及具体流程。 因为s3c6410的板子多数是从SD或者Nand方式启动,重点就先放在Nand启动上。 启动基本流程: 上图中的IROM为芯片固化程序,被称为BL0,开机后最先运行,它会去做一些硬件初始化动作,代码里通过检测GPN 管脚状态从相应设备指定区域BL1中拷贝4KB执行代码到Stepping stone中运行; Disable the Watch-Dog Timer Initialize the TCM. Initialize the Block Device Copy Functi
[单片机]
<font color='red'>s3c6410</font> RomCode文档读后总结
S3C6410+FPGA+2*RTL8211 驱动 iperf測试
1、iperf怎样交叉编译? https://iperf.fr/ 官网总是要靠谱一些,測试版本号为 Iperf 2.0.5 弄到虚拟机运行解压后并配置./configure --host=arm-linux make  出现个小问题,接入例如以下 将生成的iperf弄到板子上 2、RTL8211 100m 下測试结果 PC 作为server、板子作为client ks8851 測试结果: 可见速度上明显优于spi接口的ks8851,话说嵌入式的速度也不是必需须要那么快嘛。
[单片机]
S3C6410+FPGA+2*RTL8211 驱动 iperf測试
基于S3C6410的ARM11学习(十六) 外部中断
中断的过程如下: 中断源检测中断信号产生,然后将中断信号发送给中断控制器,中断控制器判断该中断是否被屏蔽,从而决定该中断信号是否要发送给CPU。中断信号发送给CPU后,CPU对中断进行处理,也就是调用中断函数。 上述过程,基本上是嵌入式的通过中断处理过程,只是不同的嵌入式在这三部分配置有区别而已。 S3C6410共有64个中断源。 上图是S3C6410的中断控制器,这里就关心红色框部分。这两个是中断控制器,分别管理各自的32个中断。 这里,就截取了一部分的图。总共有64个中断,每个中断有自己的标号,以及自己的所属组,也是属于哪个中断控制器控制。标号是指在对应的中断控制器寄存器的哪一位或者是哪一个寄存器对应自己
[单片机]
基于<font color='red'>S3C6410</font>的ARM11学习(十六) 外部中断
mini2440按键裸机程序编写运行
开发环境 操作系统:linux 开发板:mini2440 2.原理图 GPGCON控制寄存器地址: GPGCON控制寄存器功能说明: 3. 操作流程 (只需要操作GPGCON寄存器即可操作K1按键) a)设置控制寄存器GPGCON为输入功能:00 (即:可读取GPGDAT寄存器的值) //按键 unsigned long *GPGCON = 0x56000060; unsigned long *GPGDAT = 0x56000064; *GPGCON &= 0xffffc33c;//只用到4个按键GPG0 GPG3 GPG5 GPG6,功能设为00:输入功能 b)我们按下按键,想让对应的LED1
[单片机]
mini2440按键<font color='red'>裸机</font><font color='red'>程序</font>编写运行
深入理解ARM体系架构(S3C6410)---arm7,arm9,arm11区别
1. 时钟频率的提高 虽然内核架构相同,但ARM7处理器采用3级流水线的冯 诺伊曼结构;而ARM9采用5级流水线的哈佛结构,ARM11为8级流水线哈弗结构(从arm9开始都采用了哈弗结构)。增加的流水线设计提高了时钟频率和并行处理能力。5级流水线能够将每一个指令处理分配到5个时钟周期内,在每一个时钟周期内同时有5个指令在执行。在常用的芯片生产工艺下,ARM7一般运行在100MHz左右,而ARM9则至少在200MHz以上.ARM11首先推出350M~500MHz时钟频率的内核,目前上升到1GHz时钟频率。 2 指令周期的改进 指令周期的改进对于处理器性能的提高有很大的帮助。性能提高的幅度依赖于代码执行时指令的重叠,这实际上是程序
[单片机]
深入理解ARM体系架构(<font color='red'>S3C6410</font>)---arm7,arm9,arm11区别
基于Linux的智能家居的设计(3)
2 硬件设计 本课题的硬件设计包含主控制器、传输数据设计、数据採集设计、控制驱动设计、显示设计。门禁设计。 2.1 主控制器 依据方案三选择S3C6410主控芯片,S3C6410是由Samsung公司推出的一款低功耗、高性价比的RSIC处理器 。基于ARM11内核。内置强大的硬件加速。显示处理和缩放,运动视频处理。音频处理 。这个作为智能家居的处理器是不二之选。硬件性能上全然能够实现。本设计选用的基于S3C6410的OK6410开发板。开发板上拥有例如以下特征 : (1) 12MHz、48MHz、27MHz、32.768KHz时钟源,支持5V电压供电; (2) 採用8位拨码开关设置系统启动方式; (3) 共4个串口,包
[单片机]
基于Linux的智能家居的设计(3)
基于嵌入式Linux的运动目标检测系统
随着社会的发展和科技的进步,人们的安防意识越来越强,而计算机网络技术,通信技术,和数字视频编码技术的日益成熟,使基于计算机的多媒体视频监控系统成为可能。但是传统的视频监控系统因十分复杂,功耗和成本较高且需要值守,而无法应用于诸如家居或私人办公室等场所,为此,本文设计了一种以ARM11为核心处理器,嵌入式Linux为操作系统,在传统的视频监控的基础上加入了目标检测的算法,并与GSM模块相结合,已达到无人值守的目的。 1 系统总体设计 运动目标检测系统采用S/B(服务器/浏览器)工作模式,总体上分为服务器监控模块,短信通知模块(GSM)和客户查看模块。服务器监控模块采用三星公司的ARM11(S3C6410)微处理器,开源的Linux操
[单片机]
基于嵌入式Linux的运动目标检测系统
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved