TQ210 —— 点亮LED

TQ210 —— 点亮LED

 

1、S5PV210 GPIO硬件简介

1.1、GPIO 【S5PV210有237个多功能IO口,通过设置寄存器确定某个引脚用于输入输出或者其他特殊功能】

      GPIO的英文全称为General-PurposeIO ports,也就是通用IO接口。在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路,有的需要CPU为之提供控制手段,有的则需要被CPU用做输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了。比如,控制某个LED灯亮与灭,或者通过获取某个引脚的电平属性来达到判断外围设备的状态。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。接口至少有两个寄存器,即“通用IO控制寄存器”与“通用IO数据寄存器”。数据寄存器的各位都直接引到芯片外部,而对这种寄存器中每一位的作用,即每一位的信号流通方向,则可以通过控制寄存器中对应位独立地加以设置。比如,可以设置某个引脚的属性为输入、输出或其他特殊功能。
在实际的MCU中,GPIO是有多种形式的。比如,有的数据寄存器可以按照位寻址,有些却不能按照位寻址,这在编程时就要区分了。比如传统的8051系列,就区分成可位寻址和不可位寻址两种寄存器。另外,为了使用的方便,很多MCU的 GPIO接口除必须具备两个标准寄存器外,还提供上拉寄存器,可以设置IO的输出模式是高阻,还是带上拉的电平输出,或者不带上拉的电平输出。这在电路设计中,外围电路就可以简化不少。
1.2、特性
      146个可中断通用控制GPIO;32个可控外部中断;237个多路复用IO口;睡眠模式引脚状态可控(除了GPH0/GPH1/GPH2/GPH3)。

2GPIO寄存器

控制S5PV210的GPIO端口寄存器主要有三类:

        控制寄存器——GPxCON——配置GPIO输入输出功能

        数据寄存器——GPxDAT——设置高低电平

        上拉寄存器——GPxUP——确定是否使用内部上拉电阻

3LED原理图

        这里两个NPN三极管,具有放大电流作用,增大驱动能力,只要给基极一个高电平,三极管就可以导通,产生大电流驱动LED点亮。

 

4、汇编点亮LED

     要点亮LED1,需要配置寄存器GPC0CON的[15:12]为0b0001,使GPC0_3为输出模式,同时配置寄存器GPC0DAT[3]=1,使GPC0_3引脚输出高电平。

     要点亮LED2,需要配置寄存器GPC0CON 的[19:16]为0b0001,使 GPC0_4为输出模式,同时配置寄存器GPC0DAT[4]=1,使GPC0_4引脚输出高电平。

     三个文件:led_on.S  addheader.c  Makefile

/* led_on.S */
.global _start                     
_start:ldr r0, =0xE0200060         /* GPC0CON寄存器*/ldr r1, =0x00001000        str r1, [r0]                /* 设置GPC0_3为输出,GPC0[15:12]= 0b0001 */ldr r0, =0xE0200064         /* GPC0DAT寄存器*/ldr r1, =0x00000008        str r1, [r0]                /* 设置GPC0_3为高电平*/halt:b halt                      /*死循环*/

    为什么需要死循环:CPU 一旦从某个地址运行,它就会从这个地址往后依次取指运行,当运行完我们的代码,它不会停止,还会往后继续取指运行,但是后面的指令是未知的,CPU运行后不知道会是什么结果,可能正常执行,也可能出现异常,所以我们应该让CPU一直在那里死循环。

    Makefile:

led_on.bin:led_on.oarm-linux-ld -Ttext 0xD0020010 -oled_on.elf $^arm-linux-objcopy -O binary led_on.elf $@arm-linux-objdump -D led_on.elf >led_on.disled_on.o :led_on.Sarm-linux-gcc -c $< -o $@clean:rm *.o *.elf *.bin *.dis

(1)、arm-linux-gcc将start.S编译成start.o目标文件,-c表示编译不链接,-o跟随输出文件名。

