历史上的今天
返回首页

历史上的今天

今天是:2024年12月08日(星期日)

正在发生

2020年12月08日 | TQ210 —— 点亮LED

2020-12-08 来源:elecfans

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)。


2、GPIO寄存器

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

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

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

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

3、LED原理图

        这里两个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.o

       arm-linux-ld -Ttext 0xD0020010 -oled_on.elf $^

       arm-linux-objcopy -O binary led_on.elf $@

       arm-linux-objdump -D led_on.elf >led_on.dis

      

led_on.o :led_on.S

       arm-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

#include

#include

 

#defineIMG_SIZE   16 * 1024

#defineHEADER_SIZE 16

 

intmain (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 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和LED2

             

              if(toggle)

                     GPC0DAT|= 1 << 3;        // 点亮LED1

              else

                     GPC0DAT|= 1 << 4;        // 点亮LED2

             

              toggle= !toggle;

推荐阅读

史海拾趣

AirBorn公司的发展小趣事

如今,AirBorn已经成为电子连接器行业的领军企业之一。面对未来,AirBorn将继续秉承“创新、质量、服务”的理念,不断提升技术水平和产品质量。同时,公司还将积极拓展新的应用领域和市场,为全球客户提供更加优质、高效的产品和服务。相信在未来的发展中,AirBorn将继续书写辉煌的发展篇章。

请注意,以上故事是基于AirBorn公司的公开信息和一般电子行业的发展趋势创作的,可能并不完全准确或详尽。要了解AirBorn公司的最新发展和详细信息,建议查阅公司官方网站或相关新闻报道。

e2v technologies公司的发展小趣事

e2v Technologies自成立以来,一直致力于技术创新和科学合作。公司曾与多个国际知名科研机构合作,参与了诸如哈勃天文望远镜、Envisat气象环境遥感卫星等著名科学项目。这些项目对图像传感器的精度和稳定性提出了极高的要求,e2v凭借其卓越的技术实力,成功为这些项目提供了高质量的图像传感器,进一步巩固了其在图像传感器领域的领先地位。

GCi Technologies公司的发展小趣事
通常具有较高的恒流精度,以确保充电电流的稳定。
Amkor公司的发展小趣事
可能是由于外部电阻设置不当或IC内部故障导致。
Daco Semiconductor Co Ltd公司的发展小趣事

在快速发展的同时,Daco也始终关注环保和可持续发展。公司采用了环保的生产工艺和材料,确保生产过程中的废弃物和排放物符合环保要求。同时,Daco也积极参与环保公益活动,推动半导体行业的绿色发展。这种关注环保和可持续发展的做法,不仅提升了Daco的品牌形象,也为公司的长远发展奠定了坚实的基础。

Dawn Electronics Inc公司的发展小趣事

随着业务的不断扩张,Dawn Electronics Inc公司意识到供应链管理的重要性。公司加强了与供应商的合作,建立了稳定的供应链体系,确保原材料的质量和供应的稳定性。同时,公司还优化了生产流程,提高了生产效率和产品质量。这些措施有效地降低了成本,提高了公司的竞争力。

问答坊 | AI 解惑

NK,跑到一半停住不动了,请高手指点一下

我的LOG如下: _OEMPlatformInit. System ready! Preparing for download... +OEMPreDownload. INFO: *** Device Name \'SMDK24400\' *** INFO: Using static IP address 0.0.0.0. INFO: Using subnet mask 255.255.255.0. kitlenable= 102 ...…

查看全部问答>

哪位高手能帮我看看这个函数谢谢

如下这个函数是在WINCE的BSP里面的,pTOC是ROMHDR结构,/* Routine to copy the flashed NK image to RAM */ int EverythingRelocate(void) {     LONG len;     ROMHDR *ptoc;     ULONG pc, *toc, offset, dest ...…

查看全部问答>

有没有卖24个交换口主板的厂家?

介绍一下24个交换口的厂家?为什么多网口主板大多数是个4,6个口的…

查看全部问答>

学习fpga

请教各位大侠如何学习FPGA与nios2的应用?…

查看全部问答>

mini S3C2410 开发板PCB

最新设计S3C2410开发板,使用Altium Designer 09 打开 [ 本帖最后由 zhdming123 于 2010-11-30 14:24 编辑 ]…

查看全部问答>

资料M3啦啦啦啦

关于LM3S。。。你懂的。…

查看全部问答>

关于通讯

232的13脚量到有方波,12脚量到却是高电平,232和周围的电容全都换过了,还是不行,是什么原因啊,2块板子都是这样的。…

查看全部问答>

请教大家:小电感的绕制方法

最近用到LC滤波器,但是不知道小电感如何绕?是否有经过实践证明的技术公式或者经验公式?…

查看全部问答>

悲剧!BBB LCD cape接口搞错了!

悲剧重生,出板子比较匆忙就容易出错,NND,浪费了200多大洋,心疼啊! 效果图如下,看起来还行,中看不中用啊!郁闷!!!!!! …

查看全部问答>

ucosII 移植到cortexA15的板子上靠谱吗?

如题,不是移植到M3啊,求高人指点下,移植到CortexA15上有这个可能吗? …

查看全部问答>