[ZLG-MCU] 祝贺ZLG-MCU版面成为Luminary专版,特发一个简单的GPIO例程

[复制链接]
3729|6
 楼主| LPC900 发表于 2007-11-28 15:20 | 显示全部楼层 |阅读模式
//&nbsp;定时反转PB0管脚,如果接有LED则会不断闪烁发光<br /><br />#include&nbsp;&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_gpio.h&quot;<br />#include&nbsp;&nbsp;&quot;src/sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;src/gpio.h&quot;<br /><br />//&nbsp;将较长的标识符定义为较短的形式<br />#define&nbsp;&nbsp;SysCtlPeriphEn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable<br />#define&nbsp;&nbsp;GPIOPinTypeIn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOInput<br />#define&nbsp;&nbsp;GPIOPinTypeOut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOOutput<br /><br />#define&nbsp;&nbsp;PB0&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTB_BASE,&nbsp;GPIO_PIN_0<br /><br />void&nbsp;&nbsp;timeDelay&nbsp;(unsigned&nbsp;long&nbsp;&nbsp;ulVal)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;(&nbsp;--ulVal&nbsp;!=&nbsp;0&nbsp;);<br />}<br /><br />int&nbsp;&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;ucPins&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;定义临时变量<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;timeDelay(1500000L);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;开机延迟<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriphEn(SYSCTL_PERIPH_GPIOB);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能GPIOB端口<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeOut(PB0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置PB0为输出<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(PB0,&nbsp;ucPins);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;ucPins最低位写入PB0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucPins&nbsp;^=&nbsp;0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;反转ucPins最低位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeDelay(200000L);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /> 相关链接:<a href='http://www.zlgmcu.com/LUMINARY/Stellaris.asp'>http://www.zlgmcu.com/LUMINARY/Stellaris.asp</a>
 楼主| LPC900 发表于 2007-11-28 15:32 | 显示全部楼层

GPIO读写例程

//&nbsp;如果PB0接按键、PB1接LED,则可以通过按键控制LED亮灭<br /><br />#include&nbsp;&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_gpio.h&quot;<br />#include&nbsp;&nbsp;&quot;src/sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;src/gpio.h&quot;<br /><br />//&nbsp;将较长的标识符定义成较短的形式<br />#define&nbsp;&nbsp;SysCtlPeriphEn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable<br />#define&nbsp;&nbsp;GPIOPinTypeIn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOInput<br />#define&nbsp;&nbsp;GPIOPinTypeOut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOOutput<br /><br />#define&nbsp;&nbsp;PB0&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTB_BASE,&nbsp;GPIO_PIN_0<br />#define&nbsp;&nbsp;PB1&nbsp;&nbsp;&nbsp;&nbsp;GPIO_PORTB_BASE,&nbsp;GPIO_PIN_1<br /><br />void&nbsp;&nbsp;timeDelay&nbsp;(unsigned&nbsp;long&nbsp;&nbsp;ulVal)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;(&nbsp;--ulVal&nbsp;!=&nbsp;0&nbsp;);<br />}<br /><br />int&nbsp;&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;ucVal;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;timeDelay(1500000L);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;开机延迟<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriphEn(SYSCTL_PERIPH_GPIOB);&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能GPIOB模块<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeIn(PB0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置PB0为输入模式<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeOut(PB1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置PB1为输出模式<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucVal&nbsp;=&nbsp;GPIOPinRead(PB0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;读取PB0的状态<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(PB1,&nbsp;(ucVal&nbsp;&lt&lt&nbsp;1));&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;将PB0的状态写入PB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeDelay(300);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
 楼主| LPC900 发表于 2007-11-28 15:34 | 显示全部楼层

分三步走实现对GPIO的操作

