打印
[ZLG-ARM]

CortexM0菜鸟之IO配置(第7天作业)

[复制链接]
3458|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hotpower|  楼主 | 2010-9-6 23:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hotpower 于 2010-9-6 23:47 编辑

在菜农决定做CortexM0菜鸟之瞬间就感觉最简单和最难做的就是复用IO的配置问题。
在5年前成功挑战NXP的ARM7头文件后,感觉M0应该更上一层楼,特别是见到NXP的LPC11XX.H后。
在弟子的唆使下,菜农开始了LPC11XXcfg.h的构造,第一个理念就是打造GPIO尿童系列。
近来在网上看到很多有关GPIO的求助,也看了NXP的例程,感觉应该专题一番。

在LPC11XXcfg.h下,GPIO的配置实际就是“三板斧”:
//KEY1宏定义三板斧
#define PioKey1   PIO2_6 //P2.6
#define PortKey1  P2     //P2
#define PinKey1   Pin6   //Px.6
//KEY2宏定义三板斧
#define PioKey2   PIO2_0 //P2.0
#define PortKey2  P2     //P2
#define PinKey2   Pin0   //Px.0
//LED1宏定义三板斧
#define PioLed1   PIO1_8 //P1.8
#define PortLed1  P1     //P1
#define PinLed1   Pin8   //Px.8
//LED2宏定义三板斧
#define PioLed2   PIO0_2 //P0.2
#define PortLed2  P0     //P0
#define PinLed2   Pin2   //Px.2
//LED3宏定义三板斧
#define PioLed3   PIO2_7 //P2.7
#define PortLed3  P2     //P2
#define PinLed3   Pin7   //Px.7
//LED4宏定义三板斧
#define PioLed4   PIO2_8 //P2.8
#define PortLed4  P2     //P2
#define PinLed4   Pin8   //Px.8
//LED5宏定义三板斧
#define PioLed5   PIO2_1 //P2.1
#define PortLed5  P2     //P2
#define PinLed5   Pin1   //Px.1
//LED6宏定义三板斧
#define PioLed6   PIO1_9 //P1.9
#define PortLed6  P1     //P1
#define PinLed6   Pin9   //Px.9
//LED7宏定义三板斧
#define PioLed7   PIO3_4 //P3.4
#define PortLed7  P3     //P3
#define PinLed7   Pin4   //Px.4
//LED8宏定义三板斧
#define PioLed8   PIO3_5 //P3.5
#define PortLed8  P3     //P3
#define PinLed8   Pin5   //Px.5
//BEEP宏定义三板斧
#define PioBeep   PIO0_8 //P0.8
#define PortBeep  P0     //P0
#define PinBeep   Pin8   //Px.8

SYSCON.SYSAHBCLKCTRL.Bits.GPIOCLK = 1;//使能GPIO的时钟
//BeepInit
IOCON.PioBeep.Bits.FUNC = IOCON_PIO;//选择PIO0.8为BEEP
IOCON.PioBeep.Bits.MODE = IOCON_INACTIVE;//高阻
PortBeep.DIR.Bits.PinBeep = 1;//设置输出方式
PortBeep.DATA.Bits.PinBeep = 0;//蜂鸣器不响
//Key1Init
IOCON.PioKey1.Bits.FUNC = IOCON_PIO;//选择P2.6为KEY1
IOCON.PioKey1.Bits.MODE = IOCON_PULLUP;//上拉电阻
PortKey1.DIR.Bits.PinKey1 = 0;//设置输输入方式
PortKey1.DATA.Bits.PinKey1 = 1;//释放键盘
//Key2Init
IOCON.PioKey2.Bits.FUNC = IOCON_PIO;//选择P2.0为KEY2
IOCON.PioKey2.Bits.MODE = IOCON_PULLUP;//上拉电阻
PortKey2.DIR.Bits.PinKey2 = 0;//设置输输入方式
PortKey2.DATA.Bits.PinKey2 = 1;//释放键盘
//Led1Init
IOCON.PioLed1.Bits.FUNC = IOCON_PIO;//选择PIO1.8为LED1
IOCON.PioLed1.Bits.MODE = IOCON_INACTIVE;//高阻
PortLed1.DIR.Bits.PinLed1 = 1;//设置输出方式
PortLed1.DATA.Bits.PinLed1 = 1;//LED1灭
//Led2Init
IOCON.PioLed2.Bits.FUNC = IOCON_PIO;//选择PIO0.2为LED2
IOCON.PioLed2.Bits.MODE = IOCON_INACTIVE;//高阻
PortLed2.DIR.Bits.PinLed2 = 1;//设置输出方式
PortLed2.DATA.Bits.PinLed2 = 0;//LED2亮
//Led3Init
IOCON.PioLed3.Bits.FUNC = IOCON_PIO;//选择PIO2.7为LED3
IOCON.PioLed3.Bits.MODE = IOCON_INACTIVE;//高阻
PortLed3.DIR.Bits.PinLed3 = 1;//设置输出方式
PortLed3.DATA.Bits.PinLed3 = 1;//LED3灭
//Led4Init
IOCON.PioLed4.Bits.FUNC = IOCON_PIO;//选择PIO2.8为LED4
IOCON.PioLed4.Bits.MODE = IOCON_INACTIVE;//高阻
PortLed4.DIR.Bits.PinLed4 = 1;//设置输出方式
PortLed4.DATA.Bits.PinLed4 = 0;//LED4亮
//Led5Init
IOCON.PioLed5.Bits.FUNC = IOCON_PIO;//选择P2.1为LED5
IOCON.PioLed5.Bits.MODE = IOCON_INACTIVE;//高阻
PortLed5.DIR.Bits.PinLed5 = 1;//设置输出方式
PortLed5.DATA.Bits.PinLed5 = 1;//LED5灭
//Led6Init
IOCON.PioLed6.Bits.FUNC = IOCON_PIO;//选择P1.9为LED6
IOCON.PioLed6.Bits.MODE = IOCON_INACTIVE;//高阻
PortLed6.DIR.Bits.PinLed6 = 1;//设置输出方式
PortLed6.DATA.Bits.PinLed6 = 0;//LED6亮
//Led7Init
IOCON.PioLed7.Bits.FUNC = IOCON_PIO;//选择P3.4为LED7
IOCON.PioLed7.Bits.MODE = IOCON_INACTIVE;//高阻
PortLed7.DIR.Bits.PinLed7 = 1;//设置输出方式
PortLed7.DATA.Bits.PinLed7 = 1;//LED7灭
//Led8Init
IOCON.PioLed8.Bits.FUNC = IOCON_PIO;//选择P3.5为LED8
IOCON.PioLed8.Bits.MODE = IOCON_INACTIVE;//高阻
PortLed8.DIR.Bits.PinLed8 = 1;//设置输出方式
PortLed8.DATA.Bits.PinLed8 = 0;//LED8亮

