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

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.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,

TQ210 —— 点亮LED相关推荐

  1. TQ210_裸机编程(一)——点亮LED灯

    TQ210_裸机编程点亮LED灯 首先查看 TQ210 的底板原理图: 我们可以看到 两个 LED 分别接到 S5PV210 的 GPC0_3 和 GPC0_4 引脚. 这里用了 NPN 三极管,具有 ...

  2. 和12岁小同志搞创客开发:手撕代码,点亮LED灯

    目录 1.Arduino编程架构 2.点亮LED灯 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_381069 ...

  3. zigbee学习之路(二)点亮LED

    一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了. 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2 ...

  4. STM32F 103C8T6开发板 点亮LED灯

    每组IO口含下面7个寄存器.7个寄存器可以控制一组GPIO的16个IO口. GPIOx_CRL:端口配置低寄存器 GPIOx_CRH:端口配置高寄存器 GPIOx_IDR:端口输入寄存器 GPIOx_ ...

  5. STC89C52单片机 点亮LED灯

    点亮LED灯 一.什么是LED LED全称为半导体发光二极管,采用半导体材料制成的,以直接将电能转化为光能,电号转换成光信号的发光器件:其特点是功耗低.高亮度.色彩艳丽.坑振动.寿命长(正常发光8-1 ...

  6. stm32核心板可以点亮灯吗_STM32库函数点亮LED

    很多码农写出的第一个程序是"Hello World!",因为这个程序简单容易上手,能给你自信心,让你更加坚定学习编程的信念:单片机也是如此,相信很多单片机老师教给你的第一个程序就是 ...

  7. 从零开始的51单片机——(1)点亮LED

    从零开始的51单片机--点亮LED 原理 对于开发板上的8个LED分别对应一个八位二进制数. 当对应位为1的时候LED灯灭,为0的时候灯亮 例如1111 1110则是第一个LED灯亮 在C语言中,我们 ...

  8. Raspberry PI 系列 —— 裸机点亮LED灯

    Raspberry PI 系列 -- 裸机点亮LED灯 背景 近期刚买了Raspberry PI B+,配置执行了官方提供的Raspbian系统,折腾了一周Linux系统,感觉没啥意思,于是就试着想了 ...

  9. 蓝桥杯小白系列之汇编点亮led灯

    蓝桥杯小白系列之汇编点亮led灯 1.源代码 2.逐条分析 (1)ORG 0000H (2)START: 伪指令,编译器可识别,单片机不可识别,可以随便起. (3)蜂鸣器设置 蓝桥板插电以后蜂鸣器常会 ...

最新文章

  1. 读论文之《基于EV10AQ190的高速ADC接口设计》
  2. 网站基本建设必备窍门了解一下!
  3. 剖析一个再次调整的seo排名案例
  4. 深度学习-Tensorflow2.2-RNN循环神经网络{11}-RNN空气污染预测-26
  5. 使用taro命令(taro convert)转h5碰到的一些问题
  6. 锐捷EG易网关远程命令执行漏洞-1
  7. c++ 遍历所有点且距离最短_编程小白暑期进阶笔记41-C语言数据结构与算法图遍历的应用...
  8. flask 部署_只需10分钟!就能用Flask,Docker和Jenkins部署机器学习模型
  9. nodejs mac java home_Mac上搭建nodejs开发环境
  10. TechEd 2007 HOL分享
  11. 中国ai人工智能发展太快_中国的AI:开放采购和幕后玩家
  12. Java常用算法-二分查找算法(两种方法实现)
  13. 泰坦尼克号预测结果分析报告
  14. 激光导航AGV的停车精度受环境变化的影响有多大?
  15. 幼儿园案例经验迁移_幼儿园故事教学的实施策略
  16. 中国石油大学远程教育《应急救援概论》第一阶段在线作业
  17. Markdown Katex 集合相关符号
  18. 洛谷P2678 [NOIP2015 提高组] 跳石头
  19. 女神节,CRMEB向女神致敬!官方特别设计免费ui小图标来了!
  20. WCDMA 中,扰码是怎么实现区分不同的信源的?

热门文章

  1. VisualVM远程连接Linux服务器通过jstatd方式监控JVM内存状态
  2. 日历视图的XML属性
  3. 【机器学习】feature_importances_ 参数源码解析
  4. Day11-递归性能测试
  5. css标签resolution,html/css to fit all screen resolution
  6. 曲线连接线_荷重位移曲线仪操作使用注意事项-荷重位移曲线仪厂家
  7. oracle12c多个pdb,ProxmoxVE 之 oracle12C 多CDB和PDB
  8. python龟图_python学习turtle(龟图标状态)
  9. Linux 压缩和解压命令
  10. bzoj 4827 [Hnoi2017]礼物——FFT