TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录

发布者:古泉痴迷者最新更新时间:2020-12-17 来源: eefocus关键字:TQ210  S5PV210 手机看文章 扫描二维码
随时随地手机看文章

之前也学习过LDE闪烁程序,一般通过如下方式实现:


主要思想是通过操作寄存器地址的方式操作寄存器,这种实现方式的优点就是简单容易理解,但是具有一定的局限性,一般在较大的工程中不会这样实现,因为通过直接操作地址的方式实现,必定会频繁查询数据手册,查询相应寄存器地址,还有就是程序中会出现大量地址,可读性差不利于程序移植和优化。


通过学习,了解了一种通用的程序设计方式,特此记录


先说下大概思想:


1)引入GPIO基地址概念,建立GPIO结构体,这样每一个GPIO都可以通过”基地址+偏移地址“的思想查找到,避免了频繁操作地址的弊端。

2)位操作思想,不能为了实现某一个功能,影响其他功能,因此位操作的实现方式成为了程序设计中优先考虑的因素。


下面说下具体细节实现:


主要步骤如下(此处针对我使用的开发板TQ210,具体实现是一样的):

1.通过查询开发板原理图得到两个LED的引脚分别为: GPC0_3、GPC0_4 

2.查询GPIO的基地址为:0xE0200000

3.设置功能寄存器GPC0CON为输出 :因为输出为0001=Output

4.则32位的2进制值为:xxxx xxxx xxxx 0001  0001 xxxx xxxx xxxx 

5.设置完模式为输出:仍需设置到底是低电平输出,还是高电平输出。

6.设置组控制器:GPC0DAT 为高点亮LED


则32位的2进制值为:xxxx xxxx xxxx  0001 0001 xxxx xxxx xxxx   

设置组控制器:GPC0DAT 为低熄灭LED 

则32位的2进制值为:xxxx xxxx xxxx 0000 0000 xxxx xxxx xxxx   

(x代表未知,即保留其原有的状态)


具体程序分为以下几个程序:

1.start.S汇编文件 主要功能跳到C语言main函数

2.main.c 主程序 调用 led相关程序 延时程序等

3.map.lds 链接脚本文件 控制程序文件顺序

4.Makefie文件  

5.led.c  led.h  LED相关设置

6.cpu_io.h     地址赋值等相关操作

7.gpio.h        gpio结构体等


具体程序代码如下:     


start.S


.global _start

.global main


_start :

     bl   main

loop:

     b loop

.end


main.c


//main.c 

#include "led.h"

#include "cpu_io.h"


static void mydelay()

{

        volatile unsigned int i=0xfffff;

        while(i--);


}

void led_test()

{


      led_init();

      while(1)

      {   

         led_blink(1);

         mydelay();

         led_blink(0);

         mydelay();

      }   

}


int main()

{

        led_test();

        return 0;

}


led.c


#include "gpio.h"

#include "led.h"

#include "cpu_io.h"


void led_init(void)

{

        struct s5pv210_gpio *gpio_base=(struct s5pv210_gpio *) S5PV210_GPIO_BASE;

        unsigned int var;

        var =_REG(&gpio_base->gpio_c0.con);

        var &=~(0xFF<<(4*3));  //1111 1111 0000 0000 0000 

        var |= (0x11<<(4*3));  //0001 0001 0000 0000 0000

        writel(var,&gpio_base->gpio_c0.con); //11000

}


void led_blink(int status)

{

        struct s5pv210_gpio *gpio_base=(struct s5pv210_gpio *) S5PV210_GPIO_BASE;

        unsigned int var ;

        if(status)

        {   

                var  = _REG(&gpio_base->gpio_c0.dat);

                var &=~0x18;   //00011000

                writel(var,&gpio_base->gpio_c0.dat);

        }   

        else

        {   

                var  = _REG(&gpio_base->gpio_c0.dat);

                var |=0x18;

                writel(var,&gpio_base->gpio_c0.dat);

        }   


}


map.lds


OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")

OUTPUT_ARCH(arm)

ENTRY(_start)

SECTIONS