不多说了,代码很明白。
再举Uart和I2C
//位域写法
IOCON.TXD.Bits.FUNC = IOCON_TXD;
IOCON.TXD.Bits.MODE = IOCON_PULLUP;
//寄存器写法
// IOCON.TXD.Regs = (IOCON_TXD << IOCON_FUNC)
//                | (IOCON_PULLUP << IOCON_MODE);
//位域写法
IOCON.RXD.Bits.FUNC = IOCON_RXD;
IOCON.RXD.Bits.MODE = IOCON_PULLUP;
//寄存器写法
// IOCON.RXD.Regs = (IOCON_RXD << IOCON_FUNC)
//                | (IOCON_PULLUP << IOCON_MODE);

   SYSCON.SYSAHBCLKCTRL.Bits.UARTCLK = 1;//使能UART的时钟
   SYSCON.UARTCLKDIV.Regs = 1;//UART时钟分频器值

SYSCON.PRESETCTRL.Bits.I2C0_RST_N = 1;//复位I2C,否则死机
SYSCON.SYSAHBCLKCTRL.Bits.I2CCLK = 1;
//位域写法
IOCON.PIO0_4.Bits.FUNC    = IOCON_SCL;//选择PIO0.4为I2C_SCL
IOCON.PIO0_4.Bits.I2CMODE = IOCON_SCL_I2CMODE;//选择PIO0.4为I2C_SCL
IOCON.PIO0_5.Bits.FUNC    = IOCON_SDA;//选择PIO0.5为I2C_SCL
IOCON.PIO0_5.Bits.I2CMODE = IOCON_SDA_I2CMODE;//选择PIO0.5为I2C_SDA
//寄存器写法
/*
IOCON.PIO0_4.Regs = (IOCON_SCL << IOCON_FUNC)
                   | (IOCON_SCL_I2CMODE << IOCON_I2CMODE);
IOCON.PIO0_5.Regs = (IOCON_SDA << IOCON_FUNC)
                   | (IOCON_SDA_I2CMODE << IOCON_I2CMODE);
*/



HotPower@163.com  2010.9.6 23:28 于雁塔菜地

菜农通讯工具:

新浪网页版:http://t.sina.com.cn/hotpower
新浪手机版:http://t.sina.cn/hotpower

网 易微 博:http://t.163.com/hotpower
腾讯QQ:    1270688699

菜农邮箱:     HotPower@163.com
菜农导航: http://www.hotpage.net.cn/

相关帖子

沙发
vivisa| | 2010-11-30 17:58 | 只看该作者
这个不错,对我有帮助,谢谢,

使用特权

评论回复
板凳
diny| | 2010-12-1 14:11 | 只看该作者
我还看作业了。哈哈,

使用特权

评论回复
地板
爱在2012| | 2010-12-29 16:09 | 只看该作者
谢谢。

使用特权

评论回复
5
hotpower|  楼主 | 2011-1-25 16:10 | 只看该作者
顶,准备开战

使用特权

评论回复
6
amini| | 2011-1-25 19:50 | 只看该作者
尽管一知半解。但顶是必须的。

使用特权

评论回复
7
bairan168| | 2011-1-27 16:04 | 只看该作者
我对IO配置总有点的迷糊。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1460

主题

21619

帖子

506

粉丝