首页->【玩CortexM0】

64 0

[Nuvoton M0516] 实验一 GPIO的控制

首先我们需要看一些资料,从Nuvoton网站下载一些pdf文档,主要有:M051(DN_DE)_Series_SC_Rev1.00.pdf——中文版的51系列数据手册、M051寄存器配置手册_SC-LAN.pdf——寄存器配置手册。前者对了解芯片性能有用,后者针对寄存器编程非常非常有用。在本例的编程中,我们会较详细地按照手册编程,以后的实例就简单说一下,不详细地引用说明了。由于是中文手册,花点时间浏览一下很有意义。后边的编程主要靠后一个手册。

M0516有两种封装:QFN33和LQFP48两种,引脚数量不同,其他功能一样。除了个别像电源等固定引脚,一般的GPIO引脚都是复用功能的,可以用写管脚控制寄存器的方法改变管脚的工作模式。一共有5X8=40个GPIO。见图10[两张]。

打我们用的工程包是开Keil uV4,创建我们的首个工程。工程库包为M051Test.rar,

M051Test.rar,点击下载。展开后再此文件夹下操作。按照图11~15[一共7张]设置。

Keil  uV4打开工程后,需要设置选项,右击左边工程上的Option...,在弹出的菜单中按照图

本例设想测试一下芯片的所有GPIO,让它定时闪亮。为此需要做以下几个工作之一:

用双向二极管,串接1个1K的电阻,两边焊上杜邦插座;或LED段码+限流电阻1K,公共和段引脚焊上杜邦插座,见照片16。下边开始实验。16-焊接的双向LED和段码LED.JPG

按照寄存器手册6.4节,一直看到6.4.2,可以明白GPIO口的控制需要如下几个操作完成:

Px_MOD:管脚的工作模式

Px_DOUT:输出赋值

下边我们先完成LED点亮。小板上有3个LED分别连在P41、P42、P43,先点亮这3只LED。为了规范编程,我们规定程序分成几个区块:最前头是Include区,所有Include的文档都罗列在这里;接下来是自定义函数区,所有#Define的都罗列在这里;再接下来是变量定义区,所有变量定义罗列在此区域;再接下来是函数区域,函数区域的罗列按照执行顺序,这样就不需要声明函数了[除非例外];最后是main主函数;最最后是所有中断函数。

按照设计先写寄存器P4_MOD,而后输出P4x_DOUT的值,程序如下:

//Test All I/O Ok?

//INCLUDEs

#include "common.h"


//DEFINEs

#define P4_MODE 0x0054//定义P41,2,3为双向模式


//Define Variable


//Delay

void delay(unsigned int delayer){

  unsigned int i,j;

  for(i=0;i<delayer;i++){

    for(j=i;j>0;j--){;}

  }

}

//IO Initial

void ioInit(void){

 P4_PMD=0x0054;

 P41_DOUT=0;

 P42_DOUT=1;

 P43_DOUT=0;

}

//MAIN Programe

int main(void){

  ioInit();

  while(1){

    if(P41_DOUT==0){

      P41_DOUT=1;P42_DOUT=0;P43_DOUT=1;

    }else{

      P41_DOUT=0;P42_DOUT=1;P43_DOUT=0;

    }

  delay(1000);

  }

}

程序中定义了一个相对延时函数,起到LED亮一会儿的目的,本例没有设置系统时钟,默认为芯片内建的22MHz时钟。结果见照片17。17-P41,42,43IO连接的LED闪亮.JPG

为了测试所有的IO,我们继续编写一段函数,以完成所有IO闪亮,但由于P45、P46由于连接编程器,因此样机P45~P47几个口都不做测试了,况且板子没有将P4x的口引出,只有P0~P3各8位的32个IO口,改动程序如下:

//Test All I/O Ok?

//INCLUDEs

#include "common.h"


//DEFINEs

#define P0_MODE 0x5555

#define P1_MODE 0x5555

#define P2_MODE 0x5555

#define P3_MODE 0x5555

#define P4_MODE 0x5554


//Define Variable

int d5=0x5555,da=0xaaaa,fre;


//Delay

void delay(unsigned int delayer){

  unsigned int i,j;

  for(i=0;i<delayer;i++){

    for(j=i;j>0;j--){;}

  }

}

//I/O Initial

void ioInit(void){

 P0_PMD = P0_MODE;//P0 DOUT

 P1_PMD = P1_MODE;//P1 DOUT

 P2_PMD = P2_MODE;//P2 DOUT

 P3_PMD = P3_MODE;//P3 DOUT

 P4_PMD = 0x5554;

 P41_DOUT=0;

 P42_DOUT=1;

 P43_DOUT=0;

}

//Main program

int main(void){

 ioInit();

 while(1){

 P0_DOUT=d5;P1_DOUT=d5;P2_DOUT=d5;P3_DOUT=d5;

  delay(1000);

  P0_DOUT=da;P1_DOUT=da;P2_DOUT=da;P3_DOUT=da;

  if(P41_DOUT==0){P41_DOUT=1;P42_DOUT=0;P43_DOUT=1;}else{P41_DOUT=0;P42_DOUT=1;P43_DOUT=0;}

  delay(1000);

 }

}

结果见照片18。18-P41,42,43IO连接的LED闪亮.JPG


作者于2017-01-31 19:55:39修改!
楼主可见