TQQ2440第二节:流水灯

发布者:SerendipityJoy最新更新时间:2024-11-06 来源: cnblogs关键字:流水灯 手机看文章 扫描二维码
随时随地手机看文章

我是从学单片机才开始接触嵌入式,所以我一直都感觉还是从硬件在到上面的驱动,这样的而学习流程让我更加容易懂的一些,但是上班了发现公司没让我那样,一开始就给我一大批的代码,让我一段时间很消沉,不过现在也差不多熬过来了,但是回首这段时间,发现自己阅读那些令人费解的代码的能力有所提升把,但是现在自己还是打算从硬件到驱动好好的学习个彻底,上面启动代码没什么好说的,接着程序已经跳转到了c语言的入口Main函数这里了,接下来就会觉得很熟悉了(我也还是建议和我一样菜鸟的先不看那段启动代码,曾经在学校哪个启动代码让我费了很多的时间,想起来真的好不值,把其他的都会了,在回头看也就差不多了),好了开始正文了。


—————————————————————————————————————————————


硬件平台:TQ2440 (S3C2440A)


开发环境:ADS1.2


时      间:2010-12-12


—————————————————————————————————————————————


1:硬件电路:

image

可以看见是GPB5-8对应的LED1-4;所以相应的只要对相应的IO口进行操作就没有问题了;


2:2440的IO的配置

image

这里是2440的IO口的引脚,需要注意的是,除了GPA之外,其他的都有INPUT和OUTPUT功能,这一点我们后面配置自己相关函数的时候会看到。


所以我们只需要把GPB配置为IO口就好了。

image

所以如图我们需要的是输出,故,GPBCON=(0x01<<10);这样就把GPB5配置wie输出了,同理配置其他的管脚。


3: 相关代码的实现


   1: #define    GPBCON        (*(volatile unsigned long *)0x56000010)

   2: #define    GPBDAT        (*(volatile unsigned long *)0x56000014)

   3: #define    GPB5_out    (1<<(5*2))

   4: #define    GPB6_out    (1<<(6*2))

   5: #define    GPB7_out    (1<<(7*2))

   6: #define    GPB8_out    (1<<(8*2))

   7: void  wait(unsigned long dly)

   8: {

   9:     for(; dly > 0; dly--);

  10: }

  11: /*这个LED_Test1函数是直接copy韦东山的那本书里的代码,感觉这个简单就不用写,之所以写这个是为了验证后面自己的写法*/

  12: void LED_Test1(void)

  13: {

  14:     unsigned long i = 0;

  15:     GPBCON = GPB5_out|GPB6_out|GPB7_out|GPB8_out;

  16:     

  17:     GPBDAT = (~(i<<5));         // 根据i的值,点亮LED1-4

  18:     if(++i == 16)

  19:         i = 0;

  20:     wait(30000);

  21: }

  22: void Main(void)

  23: {

  24:     

  25:     while(1)

  26:     {

  27:         LED_Test1();

  28:         LED_Test();

  29:     }

  30: }

