LED事件

在CSR8670中,PIO口被映射到一个寄存器中,寄存器中的每一位代表着一个PIO口,比如:我们想让PIO1口为led1,PIO2口为led2,则:

#define LED1 	 0x01    	/* bit 1 */

#define LED2 	 0x02    	/* bit 2 */

然后使用PioSetDir32函数将PIO口设置为output,在通过PioSet32函数来设置led的点亮/熄灭。

下面程序可以实现简单的led1和led2的交替闪烁:

#include <message.h>
#include <pio.h>		/* Peripheral Input/Output */

#define LED1 	 0x01    	/* bit 1 */
#define DELAY1   200 		/* ms */

#define LED2     0x02 		/* bit 2 */
#define DELAY2   400 		/* ms */

static void led_controller1( Task t, MessageId id, Message payload )
{
	PioSet32( LED1, (PioGet32() ^ LED1) );
	MessageSendLater( t, 0, 0, DELAY1 );
}

static void led_controller2( Task t, MessageId id, Message payload )
{
	PioSet32( LED2, (PioGet32() ^ LED2) );
	MessageSendLater( t, 0, 0, DELAY2 );
}

static TaskData led_controller1_task = { led_controller1 };
static TaskData led_controller2_task = { led_controller2 };

int main(void)
{
	PioSetDir32(0xFF, 0xFF);         /* Set all PIO to be output */
	PioSet32(0xFF, 0);               /* Set all PIO off (0) */

	MessageSend( &led_controller1_task, 0 , 0 );
	MessageSend( &led_controller2_task, 0 , 0 );
	MessageLoop();

	return 0;
}

当我们需要led表现出复杂的动作时,上述编写代码就显得臃肿和繁琐,为此,CSR提供了ledparse.exe工具来解析一个可以用来自定义led动作的.led文件,我们可以将我们想要led表现的动作写在.led文件中,比如:我们想实现led1 ~ led4的跑马灯效果,则我们只需编写这样一个example.led文件即可,

// An example LED file

// ‘led‘ is used to define the dedicated output LED that are available on certain
// BlueCore Variants. 

// ‘pio‘ is used for controlling standard pio lines.

#ifdef BC5_MODULE
led 0 LED2
led 1 LED1

pio 0 LED3
pio 1 LED4
#else
pio 0 LED1
pio 1 LED2
pio 2 LED3
pio 3 LED4
#endif

// Flash each LED, one after the other.
pattern PATTERN1 RPT
    LED1 ON  200
    LED1 OFF 0
    LED2 ON  200
    LED2 OFF 0
    LED3 ON  200
    LED3 OFF 0
    LED4 ON  200
    LED4 OFF 0

// Flash alternate pairs
pattern PATTERN2 RPT
    LED1 LED3 ON  200
    LED1 LED3 OFF 0
    LED2 LED4 ON  200
    LED2 LED4 OFF 0

然后通过ledparse.exe工具对其进行解析:

ledparse example.led example

即可生成example.c和example.h代码文件,我们在主文件中引用example.h文件即可:

#include <message.h>
#include <charger.h>
#include <pio.h>                /* Peripheral Input/Output */
#include <print.h>              /* debug PRINT */

#include "example.h"

#define DELAY 5000
#define NO_OF_PATTERNS  (2)

uint8 patterns[] = { PATTERN1, PATTERN2};
uint8 count;

static void led_controller1( Task t, MessageId id, Message payload )
{
    PRINT(("Pattern No. %d\n", count ));

    ledsPlay( patterns[count] );

    count++;
    count %= NO_OF_PATTERNS;

    MessageSendLater( t, 0, 0, DELAY );
}

static TaskData led_controller1_task = { led_controller1 };

int main(void)
{
#if BC5_MODULE
    /* Prevent the LED0 flashing during charging */
    ChargerConfigure(CHARGER_SUPPRESS_LED0, 1);
#endif

    MessageSend( &led_controller1_task, 0 , 0 );
    MessageLoop();

    return 0;
}

至此一个led的跑马灯效果就出来了,同时led文件还定义了另一个led动作。

时间: 2024-11-04 09:21:41

LED事件的相关文章

linux input输入子系统应用分析