{

        . =0x0;

        . =ALIGN(4);

        .text   :   

        {   

                start.o

                *(.text)

        }   

        . =ALIGN(4);

        .rodata :

        {   

                *(.rodata)   

        }   

        . =ALIGN(4);

        .data   :   

        {   

                *(.data)

        }   

        . =ALIGN(4);

        .bss    :   

        {   

                *(.bss)

        }   

}


led.h


#ifndef LED_H

#define LED_H

void led_init(void);

void led_blink(int status);

#endif



gpio.h


#ifndef _ASM_ARCH_GPIO_H

#define _ASM_ARCH_GPIO_H


struct s5pc1xx_gpio_bank{

        unsigned int con;

        unsigned int dat;

        unsigned int pull;

        unsigned int drv;

        unsigned int pdn_con;

        unsigned int pdn_pull;

        unsigned char res1[8];  

};

struct s5pv210_gpio{

        struct s5pc1xx_gpio_bank gpio_a0;

        struct s5pc1xx_gpio_bank gpio_a1;

        struct s5pc1xx_gpio_bank gpio_b;

        struct s5pc1xx_gpio_bank gpio_c0;

        struct s5pc1xx_gpio_bank gpio_c1;

        struct s5pc1xx_gpio_bank gpio_d0;

        struct s5pc1xx_gpio_bank gpio_d1;

        struct s5pc1xx_gpio_bank gpio_e0;

        struct s5pc1xx_gpio_bank gpio_e1;

        struct s5pc1xx_gpio_bank gpio_f0;

        struct s5pc1xx_gpio_bank gpio_f1;

        struct s5pc1xx_gpio_bank gpio_f2;

        struct s5pc1xx_gpio_bank gpio_f3;

        struct s5pc1xx_gpio_bank gpio_g0;

        struct s5pc1xx_gpio_bank gpio_g1;

        struct s5pc1xx_gpio_bank gpio_g2;

        struct s5pc1xx_gpio_bank gpio_g3;

        struct s5pc1xx_gpio_bank gpio_i;

        struct s5pc1xx_gpio_bank gpio_j0;

        struct s5pc1xx_gpio_bank gpio_j1;

        struct s5pc1xx_gpio_bank gpio_j2;

        struct s5pc1xx_gpio_bank gpio_j3;

        struct s5pc1xx_gpio_bank gpio_j4;

};

#define S5PV210_GPIO_BASE (0xE0200000)

#endif 


cpu_io.h


#ifndef _S5PV210_CPU_H

#define _S5PV210_CPU_H



#define _REG(x) (*(volatile unsigned int *)(x)) 


#define readb(a) (*(volatile unsigned char *)(a))

#define readw(a) (*(volatile unsigned short *)(a))

#define readl(a) (*(volatile unsigned int *)(a))



#define writeb(v, a) (*(volatile unsigned char *)(a) = v)

#define writew(v, a) (*(volatile unsigned short *)(a) = v)

#define writel(v, a) (*(volatile unsigned int *)(a) = v)


#endif


关键字:TQ210  S5PV210 引用地址:TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录

上一篇:TQ210的裸机编程(一)点亮一个LED灯
下一篇:TQ210裸机编程(5)——系统时钟配置

推荐阅读最新更新时间:2024-10-29 15:59