(2)、arm-linux-ld 将start.o目标文件链接成elf文件格式,-Ttext 0xD0020010表示程序运行的地址是0xD0020010,其实程序可以在任何一个地址运行,因为本源代码是位置无关码,后面您会看到可以在内存0x30000000地址运行【TQ210内存:0x20000000~0x40000000】。

(3)、arm-linux-objcopy将ELF格式的可执行文件转换为二进制文件,即可以在开发板上执行的文件,-O表示指定格式来输出文件,这里是binary即二进制文件。

(4)、arm-linux-objdump 将ELF文件反汇编,主要用于编译出错时,对调试很有帮助,-D表示反汇编所有段。

裸机可以使用SD卡烧和使用 u-boot 菜单栏或者u-boot命令行来烧写

// 要将led_on.bin烧写到TQ210中,还需要要添加一个16字节的头信息。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>#defineIMG_SIZE   16 * 1024
#defineHEADER_SIZE 16intmain (int argc, char *argv[])
{FILE                   *fp;unsigned              char*buffer;int                        bufferLen;int                        nbytes,fileLen;unsigned int checksum, count;int                        i;if (argc != 3){printf("Usage: %s <sourcefile> <destination file>\n", argv[0]);return -1;}/* 分配16KByte的buffer,BL1最大为16KByte,并初始化为0*/buffer = calloc(1, IMG_SIZE);if (!buffer){perror("Alloc bufferfailed!");return -1;}/* 打开源bin文件*/fp = fopen(argv[1], "rb");if( fp == NULL){perror("source file openerror");free(buffer);return -1;}/* 获取源bin文件的长度*/fseek(fp, 0L, SEEK_END);fileLen = ftell(fp);fseek(fp, 0L, SEEK_SET);/* 源bin文件不得超过(16K-16)Byte*/if (fileLen > (IMG_SIZE -HEADER_SIZE)){fprintf(stderr, "Source fileis too big(> 16KByte)\n");free(buffer);fclose(fp);}/* 计算校验和*/i = 0;checksum = 0;while (fread(buffer + HEADER_SIZE + i, 1,1, fp)){checksum += buffer[HEADER_SIZE +i++];}fclose(fp);/* 计算BL1的大小(BL1的大小包括BL1的头信息),并保存到buffer[0~3]中*/fileLen += HEADER_SIZE;memcpy(buffer, &fileLen, 4);// 将校验和保存在buffer[8~15]memcpy(buffer + 8, &checksum, 4);/* 打开目标文件*/fp = fopen(argv[2], "wb");if (fp == NULL){perror("destination file openerror");free(buffer);return -1;}// 将buffer拷贝到目标bin文件中nbytes    =fwrite(buffer, 1, fileLen, fp);if (nbytes != fileLen){perror("destination filewrite error");free(buffer);fclose(fp);return -1;}free(buffer);fclose(fp);return 0;
}

首先编译 addheader.c:gcc addheader.c -o addheader

./addheader led_on.bin 210.bin

将生成的210.bin文件通过SD或者tftp方式下载到TQ210开发板中。

 

5、烧写裸机程序

(1)、使用SD卡烧写

dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1 表示输出文件为 210.bin,输出文件到/dev/sdb,设备文件在 linux 下是 在/dev/目录下,此时 SD 卡在 Linux 下仅仅被看成是一个文件, seek=1 表示烧写到扇区 1, Linux 读写磁盘设备最小单位是一个扇区。取出SD卡放入TQ210开发板,拨动拨码开关为SD卡启动。

注意: /dev/sdb 是查阅 SD Linux虚拟机上的设备节点而设置的,如果设备节点为/dev/sdc则需要修改为/dev/sdc,插入 SD卡到 PC 后,在 Linux虚拟机命令行执行 ls /dev/sd*命令查看到设备节点的情况。

 

(2)、使用u-boot菜单栏烧写

       ipaddr:开发板的IP;serverip:Linux的IP【设置好,save保存一下】

       tftp 3000000210.bin

       go30000000

 