操作GPIO只需要分三步走,很简单:<br /><br />  1.&nbsp;使能GPIO模块<br />     通过调用函数SysCtlPerphEn(&nbsp;)实现。<br /><br />  2.&nbsp;配置GPIO管脚<br />     函数GPIOPinTypeOut(&nbsp;):配置指定管脚为输出模式。<br />     函数GPIOPinTypeIn(&nbsp;):配置指定管脚为输入模式。<br /><br />  3.&nbsp;访问GPIO管脚<br />     函数GPIOPinWrite(&nbsp;):改写管脚状态。<br />     函数GPIOPinRead(&nbsp;):读取管脚状态。<br />
ATmega16 发表于 2007-11-28 16:27 | 显示全部楼层

GPIO实例要弄就弄个BITBAND读写IO口实例。

楼上能否给个BITBAND读写IO口实例。
 楼主| LPC900 发表于 2007-11-28 16:53 | 显示全部楼层

GPIO结构比较特殊,如果用Bit-Banding访问反而不方便

这两个例程是利用《Stellaris驱动库》访问GPIO,已经比较方便了,只需分三步走。<br /><br />如何利用Bit-Banding访问GPIO,我已经研究过了,发现较难理解,操作也麻烦,还不如直接用《Stellaris驱动库》方便。
ATmega16 发表于 2007-11-29 08:53 | 显示全部楼层

BITBAND读写IO口效率更高

BITBAND读写IO口效率更高,还可以替代位域读写IO口,很好啊
 楼主| LPC900 发表于 2007-11-29 09:03 | 显示全部楼层

GPIO模块遵循的是FiRM规范

  Luminary单片机GPIO模块的设计遵循FiRM(Foundation&nbsp;IP&nbsp;for&nbsp;Real-Time&nbsp;Microcontrollers)规范。<br />  虽然ARM&nbsp;Cortex-M3内核支持片内SRAM和外设的Bit-band位操作,但是GPIO设计成了FiRM规范,本来就不打算用Bit-band,因此建议还是要用《手册》里规定的方法来访问。这种结构的GPIO也有很大好处,能够通过一条语句来对多个管脚同时进行操作,而与操作不相关的管脚保持不变。<br /><br />在贴个例程,同时访问多个GPIO管脚:<br /><br />#include&nbsp;&nbsp;&quot;hw_types.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_memmap.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;hw_gpio.h&quot;<br />#include&nbsp;&nbsp;&quot;src/sysctl.h&quot;<br />#include&nbsp;&nbsp;&quot;src/gpio.h&quot;<br /><br />#define&nbsp;&nbsp;SysCtlPeriphEn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeripheralEnable<br />#define&nbsp;&nbsp;GPIOPinTypeOut&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeGPIOOutput<br /><br />#define&nbsp;&nbsp;PIN0&nbsp;&nbsp;&nbsp;GPIO_PIN_0<br />#define&nbsp;&nbsp;PIN1&nbsp;&nbsp;&nbsp;GPIO_PIN_1<br /><br />void&nbsp;&nbsp;timeDelay&nbsp;(unsigned&nbsp;long&nbsp;&nbsp;ulVal)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;(&nbsp;--ulVal&nbsp;!=&nbsp;0&nbsp;);<br />}<br /><br />int&nbsp;&nbsp;main&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;ucVal&nbsp;=&nbsp;0x01;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;timeDelay(1500000L);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;开机延迟<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SysCtlPeriphEn(SYSCTL_PERIPH_GPIOB);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;使能GPIOB模块<br />&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinTypeOut(GPIO_PORTB_BASE,&nbsp;(PIN0&nbsp;|&nbsp;PIN1));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;设置PB0和PB1为输出模式<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(;;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GPIOPinWrite(GPIO_PORTB_BASE,&nbsp;(PIN0&nbsp;|&nbsp;PIN1),&nbsp;ucVal);&nbsp;&nbsp;//&nbsp;ucVal写入PB0和PB1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ucVal&nbsp;^=&nbsp;0x03;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;ucVal最低2位同时取反<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timeDelay(200000L);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

130

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部