kinetis的跑马灯例程——GPIO输出的3种方法
0赞一般使用一个新的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依次点亮