6、用C和汇编混合编程

/* led_on.S*/ 
.global _start                           
_start:blmain                       /* 跳转到C函数去执行*/
halt:bhalt                        /* 死循环 *//* main.c */
#define GPC0CON     *((volatileunsigned int *)0xE0200060)
#define GPC0DAT     *((volatileunsigned int *)0xE0200064)void delay(volatile unsigned int t)
{volatileunsigned int t2 = 0xFFFF;while(t--)for(; t2; t2--);
}int main()
{int toggle = 0;GPC0CON &= ~(0xFF << 12);GPC0CON |= 0x11 << 12;                   //配置GPC0_3和GPC0_4为输出while(1){GPC0DAT &= ~(0x3 << 3);           // 熄灭LED1和LED2if(toggle)GPC0DAT|= 1 << 3;        // 点亮LED1elseGPC0DAT|= 1 << 4;        // 点亮LED2toggle= !toggle;delay(0x50000);}return 0;
}

    运行 C 语言需要栈,为什么在 led_on.S 中没有设置栈:S5PV210 上电运行 iROM 中的代码已经设置好栈,栈顶地址为 0xD0037F80,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bind1nd\bind2nd

https://www.cnblogs.com/renyuan/p/6216375.html https://blog.csdn.net/jnu_simba/article/details/9530341

拆解镍氢电池充电器,简单的电路设计令人震惊!

上班爱摸鱼&#xff0c;下班爱钓鱼&#xff0c;于是买了一个钓鱼机。不贵&#xff0c;几十块钱&#xff0c;带4条鱼竿。长这样&#xff1a;电池驱动&#xff0c;钓起鱼来乐趣无穷&#xff1a;惊喜的是&#xff0c;钓鱼机自带附赠的电池是可充电的&#xff0c;省下不少买干电池的…

设备底座几个常见固定方式

在运营商我们可以经常发现如下的固定方式&#xff0c;因为设备厂家的不同&#xff0c;以及机房上下走线方式&#xff0c;固定方式也有些差异。可以清楚看见&#xff0c;底座可以靠螺母进行微调使机柜高度&#xff0c;底部还有膨胀螺丝打入地板还有很多机柜是不加微调用的底座&a…

抽35块树莓派新品单片机送给可爱的你们

我是谁~公众号「嵌入式Linux」&#xff0c;深入解析简明扼要直白解释各种技术问题&#xff0c;包括但不局限于Linux、单片机、半导体、Android、C语言等等。号主从事嵌入式软件行业有10余年&#xff0c;建立了10余个技术微信群&#xff0c;整理了很多技术资料&#xff0c;欢迎大…

bitset类

C语言的一个类库&#xff0c;用来方便地管理一系列的bit位而不用程序员自己来写代码。 bitset除了可以访问指定下标的bit位以外&#xff0c;还可以把它们作为一个整数来进行某些统计。 可以如下声明一个该类型变量&#xff1a; bitsetvarm (M) 其中varm为变量名。 N表示该类型在…

TQ210——时钟系统

TQ210——时钟系统 1、时钟域 一般来讲&#xff0c; MCU 的主时钟来源主要是外部晶振或外部时钟&#xff0c;比较常见的是 外 部晶振。一般情况&#xff0c;系统内所使用的时钟都是高频率的时钟&#xff0c;外部晶振一般达不到那么高的频率&#xff0c;所以一般使用锁相环电路&…

Android 监听耳机的插拔事件

一般采用的是动态监听的方式来实现的&#xff1a; package com.renhui.ej;import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.supp…

ubuntu操作

下面的命令大都需要在控制台 / 终端 / shell 下输入。 控制台, 终端, 和 shell 意味着同样一件事 - 一个命令行界面&#xff0c; 他可以用来控 制系统。 打开一个控制台: 应用程序 --> 附件 --> 终端 任何一个使用 sudo 作为前缀的命令都需要拥有管理员 (或 root) 访问权…

我的文章汇总

