原创 轻松学习Stellaris系列ARM

2010-5-7 16:48 3637 5 5 分类: MCU/ 嵌入式

利用驱动库只要懂C语言就能轻松玩转Stellaris系列ARM



Luminary Micro公司推出的Stellaris(群星)系列ARM采用的是结构简单、功耗低、性能出众的ARM Cortex-M3处理器内核。Luminary Micro公司免费地提供了基于C语言(符合ANSI C标准)的《Stellaris外设驱动库》,并且源代码是公开的。因此用户完全可以摒弃晦涩难懂的汇编语言,也不需要掌握底层寄存器的操作细节,只要懂C语言就能轻松玩转Stellaris系列ARM。
现在,Luminary Micro公司新推出的芯片内部已经以ROM形式固化了《Stellaris外设驱动库》。将驱动库固化到ROM当中是一项先进的创新举措,具有多方面的好处:
?? 免费提供,不存在版权费问题(royalty-free)
?? 不会占用用户的任何Flash资源
?? 库函数被调用时会临时占用极少量的SRAM资源,返回时自动释放
?? 最大限度地提高代码密度
?? 加快程序执行速度
?? 固化的驱动库同时也是Bootloader,提供UART、I2C、SSI等多种接口的ISP下载
下面两个例程完成同样的功能:点亮接在PA3管脚的LED指示灯(低电平有效),一个采用寄存器方式,另一个则利用驱动库。对比结果很明显:利用驱动库开发的应用程序不仅编写起来简单快速,而且代码简洁、可读性性强。尤其对开发大型程序而言,采用驱动库更能够增强可靠性和安全性,同时显著降低维护成本。
程序清单1 采用底层寄存器的示例程序(晦涩难懂)
#define HWREG(x) (*((volatile unsigned long *)(x)))
#define SYSCTL_BASE 0x400FE000
#define RCGC2 (SYSCTL_BASE + 0x108)
#define GPIOA_BASE 0x40004000
#define GPIOA_DATA (GPIOA_BASE + 0x000)
#define GPIOA_DIR (GPIOA_BASE + 0x400)
#define GPIOA_AFSEL (GPIOA_BASE + 0x420)
#define GPIOA_DR2R (GPIOA_BASE + 0x500)
#define GPIOA_DR4R (GPIOA_BASE + 0x504)
#define GPIOA_DR8R (GPIOA_BASE + 0x508)
#define GPIOA_ODR (GPIOA_BASE + 0x50C)
#define GPIOA_PUR (GPIOA_BASE + 0x510)
#define GPIOA_PDR (GPIOA_BASE + 0x514)
#define GPIOA_SLR (GPIOA_BASE + 0x518)
#define GPIOA_DEN (GPIOA_BASE + 0x51C)
int main(void)
{
HWREG(RCGC2) |= 0x01; /* 使能GPIOA端口 */


HWREG(GPIOA_DIR) |= 0x08; /* 设置方向和模式 */
HWREG(GPIOA_AFSEL) &= ~0x08;
HWREG(GPIOA_DR2R) |= 0x08; /* 设置驱动强度 */
HWREG(GPIOA_DR4R) &= ~0x08;
HWREG(GPIOA_DR8R) &= ~0x08;
HWREG(GPIOA_SLR) &= ~0x08;
HWREG(GPIOA_ODR) &= ~0x08; /* 设置管脚类型 */
HWREG(GPIOA_PUR) &= ~0x08;
HWREG(GPIOA_PDR) &= ~0x08;
HWREG(GPIOA_DEN) |= 0x08;
HWREG(GPIOA_DATA+ (0x08 << 2)) = 0x00; /* PA3输出低电平 */
for (;;);
}
程序清单2 利用驱动库的示例程序(简捷高效)
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_sysctl.h>
#include <hw_gpio.h>
#include <sysctl.h>
#include <gpio.h>
/* 将较长的函数名定义为较短的形式 */
#define SysCtlPeriEnable SysCtlPeripheralEnable
#define GPIOPinTypeOut GPIOPinTypeGPIOOutput
int main(void)
{
SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA); /* 使能GPIOA端口 */
GPIOPinTypeOut(GPIO_PORTA_BASE , GPIO_PIN_3); /* 将PA3管脚配置为输出*/
GPIOPinWrite(GPIO_PORTA_BASE , GPIO_PIN_3 , 0); /* PA3管脚输出低电平 */
for (;;);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条