您的位置:首页 > 其它

RTEMS-BBB(七):LED点亮

2015-08-05 16:19 260 查看
首先明确硬件地址

AM335X 共4组 GPIO 模块,每组 32 pins
USR0~USR3 对应 GPIO1_21~GPIO1_24
GPIO_OE1: 第一组 GPIO 输出允许(每一位对应一只GPIO引脚,0-输出,1-输入)
GPIO_CLR1: GPIO 引脚清"0" (写 "1" 清0,写"0"无效)
GPIO_SET1: GPIO 引脚置"1" (写 "1" 置1,写"0"无效)
GPIO_OUT1: 输出控制

#define GPIO1           0x4804C000
#define GPIO_OE1      (GPIO1+0x134)
#define GPIO_OUT1     (GPIO1+0x13C)
#define GPIO_CLR1     (GPIO1+0x190)
#define GPIO_SET1     (GPIO1+0x194)

将 GPIO1_21~GPIO1_24 设为输出:
*(int *)GPIO_OE1 &= ~(0xf<<21);

4个LED亮:
*(int *)GPIO_CLR1 |= (0xf<<21);
或者    *(int *)GPIO_OUT1 &= ~(0xf<<21);
4个LED灭:
*(int *)GPIO_SET1 |= (0xf<<21);
或者    *(int *)GPIO_OUT1 |= (0xf<<21);
根据此编写test.c
#include <stdlib.h>
#include <stdio.h>
#include <bsp.h>
#define GPIO1           0x4804C000
#define GPIO_OE1      (GPIO1+0x134)
#define GPIO_OUT1     (GPIO1+0x13C)
#define GPIO_CLR1     (GPIO1+0x190)
#define GPIO_SET1     (GPIO1+0x194)
rtems_task Init(rtems_task_argument ignored)
{
printf("LED TASK\n");
int i=0;
while (1)
{
for(i=1;i<4;i++)
{
if(i!=4)
{
*(int *)GPIO_OE1 = ~(1<<(21+i));
rtems_task_wake_after( 100 );
*(int *)GPIO_OUT1 =  ~(1<<(21+i));
rtems_task_wake_after( 50 );
*(int *)GPIO_OUT1 = 0xf<<21;
}
else
i=0;
}
}
/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_MAXIMUM_TASKS 10
#define CONFIGURE_INIT
#include <rtems/confdefs.h>
初始化一个TASK,rtems_task_wake_after控制亮灭时间
下面将这个led加入到rki的shell中
将test.c转为led_cmd.c
初始化一个led_command任务,然后设置一下return 0,控制任务运行的时间
在local_shell_cmds.c中增加
int led_command( int argc, char *argv[]);
Add command下添加
rtems_shell_add_cmd("led","misc","LED working",led_command);
以后的应用也可以这样开发,再生成rki.elf和bone_rki.elf-sdcard.img后烧写到SD卡启动后
shell中输入led,启动程序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: