历史上的今天
返回首页

历史上的今天

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

正在发生

2020年12月17日 | TQ210天嵌开发板S5PV210 LED闪烁程序C语言代码记录

2020-12-17 来源:eefocus

之前也学习过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


推荐阅读

史海拾趣

Andersen Laboratories Inc公司的发展小趣事

为了满足客户对高效物流配送的需求,AnalogicTech建立了完善的物流配送体系。公司通过与快递公司或邮政EMS合作,实现了全国范围内的快速配送,并确保产品的及时送达。此外,AnalogicTech还为客户提供增值税专用发票和一系列优惠政策,进一步提升了客户满意度。

Central Semiconductor公司的发展小趣事

除了封装产品外,Central Semiconductor还致力于裸片产品的开发和供应。公司提供的裸片产品具有多种包装形式,如华夫包、未切晶圆、金属框架已切晶圆和塑料环装已切晶圆等,满足了不同客户的需求。

裸片产品的开发和供应不仅拓宽了Central的产品线,也展示了公司在半导体制造领域的全面实力和技术优势。通过提供高质量的裸片产品,Central进一步巩固了其在电子行业中的地位和影响力。

Compound Photonics公司的发展小趣事

经过几年的努力,Compound Photonics在LCoS领域取得了显著的进步,成为了业内知名的LCoS方案商之一。公司的技术与产品得到了市场的广泛认可,成功应用在Lumus最新的二维扩瞳模组中。这次合作不仅提升了Compound Photonics的市场地位,也为其带来了可观的商业回报。

Allegro公司的发展小趣事

尽管在Micro LED领域遭遇了挫折,但Compound Photonics并没有因此沉沦。相反,公司凭借其在LCoS领域的深厚技术积累和良好的市场口碑,吸引了众多潜在合作伙伴的关注。其中,Snap公司表现出了强烈的收购意向。这一消息传出后,Compound Photonics的市场价值得到了进一步提升,公司的发展前景也变得更加广阔。

这五个故事展示了Compound Photonics公司在电子行业里发展起来的一些关键节点和重大事件。从收购Syntax-Brillian开启微显示领域之路,到微投显示模组项目失利后转向LCoS方向,再到成为业内知名LCoS方案商并与Lumus合作,以及与Plessey合作开发Micro LED产品遭遇Meta竞争,最后到Snap的收购意向,每一个故事都反映了公司在不同阶段的挑战与机遇。通过这些故事,我们可以看到Compound Photonics公司在电子行业里不断进取、创新发展的精神风貌。

Carling Technologies公司的发展小趣事

在发展过程中,Carling Technologies还通过收购其他企业来增强自身实力。例如,公司收购了Maretron品牌,将其纳入旗下,并充分利用其在船舶监控和控制解决方案方面的优势,为前沿产品和解决方案的持续开发提供支持。这种收购与品牌整合的策略不仅丰富了公司的产品线,也扩大了其在特定市场的影响力。

HAHN - Elektrobau GmbH & Co KG公司的发展小趣事

高通公司在追求技术创新的同时,也积极履行企业社会责任。公司发布了《2023高通中国企业责任报告》,详细介绍了高通如何通过赋能数字化转型、负责任地经营以及可持续地运营等战略重点领域,推动社会公平发展。高通与中国乡村发展基金会、中国红十字基金会等多个机构合作,开展智慧农业、基层医务工作者培训等项目,助力乡村振兴和医疗卫生事业发展。此外,高通还致力于STEM教育,通过合作项目为下一代创新者提供技能和知识支持。这些举措不仅体现了高通的社会责任感,也为其在电子行业中的长远发展奠定了良好的社会基础。

问答坊 | AI 解惑

请问大家用C开发AVR时使用的是哪个开发环境,哪个更好用.

请问大家用C开发AVR时使用的是哪个开发环境,哪个更好用. 刚刚从C51转到AVR我这里有三个开发环境,AVR Studio | ICCAVR | cvavr | 其中,AVR Studio是买仿真器自带的,现在准备用Mega64做个。产品不知哪个开发环境好用更适合开发呢? 请大家指点 ...…

查看全部问答>

arm

ARM入门笔记…

查看全部问答>

FPGA可综合性对初学着的一些建议

FPGA可综合性对初学着的一些建议一、HDL不是硬件设计语言 过去笔者曾碰到过不少VHDL或Verilog HDL的初学者问一些相似的问题,诸如如何实现除法、开根号,如何写循环语句等等。在这个论坛上,也时常能看到一些网友提出这一类的问题。 对于这些问 ...…

查看全部问答>

Android模拟器 ZT

Android中提供了一个模拟器来模拟ARM核的移动设备。Android的模拟器是基于QEMU开发的,QEMU是一个有名的开源虚拟机项目(详见http://bellard.org/qemu/),它可以提供一个虚拟的ARM移动设备。Android模拟器被命名为goldfish,用来模拟包括下面一些 ...…

查看全部问答>

用dds9854线性扫频,幅度变化的问题

dds9854 FM CHIRP模式线性扫频,从20M到40M,幅度下降很明显,用反sinc滤波器效果也不好,有什么好方法,或者我想做个功放,让增益从20M到40M增加,补偿一下,不知道怎么做,大侠们帮帮小弟,在此谢过!…

查看全部问答>

我想做一个数据采集卡的驱动程序

我想做一个数据采集卡的驱动程序,希望高人们给点指点,尤其是打印功能的完善.…

查看全部问答>

IC (es56031)时序问题

有哪位弄过ES56031混响吗? 我按照datasheet的时序,采用UCOM模式,依次发送D4,D3,D2,D1,SHEEP = 10110,但是就是得不到正确的延时啊,总是得到最小的那个延时12MS,我怀疑是一个初始值,也就是说我没有设置成功。…

查看全部问答>

Retarget.c的用法

最近用8962做了一个tftp服务器,其中要用到Retarget.c这个文件,请问下各位大虾,这个文件的具体作用,怎样改写??…

查看全部问答>

基于LabVIEW图形界面的TI LM3S8962的开发--问题讨论帖

此贴为基于LabVIEW图形界面的TI LM3S8962的开发的问题讨论帖,大家有任何问题都可以在此贴上提出,相信我们广大的坛友一定会帮助你解决问题。   注意:如果遇到问题了,最好是可以将关于问题的图片传上来,这样可以帮助你更好的描述问题,也 ...…

查看全部问答>

(转)树莓派购买建议

先要普及一下,正版树莓派目前世面上,从颜色来分,有绿色板子(UK和国产)、红色板子(国产)、蓝色板子(国外),分别简称绿版、红板、蓝版;从性能来说目前(2013.3.23)最高内存为512M,CPU为700ma,其余的都是山寨或者仿制的,或者打着树莓派 ...…

查看全部问答>