注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
wstt的个人空间 https://home.eeworld.com.cn/space-uid-241610.html [收藏] [复制] [分享] [RSS]
日志

EasyArm1138学习笔记(一)——IO操作

已有 3062 次阅读2011-2-23 10:56 |个人分类:Cortex-M3

IO操作中我准备做两个实验

(1)       IO口点亮LED,这就是让IO输出低电平(注板上的LED是阴极接在IO口,阳极由VCC串电阻上拉),这个实验是IO输出的实验。目的是熟悉工程配置,IAR的环境很熟悉,第一次做ARM的工程,用的的模板工程。

(2)       用按键输入让LED亮灭变换,主要是做IO的输入实验。

下面是LED和KEY的电路。

IO口点亮LED实验

套用了标准工程模板,这个模板中很体贴的做了systemInit.hsystemInit.c的文件。我在systemInit.h中添加了对两个按键和三个LEDIO口做了定义。

//define KEY1

#define  KEY1_PERIHP  SYSCTL_PERIPH_GPIOD         //需要使能的外设类型

#define  KEY1_PORT    GPIO_PORTD_BASE   //IO端口

#define  KEY1_PIN     GPIO_PIN_1                     //对应的引脚

这个我添加了注释后面的就是完全一样的。

 

//define KEY2

#define  KEY2_PERIPH  SYSCTL_PERIPH_GPIOG

#define  KEY2_PORT    GPIO_PORTG_BASE

#define  KEY2_PIN     GPIO_PIN_5

 

//define LED1

#define  LED1_PERIPH  SYSCTL_PERIPH_GPIOD

#define  LED1_PORT    GPIO_PORTD_BASE

#define  LED1_PIN     GPIO_PIN_0

 

//define LED2

#define  LED2_PERIPH  SYSCTL_PERIPH_GPIOG

#define  LED2_PORT    GPIO_PORTG_BASE

#define  LED2_PIN     GPIO_PIN_2

 

//define LED3

#define  LED3_PERIPH  SYSCTL_PERIPH_GPIOG

#define  LED3_PORT    GPIO_PORTG_BASE

#define  LED3_PIN     GPIO_PIN_3

然后是主函数:

int main(void)

{

    jtagWait();               //  防止JTAG失效,重要!

clockInit();               //  时钟初始化:晶振,6MHz

SysCtlPeripheralEnable(LED1_PERIPH|LED2_PERIPH|LED3_PERIPH);

//使能三个IO外设,其实LED2LED3在同一个IO端口

    GPIOPinTypeGPIOOutput(LED1_PORT,LED1_PIN);//指定的LED1管脚为推挽输出模式

    GPIOPinTypeGPIOOutput(LED2_PORT,LED2_PIN);//指定的LED1管脚为推挽输出模式

    GPIOPinTypeGPIOOutput(LED3_PORT,LED3_PIN);//指定的LED1管脚为推挽输出模式

    for (;;)

    {

      GPIOPinWrite(LED1_PORT,LED1_PIN,0X00);//点亮LED1

      GPIOPinWrite(LED1_PORT,LED1_PIN,0Xff); //熄灭LED1

      GPIOPinWrite(LED2_PORT,LED2_PIN,0X00);//点亮LED2

      GPIOPinWrite(LED2_PORT,LED2_PIN,0Xff); //熄灭LED2

      GPIOPinWrite(LED3_PORT,LED3_PIN,0X00);//点亮LED3

      GPIOPinWrite(LED3_PORT,LED3_PIN,0Xff); //熄灭LED3

    }

}

由于有库支持,我觉得这样搞不得真谛啊,不过我只是简单熟悉下外设,基本够了。

 

按键实验

实现基本的IO输入功能:按键KEY1按下的时候LED1点亮,KEY1松开则LED1熄灭。

主函数如下:

int main(void)

{

    jtagWait(); //防止JTAG失效,重要!

    clockInit(); //时钟初始化:晶振,6MHz

    SysCtlPeripheralEnable(LED1_PERIPH|KEY1_PERIHP);  //外设使能LED1KEY1所在的IO端口

    GPIOPinTypeGPIOOutput(LED1_PORT,LED1_PIN);//设置LED1所在的引脚为推挽输出

    GPIOPinTypeGPIOInput(KEY1_PORT,KEY1_PIN); //设置KEY1所在的IO引脚为高阻输出

    for (;;)

    {

      if(GPIOPinRead(KEY1_PORT,KEY1_PIN))//读到按键为高电平,即按键没被按下

      {

        GPIOPinWrite(LED1_PORT,LED1_PIN,0Xff);//LED1为熄灭状态

      }

      else

      {

        GPIOPinWrite(LED1_PORT,LED1_PIN,0X00);//按键为低电平,则LED1点亮

      }

    }

}

 

我用这两个非常简单的IO实验了解了在驱动库的基础上操作IO的方式,基本上熟悉了驱动库基础上配置MCU的方式。说句实话驱动库给coding带来了极大的便利,以至于根本不需要看底层的配置寄存器了。但给人一种心里毛毛的感觉,没去看最底层,很不踏实。所以我觉得基于驱动库把学ARM作为入门MCU可能不太好,看的高了下面基础的东西就看不到了。一直很不赞成把51作为入门的MCU,觉得太老用起来麻烦,入门很困难。现在看来这么做还是很有道理的,正因为51配置麻烦,逐个寄存器的写啊读啊,才把基础给掌握了。这些都是初识M3的一些想法,扯得有些远了。

流明的M3给我还有一个很深的感受就是它的IO很有特色,可配置为推挽输出,开漏输出和高阻输入,最有意思的是驱动电流可选为2mA4mA8mA和带转换速率控制的8mA

它的解释是驱动电流却大,功耗高,所以可以根据负载选择合适的驱动电流来降低功耗。带转换速率控制的8mA开始的时候让我很不解,什么意思?后来发现是这么回事:比如负载需要配置到8mA驱动,但是普通的8mA驱动它的上升下降时间为6ns,但是我们并不需要这么快的速率,那么就可以使用带转换速率控制的8mA驱动模式,这样上升下降时间增加了,但是信号变慢电磁干扰就降低了。这个IO真的很有特色,可以说是高级了,我也是第一次见到,以前用的MCUDSPFPGA都没见到这种功能。也算是流明的这款MCU的过人之处吧,不过其他厂商的M3有没有这样的功能我也不知道,这里就带各位朋友斧正了。

此次暂时作结吧!按照目标开始看定时器。

LED电路

按键KEY电路

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章