S5PV210(TQ210)学习笔记——触摸屏驱动编写
电阻式触摸屏的驱动比较简单,可以采用输入子系统驱动框架来编写,而电容式触摸屏的驱动程序相对比较复杂,因为电容触控一般采用I2C接口控制,我在自己编写电容触控驱动的时候郁闷了好几天,当然,并不是因为I2C电容触控驱动繁琐,主要是天嵌TQ210的触摸屏驱动程序是以模块方式提供的,并不开放源代码,也没有提供触控的芯片手册,我曾通过技术咨询群和电话咨询的方式咨询过天嵌相关人士,想跟他们索取触控协议而不要所谓的触控驱动程序源码,但受保密协议限制不提供源码及手册。我们不去追究这些无聊的问题,只要找到触控芯片的型号并根据触控芯片型号找到对应的手册,然后就可以自己编写所谓的电容式触摸屏驱动了。 一 触控芯片分析 首先,卸下触摸屏的四个螺丝并翻过
[单片机]
<font color='red'>S5PV210</font>(<font color='red'>TQ210</font>)学习笔记——触摸屏驱动编写
TQ210裸机编程(1)——LED流水灯
两个文件start.S和led.c start.S .global _start @声明一个全局的标号 _start: bl main @跳转到C函数去执行 halt: b halt @死循环 led.c #define GPC0CON *((volatile unsigned int *)0xE0200060) #define GPC0DAT *((volatile unsigned int *)0xE0200064) void delay(volatile unsigned int t) { volatil
[单片机]
S5PV210 的 开发板上 点亮 一个 LED
材料:首先 准备一个 安装好 Linux 的 开发板 使用 xshell 工具 连接 开发板 ,winscp 工具 连接 开发板 , 准备 一个 Ubuntu 32位 ,装上 交叉编译链。。 使用下面 代码 和 Makefile 文件 进行编译 ,生成的 执行 文件 利用 winscp 软件复制到 Linux开发板上 ,利用 xshell 运行 这个可执行文件。 下面 代码的 功能 是 新建 一个 TCP 客户端 连接服务器 (Windows上 的一个 网络 调试工具 NetAssist.exe ,简称网络调试助手 ,类似串口工具) 注意 其中: #define LED_PATH /sys/devices/p
[单片机]
在 <font color='red'>S5PV210</font> 的 开发板上 点亮 一个 <font color='red'>LED</font> 灯
PIC单片机在ICD1上做LED灯的循环闪烁程序
;************************************************* ;* FLASH.ASM * ;************************************************* ;************************************************* ;* 本程序是一个LED灯的循环闪烁程序,用INT键来切换* ;* 闪烁模式 * ;************************************************* include p16f877.inc ;*---- MODESEL equ 20h MODESELB equ 21h
[单片机]
S5PV210开发 -- USB 你知道多少?(一)
USB接口也是经常用到的,这一篇还是从它的基础知识讲起。 一、USB介绍 通用串行总线(英语:Universal Serial Bus,缩写:USB)是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等其它相关领域。最新一代是USB 3.1,传输速度为10Gbit/s,三段式电压5V/12V/20V,最大供电100W ,新型Type C插型不再分正反。 二、USB版本
[单片机]
<font color='red'>S5PV210</font>开发 -- USB 你知道多少?(一)
TQ210_裸机编程(二)——按键控制LED
首先我们可以在开发板配套材料中找到按键的电路图,E:TQ210_CD开发板配套电路图Bottompdf格式TQ210_BOARD_V4_20121023。 可以看到按键key1~key6对应的地址线为XEINT0~XEINT5,我们暂时就只用前面几个按键。 然后我们再找地址线在板子中相应的引脚号。 可以看到 按键地址线XEINT0~XEINT5对应的管脚号为GPH0_1~GPH0_5。 现在在S5PV210_UM_REV1.1文档中就能找到GPH0的控制寄存器,对应的控制6个按键。 将按键控制寄存器都设置为外部中断处理。然后去设定外部中断的处理相应参数。 外部中断要设置2个中断寄存器,EXT_INT_CON,E
[单片机]
TQ210_裸机编程(二)——按键控制<font color='red'>LED</font>灯
2440裸机程序——定时器控制LED闪烁
工程当中需要添加 S3C2440A.s ;2440lib.c;main.c;timer.c 这四个程序。 主程序: /********************************************************************************************* * File name: main.c * Author: ZXL * Description: 通过定时器,让LED灯每0.5秒闪烁一次,蜂鸣器每0.5秒鸣叫一次 * History: 2013.5.8 **********************************************************
[单片机]
TQ210裸机编程(3)——按键(查询法)
首先查看TQ210的底板原理图 这次编程只操作KEY1和KEY2,在TQ210核心板原理图中搜索XEINT0 可以看出KEY1和KEY2分别接在S5PV210的GPH0_0和GPH0_1引脚。 这次编程使用查询法,需要设置这两个引脚为输入模式,然后循环读取引脚状态,当用户按下按键时,对应引脚为低电平,同时改变LED状态。 查看S5PV210芯片手册 start.S .global _start @声明一个全局的标号 _start: bl main @跳转到C函数去执行 halt: b halt @死循环 key.c #define GPC0CON *((volatile unsigne
[单片机]
<font color='red'>TQ210</font>裸机编程(3)——按键(查询法)
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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