2018年文章汇总2019年文章汇总2020年文章汇总专辑|Linux文章汇总专辑|程序人生专辑|C语言专辑|Git专辑|安卓系统专辑|嵌入式我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点赞&#xff0c;关注&#xff0c;转发&#xff0c;在看&#xff0c…

CMap

https://blog.csdn.net/u010879420/article/details/53914767

webpack-安装

以前配置的gulpfile.js&#xff0c;随着版本的迭代更新&#xff0c;现在已经... 1.安装webpack npm i -g webpack-cli && npm i -g babel-preset-env 2.弹射出窗口&#xff08;我们未安装Git&#xff0c;或者未找到Git path&#xff0c;请配置path&#xff09; 3.再次执…

TQ210——S5PV210中断体系

TQ210——S5PV210中断体系 中断是指 CPU 在执行程序的过程中&#xff0c;遇到异常情况需要处理&#xff0c; CPU停 止当前程序的运行&#xff0c;保存当前程序运行处的必要参数&#xff0c;转去处理这些异常情况&#xff0c; 处理结束后再返回当前程序的间断处&#xff0c;继续…

高通骁龙888开始被Linux内核5.12版正式支持

在Linux 5.12内核合并窗口中&#xff0c;有很多新的硬件开始被支持&#xff0c;其中不乏一些知名产品例如高通骁龙888&#xff0c;除此之外还有一些与ARM平台和设备树有关的代码添加。来自Arnd Bergmann的各种内核拉取请求在周六晚上被合并&#xff0c;此前由于恶劣的冬季风暴阻…

NOD32: 教育网、公网超级 病毒更新服务器

NOD32:教育网超级 病毒更新服务器: http://222.197.166.33/main.htm公网香港代理 服务器&#xff1a;proxy.nod32.com.hk, 端口&#xff1a;8888转载于:https://www.cnblogs.com/stoneresearch/archive/2008/11/26/4336751.html

CLabel

https://blog.csdn.net/alexander_china/article/details/9943559 https://blog.csdn.net/stawn/article/details/10133095

Python实现比较两个列表(list)范围

Python实现比较两个列表(list)范围 有一道题&#xff1a; 比较两个列表范围&#xff0c;如果包含的话&#xff0c;返回TRUE&#xff0c;否则FALSE。 详细题目如下&#xff1a; Create a function, this function receives two lists as parameters, each list indicates a scop…

单片机里面的CPU使用率是什么鬼?

打开电脑的任务管理器&#xff0c;看着跳动的CPU使用率&#xff0c;发现很舒服。每一个线程占用了多少CPU清清楚楚&#xff0c;也就能针对性的确认为啥你的电脑跑的慢了。今天这篇笔记不讲每个任务&#xff08;或线程&#xff09;CPU的使用情况&#xff0c;而是单片机整体的CPU…

TQ210——按键(中断查询法)

TQ210——按键 底板上有8个独立按键&#xff0c;可分别使用查询法和中断法控制按键。通过原理图可知&#xff1a;按键按下&#xff0c;GPIO检测到低电平&#xff0c;松开时高电平。 直接查询法程序的实现简单&#xff0c;但是效率很低&#xff0c;CPU一直在查询&#xff0c;啥事…

CPropertySheet 与CPropertyPage 的基本使用

https://www.cnblogs.com/sylar-liang/p/4173015.html https://blog.csdn.net/qq_18297675/article/details/51229028 怎么创建 CPropertyPage 是一个从CDialog派生而来的一个类&#xff0c;基本功能与对话框类一样&#xff0c; CPropertySheet不是一个CDialog的派生类&#x…

深度学习中 epoch,[batch size], iterations概念解释

one epoch&#xff1a;所有的训练样本完成一次Forword运算以及一次BP运算 batch size&#xff1a;一次Forword运算以及BP运算中所需要的训练样本数目&#xff0c;其实深度学习每一次参数的更新所需要损失函数并不是由一个{data&#xff1a;label}获得的&#xff0c;而是由一组数…