1.平台信息:MINI2440
2.编译器:ARM Developer Suite v1.2
3.参考资料:
二、驱动原理:
MINI2440上四盏led的电路原理图如下:
MINI2440与led设备的连接图:
驱动原理:
从led的电路原理图看,如果nLED_n(n=1、2、3、4)端接高电平时,led将处于熄灭状态;如果nLED_n(n=1、2、3、4)端接低电平时,led将被点亮。而从LED设备与MINI2440的连接图可以看出,nLED_n端的电平高低受MINI2440的GPIO口控制,其对应关系如下:
LED |
GPIO |
Led1 |
GPB5 |
Led2 |
GPB6 |
Led3 |
GPB7 |
Led4 |
GPB8 |
因此只要能够控制CPU的GPIO口输出高低电平就可以控制led灯的熄灭,这也就是led裸驱动的原理。
S3C2440中,GPB代表了一组有11个GPIO口(即从GPB0~GPB10)的GPIO口组, 每个GPIO口除了输入输出功能外,还有其他的复用功能,因此在使用GPIO口前需要先选择是使用GPIO的输入输出功能还是复用功能;此外,S3C2440的GPIO口内部配有可供用户配置的上拉电阻功能。具体而言,对GPB的控制具体为对以下三个寄存器的控制:
GPBCON配置使用GPIO口的输入输出功能还是复用功能;使用输入输出功能时,是使用输出功能还是输入功能。
GPBDAT数据寄存器。输出功能时通过向该寄存器写数据控制对应pin脚的高低电平,输入功能时通过读取该寄存器获取给pin脚的高低电平状态,该寄存器的0至10bit位对应GPB0~GPB10口。
GPBUP上拉电阻配置寄存器。
程序流程图:
代码分析:
点击(此处)折叠或打开
- 1.led_init
- /*
- * led初始化函数,配置led相关的GPIO
- */
- void led_init(void)
- {
- /*1设置GPB5-GPB8口为输出功能*/
- /*1.1清零*/
- rGPBCON &= ~((3<<10)|(3<<12)|(3<<14)|(3<<16));
- /*1.2置位*/
- rGPBCON |= ((1<<10)|(1<<12)|(1<<14)|(1<<16));
- /*2设置GPB5-GPB8口输出1,led全灭*/
- rGPBDAT |= ((1<<5)|(1<<6)|(1<<7)|(1<<8));
- }
- 2. led_on
- /*
- * led点亮函数,点亮指定的led灯
- * index 参数指定要点亮的led,如MINI2440_LED1...
- */
- void led_on(int index)
- {
- if(0!=(index&MINI2440_LED_ALL))
- {
- /*向GPBDAT寄存器写数据,以控制对应GPIO口的电平输出*/
- rGPBDAT &= ~index;
- }
- }
- 3. led_off
- /*
- * led熄灭函数,熄灭指定的led灯
- * index 参数指定要熄灭的led,如MINI2440_LED1...
- */
- void led_off(int index)
- {
- if(0!=(index&MINI2440_LED_ALL))
- {
- /*向GPBDAT寄存器写数据,以控制对应GPIO口的电平输出*/
- rGPBDAT |= index;
- }
- }
附件为完整的源码包及ADS工程文件: led.rar