我因为在公司做驱动,感觉他门里面的代码的写法很不错,所以自己也打算改变一下写法,直接实现一个函数,对那组IO口的那个管脚配置和操作。


   1: #define IO_CON_BASE 0x56000000

   2: #define IO_DAT_BASE 0x56000004

   3: void GPIO_CONF_SET(unsigned int group,unsigned int index,unsigned int type)

   4: {

   5:     unsigned int *p_add=NULL;

   6:     unsigned int addr = IO_CON_BASE + (group*0x10);

   7:     unsigned int io_reg = type<<(index<<1);

   8:     p_add=(unsigned int *)(addr); 

   9:     *p_add=*p_add&~(0x3<<(index<<1));

  10:     *p_add=*p_add|io_reg;

  11: }

  12: void GPIO_OUT_PUT(unsigned int group,unsigned int index,unsigned int outval)

  13: {

  14:     unsigned int *p_add=NULL;

  15:     unsigned int addr = IO_DAT_BASE + (group*0x10);

  16:     unsigned int io_reg = outval<  17:     p_add=(volatile unsigned int *)(addr); 

  18:     *p_add=*p_add&~(0x1<  19:     *p_add=*p_add|io_reg;

  20: }

  21: void  wait(unsigned long dly)

  22: {

  23:     for(; dly > 0; dly--);

  24: }

  25: void LED_Test(void)

  26: {

  27:     //-------------5.6.7.8 conf OutPut

  28:     GPIO_CONF_SET(1,5,1);

  29:     GPIO_CONF_SET(1,6,1);

  30:     GPIO_CONF_SET(1,7,1);

  31:     GPIO_CONF_SET(1,8,1);

  32:     //-------------LED flash

  33:         GPIO_OUT_PUT(1,5,1);

  34:         wait(30000);

  35:         GPIO_OUT_PUT(1,6,1);

  36:         wait(30000);

  37:         GPIO_OUT_PUT(1,7,1);

  38:         wait(30000);

  39:         GPIO_OUT_PUT(1,8,1);

  40:         wait(30000);

  41:         GPIO_OUT_PUT(1,5,0);

  42:         wait(30000);

  43:         GPIO_OUT_PUT(1,6,0);

  44:         wait(30000);

  45:         GPIO_OUT_PUT(1,7,0);

  46:         wait(30000);

  47:         GPIO_OUT_PUT(1,8,0);

  48:         wait(30000);

  49: }

上面我把他改为p_add=*(unsigned int *)(addr);然后 p_add=p_add&~(0x3<<(index<<1));这样程序却跑不起来,不知道为什么,希望高手能解答一下。


觉得这样还不是很完美所以想把他直接定义为宏定义,这样直接拷贝到其他的文件开头就能用了。免得还得去声明和定义函数;


改造之后如下:


   1: #define IO_CON_BASE 0x56000000

   2: #define IO_DAT_BASE 0x56000004

   3: /*

   4: GPIO_CFG_SET说明:   group--表示是那组IO(注意没有GPA)

   5:                     index--表示这组中的那个引脚   

   6:                     type --表示是配置为输入还是输出等其他功能

   7: */

   8: #define GPIO_CFG_SET(group,index,type) do{

   9:                         (*(volatile unsigned int*)(IO_CON_BASE+group*0x10))&=~(0x3<  10:                         (*(volatile unsigned int*)(IO_CON_BASE+group*0x10))|=(type<  11:                         }while(0)

  12:                         

  13: /*

  14: GPIO_DAT_SET说明:   group--表示是那组IO(注意没有GPA)

  15:                     index--表示这组中的那个引脚   

  16:                     val  --表示对此引脚写入的数据

  17: */

  18: #define GPIO_DAT_SET(group,index,val) do{

  19:                         (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))&=~(0x1<  20:                         (*(volatile unsigned int*)(IO_DAT_BASE+group*0x10))|=(val<  21:                         }while(0)

  22: /*

  23: 因为GPA的控制寄存器,每个引脚只只占用一位,所以为了能统一这里,就没有把

  24: GPA加进来,而后面的GPB-GPJ的控制寄存器每个引脚对应2位

  25: */                        

  26: enum{GPB=1,GPC,GPD,GPE,GPF,GPG,GPH,GPI,GPJ};

  27: /*

  28: 从GPB开始由于用两位表示此引脚的功能所以有四种可能

  29: 0代表INPUT,1代表OUTPUT,2代表第三功能,3代表第四功能

  30: */

  31: enum{INPUT=0,OUTPUT,THI_FUNC,FOR_FUNC};

  32: /*

  33: 定义高低电平

  34: */

  35: enum{LOW=0,HIG};

  36: void  wait(unsigned long dly)

  37: {

  38:     for(; dly > 0; dly--);

  39: }

  40: void LED_Test(void)

  41: {

  42:     //-------------5.6.7.8 conf OutPut

  43:     GPIO_CFG_SET(GPB,5,OUTPUT);

  44:     GPIO_CFG_SET(GPB,6,OUTPUT);

  45:     GPIO_CFG_SET(GPB,7,OUTPUT);

  46:     GPIO_CFG_SET(GPB,8,OUTPUT);

  47:     //-------------LED flash

  48:     GPIO_DAT_SET(GPB,5,HIG);

  49:     wait(30000);

  50:     GPIO_DAT_SET(GPB,6,HIG);

  51:     wait(30000);

  52:     GPIO_DAT_SET(GPB,7,HIG);

  53:     wait(30000);

  54:     GPIO_DAT_SET(GPB,8,HIG);

  55:     wait(30000);

  56:     GPIO_DAT_SET(GPB,5,LOW);

  57:     wait(30000);

  58:     GPIO_DAT_SET(GPB,6,LOW);

  59:     wait(30000);

  60:     GPIO_DAT_SET(GPB,7,LOW);

  61:     wait(30000);

  62:     GPIO_DAT_SET(GPB,8,LOW);

  63:     wait(30000);    

  64: }


关键字:流水灯 引用地址:TQQ2440第二节:流水灯

上一篇:wince下sources\sources.cmn\Makefile.def的相关作用
下一篇:TQQ2440第一节:启动代码

推荐阅读最新更新时间:2026-03-21 10:35

《逗比小憨憨51单片机Proteus仿真系列》第20期基于单片机的简易流水灯仿真
源代码: #include reg52.h void Delay1ms(unsigned int count) { unsigned int i,j; for(i=0;i count;i++) for(j=0;j 120;j++); } void main(void) { unsigned char LEDIndex = 0; bit LEDDirection = 1; while(1) { if(LEDDirection) P1 = ~(0x01 LEDIndex); else P1 = ~(0x80 LEDIndex); if(LEDIndex==7) LEDDirection = !
[单片机]
《逗比小憨憨51单片机Proteus仿真系列》第2期51单片机的花式流水灯仿真
源代码: #include "reg52.h" #include "intrins.h" /*********************** Function : 花式流水实验 Hardware : 硬件连接:LED0-LED7 - P1.0-P1.7 Author : 欢迎关注逗比小憨憨 *******************/ #define u8 unsigned char #define u16 unsigned int u8 code tab = {0x7e,0xbd,0xdb,0xe7}; /* 声明子函数 */ void model1(); void model2();
[单片机]
【 STM 系列 】STM32F103 流水灯仿真
相关信息 芯片:STM32F103C6 开发环境:Keil 5 仿真环境:Proteus 8.9 仿真视频 https://www.bilibili.com/video/BV1qK4y1h7EM/ Proteus 仿真图 源代码 main.c #include stm32f10x.h #include"led.h" int main() { led_init(); while(1) { for(int i = 0; i = 5; i++) { LEDX_ON(i); delay500ms(); LEDX_OFF(i)
[单片机]
【 STM 系列 】STM32F103 <font color='red'>流水灯</font>仿真
STM32实现LED闪烁、流水灯与蜂鸣器功能详解教程
一、LED闪烁 1.新建文件夹 选择一个地方新建文件夹—3-1 LED灯闪烁 点开keil软件,点击Project–New ,新建工程 选择STM32F103C8,点ok 在刚才创建的文件夹LED灯闪烁里面,新建Start、Library、User 3个文件夹 2.配置文件 将固件库中arm下的文件和STM32F10x文件下的后3个文件,还有core文件复制到start文件夹下 start文件完成 同上步骤,将inc、和src的文件都复制到Library(这里只是一部分) Project的Template中这些复制到User文件夹中 3.添加工程组合文件 点击有三个箱子的标志(工程文件
[单片机]
STM32实现LED闪烁、<font color='red'>流水灯</font>与蜂鸣器功能详解教程
51单片机流水灯右移
#include STC89C5xRC.H void delay(unsigned int ms) { unsigned int i, j; for (i = ms; i 0; i--) { for (j = 125; j 0; j--) ; } } int i; int main() { P1 = 0xFF; // 8位占用一个字节 for (i = 0; i 9; i++) { P1 = P1 & 0xFF i; //右移 delay(500); } return 0; }
[单片机]
【GD32H757Z海棠派开发板使用手册】第一讲 GPIO-流水灯实验
1.GPIO-流水灯实验 1.1实验内容 通过本实验主要学习以下内容: GPIO结构及原理; GPIO输出功能实现; LED驱动原理。 1.2实验原理 1.2.1GPIO外设原理 GD32H7系列MCU最多支持135个通用I/O引脚(GPIO),分别为PA0 ~ PA10,PA13 ~ PA15,PB0 ~ PB15,PC0 ~ PC15,PD0 ~ PD15,PE0 ~ PE15,PF0 ~ PF15,PG0 ~ PG15,PH0 ~ PH15,PJ8 ~ PJ11,PK0 ~ PK2。各片上设备用其来实现逻辑输入/输出功能。每个GPIO端口有相关的控制和配置寄存器以满足特定应用的需求。片上设备GPIO引脚的外部中断由E
[单片机]
【GD32H757Z海棠派开发板使用手册】第一讲 GPIO-<font color='red'>流水灯</font>实验
80C51学习 流水灯
/* c语言常用预处理命令 1.#define使用 #define A PO 后面不用加分号、 #define PI 3.14 2.循环左移右移函数 _crol_(a,b)循环左移函数,a是左移的值,b是移动的位数。 _cror_(a,b)循环右移函数,a是右移的值,b是移动的位数。 包含在intrins.h库函数里面 */ #include reg52.h #include intrins.h typedef unsigned char u8; typedef unsigned int u16; #define led P2 void delay(u16 i)
[单片机]
89C51单片机实现的流水灯
/******************************************* Copyright: 2014.02.09.version1.0 File name: led.c Description: 自己做的流水灯89C51 Author: lxl Version: version1.0 Date: 2014.02.09 History: 无 *********************************************/ #include reg51.h /************************************************* Function: delay() Desc
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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