芯片开放社区
直播中

杨万富

7年用户 1525经验值
擅长:526774
私信 关注
[技术讨论]

【1024平头哥开发套件开发体验】- sc5654 中级使用方法

【1024平头哥开发套件体验】- sc5654 中级使用

基本功能    任务 队列 建立与调用

一、 基本功能控制

  • LED控制

    • 文件位置:app_led.c



事件中会调用根据不同事件调用led状态函数

void app_set_led_state(int state) // 文件app_led.c中实现

led状态函数中最终会调用

led_control(led_dev, COLOR_BLACK, a, b);

//其中led一直循环执行,a表示亮灯时间,b表示熄灭时间,单位为毫秒。

  • 控制方式:

aa:可以直接调用led_control设置LED状态。

bb:修改事件对应内容,实现不同事件下LED状态切换。


  • KEY控制

    • 文件位置:app_key_user.c


按键获取为两种,短按和长按,在按键初始化中设置各个按键,连接回调函数。

按键初始化函数:static void button_task_init(void)

初始化分为2步:1 按键初始化 2 键值事件连接。

第一步,初始化按键引脚:


第二部,键值事件连接


  • 控制方式:

Aa:使用结构体button_evt_t 来控制按键id,获取方式,长按时间

    id: button_id

    获取方式:event_id

(BUTTON_PRESS_LONG_DOWN长按  ,BUTTON_PRESS_UP短按)

    长按时长:press_time

       单位:毫秒

Bb:连接回调函数:

    int button_add_event(int evt_id, button_evt_t *buttons, int button_count, button_evt_cb_t evt_cb, void *priv);

// evt_id 按键事件号 button_evt_t控制结构体 evt_cb回调函数



任务函数:

前面说到

button_add_event(inc_long, b_tbl, sizeof(b_tbl)/sizeof(button_evt_t), button_evt, "inc_long");

函数实现了获取键值并连接回调函数,其中button_evt为一个事件控制函数,用来给事件传递参数,控制事件发生类型。

事件函数实现函数:


  • 修改:可以修改对应回调函数实现每次按键按下功能,也可以修改回调函数,实现按键不同功能。



  • GPIO控制

    • 文件位置Package -> chip_sc5654 -> driver -> silan_gpio_source.c
    • 控制方式


Aa:包含头文件 #include ”silan_gpio_source.h”

Bb:设置io模式

    void silan_io_input(int io);

void silan_io_output(int io);

void silan_io_direction(int io, int dir);

Cc:设置io电平

    void silan_io_set_high(int io);

void silan_io_set_low(int io);

void silan_io_set_value(int io, int val);

       Dd:获取io电平

           int silan_io_get(int io);

二、 任务队列函数的创建和调用

1. 事件函数实际是在操作系统函数中实现参数的传递,由此原理可以轻松的创建事件任务和实现事件函数的控制回调。

2. 重要函数:

       a): 创建新的队列

              int aos_queue_new(aos_queue_t *queue, void *buf, unsigned int size, int max_msg);      

  b): 创建新的任务

              int aos_task_new_ext(aos_task_t *task, const char *name, void (*fn)(void *), void *arg, int stack_size, int prio);

       c): 向队列传递参数

              int aos_queue_send(aos_queue_t *queue, void *msg, unsigned int size);

       d): 从队列获取参数

              int aos_queue_recv(aos_queue_t *queue, unsigned int ms, void *msg, unsigned int *size);

  • 步骤:

先创建队列和任务,外部使用队列传参,任务中获取队列数据实现事件处理。





二、 任务建立以及GPIO设置实现任务控制gpio

1. 先创建任务(可以附加队列的创建)

       重要函数:aos_task_new_ext aos_queue_new

                     aos_task_new_ext 用于实现任务创建。

                     aos_queue_new 用于创建队列,实现参数传递。

       注意事项: 创建任务时注意空间大小,过小会导致任务创建失败。


2. 实现任务函数

       重要函数 silan_io_output    silan_io_set_value   aos_msleep aos_queue_recv

                     silan_io_output 设置io为输出模式

                     silan_io_set_value 设置io输出的值

                     aos_msleep 延时(由于io一般用于实现时序逻辑,故延时函数时必须的)

                     aos_queue_recv 获取消息队列值(用于函数间消息共享或实现跨任务控制)

       注意:使用io控制函数需要包含头文件 silan_gpio_source.h


3. 初始化任务: 在主函数中调用GPIO_task_init();即可。



三、 测试



  • 将gpio任务创建加入工程,经过漫长编译,下载
  • 复位,观察现象,(我使用逻辑分析仪来测试io时序)。
  • 外部图:


  • 时序图:


时序延时100ms电平翻转

  • 查看串口数据


串口传输正常,测试结束。

三、下次目标

下次实现高级使用:唤醒词条,以及功能实现。

文章转载自:平头哥芯片开放社区 作者:辰玖

更多回帖

发帖
×
20
完善资料,
赚取积分