S3C2440③ | GPIO实验

发布时间:2024-07-15  

实验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.编辑程序


代码语言:javascript


@ 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.编译程序

汇编为二进制目标文件

代码语言:javascript


arm-linux-gcc -c led_on.s -Wall -o led_on.o

链接为可执行文件elf

代码语言:javascript


arm-linux-ld -Ttext 0 led_on.o -o led_on.elf

转换为bin文件

代码语言:javascript


arm-linux-objcopy -O binary -S led_on.elf led_on.bin

整个编译步骤可编写为一个makefile:


代码语言:javascript


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地址:


代码语言:javascript


oflash 0 1 0 0 0 .led_on.bin


3.4.运行程序

  1. 设置启动开关选择为Nand启动;

  2. 重新上电;

  3. 实验结果

4.C程序访问寄存器控制LED

4.1.运行C程序的前提——启动文件

  • C语言入口函数是main()函数,main函数由启动文件(刚上电时执行的汇编程序)来调用;

  • 在调用时会进行压栈操作,调用完毕进行出栈操作,所以需要设置好栈顶指针SP;

  • main函数调用完毕返回启动文件调用处。


代码语言:javascript


启动文件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程序——指针+位操作

代码语言:javascript


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.编译

代码语言:javascript


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.烧写运行

代码语言:javascript

复制

oflash 0 1 0 0 0 .led_on.bin

实验2 —— 按键检测

1.看原理图确定硬件如何连接

2. 看主芯片手册确定如何控制引脚

2.1.配置GPF0为输入模式(GPFCON)

2.2.读取GPF0的状态(高/低电平)(GPFDAT)


3.C程序访问寄存器检测按键

3.1.编写程序

代码语言:javascript


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.编译程序

代码语言:javascript


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.烧写程序运行

代码语言:javascript


oflash 0 1 0 0 0 .led_on.bin


实验1、2总结

通过这两个实验:

  1. 1. 在S3C2440这颗处理器方面,掌握了:

  • 如何控制S3C2440的GPIO引脚:输出高低电平和检测外部输入电平(GPFCON寄存器和GPFDAT寄存器)

  • 5条常用的ARM汇编指令:MOV、LDR、STR、BL、B;

  • 编写汇编程序的基本格式;

  1. 2. 在C语言方面,掌握了:

  • 在启动文件中汇编是如何转入C语言的:BL调用main函数;

  • 调用函数需要大量的使用栈,体现出启动时设置栈顶指针SP的重要性;

  • 使用C语言指针访问寄存器,使用C语言位操作语法改变寄存器数据;

  1. 3. 在开发工具方面,掌握了:

  • arm-linux-gcc系列工具和makefile的使用;


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>