在嵌入式系统的设计中,LED一般直接由CPU的GPIO(通用可编程I/O)口控制。GPIO一般由两组寄存器控制,即一组控制寄存器和一组数据寄存器。
屏蔽具体 CPU 的差异,假设在 GPIO_REG_CTRL 物理地址中控制寄存器处的第 n 位写入 1 可设置 GPIO 口为
输出,在地址 GPIO_REG_DATA 物理地址中数据寄存器的第 n 位写入 1 或 0 可在引脚上产生高或低电平,则在
无操作系统的情况下,设备驱动代码如下:
//无操作系统时的LED驱动
#define reg_gpio_ctrl *(voltatile int*)(ToVirtual)(GPIO_REG_CTRL)
#define reg_gpio_ctrl *(voltatile int*)(ToVirtual)(GPIO_REG_DATA)
//初始化LED
void LightInit(void)
{
reg_gpio_ctrl |=(1<<n);//设置GPIO为输出
}
//点亮LED
void Lighton(void)
{
reg_gpio_data |=(1<<n);//在GPIO上输出高电平
}
void LightOff(void)
{
reg_gpio_data &=~(1<<n);//在GPIO上输出低电平
}
上述程序中的LightInit()、LightOn()、LightOff()都直接作为驱动提供给应用程序的外部接口函数。
程序中ToVirtual()的作用是当系统启动了硬件MMU之后,根据物理地址和虚拟地址的映射关系,将寄存器
的物理地址转化为虚拟地址