输入设备(如按键.键盘.触摸屏.鼠标等)是典型的字符设备,其一般的工作机理是底层在按键.触摸等动作发送时产生一个中断(或驱动通过timer定时查询),然后CPU通过SPI.I2 C或外部存储器总线读取键值.坐标等数据,放入1个缓冲区,字符设备驱动管理该缓冲区,而驱动的read()接口让用户可以读取键值.坐标等数据. 显然,在这些工作中,只是中断.读值是设备相关的,而输入事件的缓冲区管理以及字符设备驱动的file_operations接口则对输入设备是通用的.基于此,内核设计了输入子系统,由核心层

usb键鼠驱动分析【钻】

本文转载自:http://blog.csdn.net/orz415678659/article/details/9197859 一.鼠标 Linux下的usb鼠标驱动在/drivers/hid/usbhid/usbmouse.c中实现 1.加载初始化过程 1.1模块入口 [cpp] view plain copy module_init(usb_mouse_init); 1.2初始化函数 [cpp] view plain copy static int __init usb_mouse_init

Linux驱动之输入子系统框架

    好记性不如烂笔头,整理一下笔记~ Linux驱动之输入子系统框架 输入子系统将该类驱动划分为3部分 1.核心层 input.c 2.设备层 Gpio_keys.c ... 3.事件处理层 Evdev.c 事件处理层为纯软件的东西,设备层涉及底层硬件,它们通过核心层建立联系,对外提供open write等接口. 1.我们首先来看,核心层 input.c如何向外界提供接口 在 input_init 中注册了字符设备驱动 register_chrdev(INPUT_MAJOR, "input&

USB驱动——键盘驱动(控制传输)

本文以 usbkbd.c 为例,分析 usb 键盘驱动程序. static int __init usb_kbd_init(void) { int result = usb_register(&usb_kbd_driver); if (result == 0) printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" DRIVER_DESC "\n"); return result;

Linux usb 驱动程序范例

linxu_usb驱动之框架 USB骨架程序可以被看做一个最简单的USB设备驱动的实例. 首先看看USB骨架程序的usb_driver的定义 [cpp] view plain copy static struct usb_driver skel_driver = { .name =          "skeleton", .probe =  skel_probe,             //设备探测 .disconnect =  skel_disconnect, .suspend

《零死角玩转STM32》-17-EXTI外部中断/事件控制器

/* * 本文中的相关图片来自火哥的教程,只作为随笔记录,无侵权之意 * 21:25:46, 2017-04-08 */ EXTI:外部中断/事件控制器.STM32F429共有23根,其中EXTI0~EXTI15,分别对应GPIO中的PX0 ~ PX15,另外7根线有如下用途: (中间省略了EXTI1 ~ EXTI15) EXTI功能框图如下所示: 按照图中的序号标识,可以清晰的看出外部GPIO引脚上的电平变化是如何传递到内核,即GPIO -> EXTI -> NVIC,并触发相应的中断/事件

5、3个LED任务闪烁

1.代码例程: 1 /***************************************************************************************************************************** 2 * 3 * 文件名称:main.c 4 * 文件功能:主函数 5 * 文件说明:无 6 * 7 ***************************************************************

Windows Phone 8.1中处理后退键的HardwareButtons.BackPressed事件

在WP8中,处理后退键比较简单,重写OnBackKeyPress事件即可.如经常用的双击后退键退出的功能,用户在MainPage页面第一次点击后退键时,弹出一个对话框"是否退出?",在短时间内如两秒钟内再次点击后退键则退出,否则不退出.只要处理e.Cancel值为true即可取消后退键的默认操作.代码如下: private DateTime dtBackTimeFirst; private DateTime dtBackTimeSecond; ? protected override

STM32学习笔记(九) 外部中断,待机模式和事件唤醒

学会知识只需要不段的积累和提高,但是如何将知识系统的讲解出来就需要深入的认知和系统的了解.外部中断和事件学习难度并不高,不过涉及到STM32的电源控制部分,还是值得认真了解的,在本文中我将以实际代码为例详细讲解这些内容,希望对每一个阅读者有帮助. 1.外部中断 如果已经学习了SysTick系统时钟滴答实验,掌握了Cortex-M3中断的相关知识,那么外部中断也是比较好理解的,和SysTick中断一样,外部中断也是当有信号触发时,如果中断屏蔽寄存器允许触发,就会产生中断,这时CPU查找中断向量表,