[新手园地] 【第四批】Metalor笔记1 - GPIO操作(基于软件延时的流水灯)

[复制链接]
3659|13
 楼主| Metalor 发表于 2011-11-16 22:28 | 显示全部楼层 |阅读模式
工作繁忙实在是没什么空。
先看了两天文档,了解了NUC120的一些信息,然后看了Ryanhsiung 兄的一个程序,在其基础上,做了些适合自己风格的修改,算是开工了。

其实这篇就是抄啦,只为熟悉NUC120的GPIO基本操作。接触过51、AVR、瑞萨、LPC2103,说实话很不习惯NUC120的GPIO的操作。不过熟悉就好啦~~
以下代码只是一个基于软件延时的流水灯,让助学板上的4颗LED灯依次点亮,连定时器都没用。
此为第一篇,不知道是否太“低俗”而不符合要求,不过呢笔记会一直写下去的,只是会比一般人慢吧。
接下来准备搞一个裸奔的架构,然后在其基础上添加各种功能,再然后这么大个ROM不跑跑OS实在是说不过去,学OS也是申请这块板的主要目的啦。
自己有一个之前在学校用过的1602,端口和助学板上的LCD端口对不上,准备跳跳线再焊焊补补拿来用用,一步步来吧~~
好了,上代码:

main.c:
#include "includes.h"

int main (void)
{
vLED_GPIO_Init();
while(1)
{
  vLED_Control(D_PIN_LED1,D_LED_ON); //First LED on
  vDelay();       //Delay a while
  vAllLedOff();      //All LED off
  
  vLED_Control(D_PIN_LED2,D_LED_ON); //Second LED on
  vDelay();
  vAllLedOff();
  
  vLED_Control(D_PIN_LED3,D_LED_ON); //Third LED on
  vDelay();
  vAllLedOff();
  
  vLED_Control(D_PIN_LED4,D_LED_ON); //Fourth LED on
  vDelay();
  vAllLedOff();   
}
}

void vDelay(void)
{
uint32_t DelayTime = 1200000;  //About 1s
while(DelayTime--);
}


led.c:
#include "includes.h"
void vLED_GPIO_Init(void)
{
   DrvGPIO_Open( E_D_GPLED1, D_PIN_LED1, E_IO_OUTPUT );
   DrvGPIO_Open( E_D_GPLED2, D_PIN_LED2, E_IO_OUTPUT );
   DrvGPIO_Open( E_D_GPLED3, D_PIN_LED3, E_IO_OUTPUT );
   DrvGPIO_Open( E_D_GPLED4, D_PIN_LED4, E_IO_OUTPUT );
   
   vAllLedOff();   
}

void vAllLedOff(void)
{
vLED_Control(D_PIN_LED1,D_LED_OFF);    //这里我就不用这个初始化,其实
vLED_Control(D_PIN_LED2,D_LED_OFF);
vLED_Control(D_PIN_LED3,D_LED_OFF);
vLED_Control(D_PIN_LED4,D_LED_OFF);
}

void vLED_Control(uint8_t led ,uint8_t status)
{
E_DRVGPIO_PORT e_temp;
switch(led)
{
  case   D_PIN_LED1:
   e_temp = E_D_GPLED1;
   break;
  case   D_PIN_LED2:
   e_temp = E_D_GPLED2;
   break;
  case   D_PIN_LED3:
   e_temp = E_D_GPLED3;
   break;
  case   D_PIN_LED4:
   e_temp = E_D_GPLED4;
   break;
  default:
    return;   //防止进入下面的执行程序
}  

if(D_LED_OFF == status)
{        
  DrvGPIO_SetBit(e_temp,led);
}
else
{   
  DrvGPIO_ClrBit(e_temp,led);      
}
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-11-16 22:49 | 显示全部楼层
学习就是模仿,开始是熟悉。不急。实际我真不喜欢库函数。但是了解它实现还是有参考价值的。俺就喜欢红杏和老师暴力的头文件。
 楼主| Metalor 发表于 2011-11-16 23:23 | 显示全部楼层
恩,有空会多看看。

那个附件貌似有点问题。
再传一次。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| Metalor 发表于 2011-11-16 23:28 | 显示全部楼层
基于Systick的来了。
明天有空会把裸奔构架建起来~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-11-16 23:40 | 显示全部楼层
群里有我一个基于systick的裸奔框架。
hotpower 发表于 2011-11-17 08:00 | 显示全部楼层
可以看出,gpio这些库函数的操作不好,必须一位一位的操作,而我们经常需要对某个端口都数个位同时操作,故这样操作效率肯定低下。
 楼主| Metalor 发表于 2011-11-17 10:31 | 显示全部楼层
是,感觉很不方便。
有空多参考下菜农。那个群号是多少?
hotpower 发表于 2011-11-17 21:38 | 显示全部楼层
晕,下面的老头里有12047788.

发放裤子,以便参加选美。
watch186 发表于 2011-11-18 00:04 | 显示全部楼层
LZ好速度啊  我还在忙ISP……:'(
hotpower 发表于 2011-11-18 00:40 | 显示全部楼层
不快也不由他,选美不等人呀!下周开始选美了!
 楼主| Metalor 发表于 2011-11-18 08:22 | 显示全部楼层
。。。这也叫快啊
整天加班呢
watch186 发表于 2011-11-26 10:58 | 显示全部楼层
LZ的这个模块化貌似有点 牵强啊  有点那种是  为了模块而故意  模块的感觉  
case   D_PIN_LED1:
   e_temp = E_D_GPLED1;
   break;
  case   D_PIN_LED2:
   e_temp = E_D_GPLED2;
   break;
像进行case选择中  选择了一堆D_PIN_LEDx  结果选出来还都是E_GPA,而后面的操作
DrvGPIO_SetBit(e_temp,led);中  e_temp  和  led  其实又是在用E_D_GPLEDn赋值,那前面的case选择就当是摆设啦,根本没有用到啊  呵呵  是不是啊
其实这比给的库函数更加麻烦啦而不是简单啦……
这只是我的愚见啊   我现在也在寻找一种比较适合的  函数框架啊  呵呵
 楼主| Metalor 发表于 2011-11-27 10:53 | 显示全部楼层
仔细看了笔记的,赞一个~!
首先,这个不是我写的,一楼已经说了此篇是借鉴Ryanhsiung 。
其次,这样写是效率比较低,但却是为了移植、改硬件方便而设计,是有其道理的。
x181084431 发表于 2011-11-29 22:07 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

224

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部