freetech

kinetis的跑马灯例程——GPIO输出的3种方法

0
阅读(4461)

一般使用一个新的MCU都是以IO口开始,本方介绍如何使用kinetis的IO口,用3种方式实现跑马灯效果。

在使用IO前要做下面2件事:

1、配置系统集成模块,打开GPIO的时钟。为了低功耗的设计,kinetis的很多功能默认是关着的,要用程序把用到的功能打开。

2、设置引脚复用,PORTA用作GPIO。

进行了以上配置,GPIO就可以工作了。介绍几个与IO口相关的寄存器:

GPIOX_PDDR – IO口方向寄存器,为1对应的位做输出,为0对应的位做输入。本例中GPIOA的26~29要设为1以做输出。

GPIOX_PDOR – IO口数据输出寄存器,当IO口做输出时,写该寄存器直接输出到引脚。本例中方法1用的该寄存器实现。

GPIOX_PSOR – IO口置位寄存器,当IO口做输出时,写该寄存器为1的位对应的引脚变高,为0的位对应的引脚不变。本例中方法2用的该寄存器实现。

GPIOX_PCOR – IO口复位寄存器,当IO口做输出时,写该寄存器为1的位对应的引脚变低,为0的位对应的引脚不变。本例中方法2用的该寄存器实现。

GPIOX_PTOR – IO口翻转寄存器,当IO口做输出时,写该寄存器为1的位对应的引脚翻转,为0的位对应的引脚不变。本例中方法3用的该寄存器实现。

GPIOX_PDIR - IO口数据输入寄存器,当IO口做输入时,读该寄存器得到引脚状态。本例中不涉及该寄存器。

下面是完整代码:

/*
* main implementation: use this 'C' sample to create your own application
*
*/

#define GPIO_PIN_MASK            0x3C000000
#define GPIO_PIN(x)                ((1<<x)&GPIO_PIN_MASK)

#include <stdio.h>

#include "derivative.h" /* include peripheral declarations */

void delay()
{
    int i =0;
    int j=0;
    for(i=0;i<3000;i++)
      for(j=0;j<1000;j++)
          asm("nop");
}

int main(void)
{
    int counter = 0;
    SIM_SCGC5 = SIM_SCGC5_PORTA_MASK | SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK;
         /* Set GPIOA pin26~29 as GPIO*/
         PORTA_PCR26=(PORT_PCR_MUX(1));
         PORTA_PCR27=(PORT_PCR_MUX(1));
         PORTA_PCR28=(PORT_PCR_MUX(1));
         PORTA_PCR29=(PORT_PCR_MUX(1));
          //set GPIOA pin26~29 to be output
         GPIOA_PDDR=GPIO_PDDR_PDD(GPIO_PIN(26))
                 | GPIO_PDDR_PDD(GPIO_PIN(27))
                 | GPIO_PDDR_PDD(GPIO_PIN(28))
                 | GPIO_PDDR_PDD(GPIO_PIN(29));
         GPIOA_PDOR = 0;//所有LED灭
    printf("Hello (Kinetis) World in 'C' from PK60X256 derivative! \n\r");
    for(;;)
    {
        for(counter=26;counter<=29;counter++)
        {
            /*
            //方式1:直接对输出寄存器赋值
            GPIOA_PDOR = GPIO_PDOR_PDO(GPIO_PIN(counter));
            delay();
            //方式2:置1、0操作
            GPIOA_PCOR = 0xFFFFFFFF;//全清0
            GPIOA_PSOR = GPIO_PDOR_PDO(GPIO_PIN(counter));//置位要点亮LED的位
            delay();
            */
            //方式3:反转操作
            GPIOA_PTOR = GPIO_PDOR_PDO(GPIO_PIN(counter));//反转要点亮LED的位
            delay();
            GPIOA_PTOR = GPIO_PDOR_PDO(GPIO_PIN(counter));//再反转回来
        }
    }
    return 0;
}

效果如下:D6->D3依次点亮

图片 005

图片 002

图片 003

图片 004

代码语言