对于不同底层驱动的dac操作实现,统一封装成本文所述hal dac接口。 hal相关头文件位于目录:include/aos/hal。hal相关实现位于具体的mcu目录下,如:platform/mcu/stm32f1xx/hal/。

API列表

hal_dac_init 初始化指定DAC
hal_dac_start 开始DAC输出
hal_dac_stop 停止DAC输出
hal_dac_set_value 设置DAC输出值
hal_dac_get_value 获取当前DAC输出值
hal_dac_finalize 关闭指定DAC

API详情

请参考include/aos/hal/dac.h

相关结数据结构

dac_dev_t

typedef struct {
    uint8_t port;   /* dac port */
    void   *priv;   /* priv data */
} dac_dev_t;

hal_dac_init

初始化指定DAC

函数原型

int32_t hal_dac_init(dac_dev_t *dac);

参数

dac_dev_t *dac 入参 DAC设备描述 用户自定义一个dac_dev_t结构体

返回值

返回成功或失败, 返回0表示DAC初始化成功,非0表示失败

调用示例

#define DAC1_PORT_NUM 1
/* define dev */
dac_dev_t dac1;
/* dac port set */
dac1.port = DAC1_PORT_NUM;
ret = hal_dac_init(&dac1);

hal_dac_start

开始DAC输出

函数原型

int32_t hal_dac_start(dac_dev_t *dac, uint32_t channel);

参数

dac_dev_t *dac 入参 DAC设备描述 使用hal_dac_init传入参数
uint32_t channel 入参 输出通道号 0

返回值

返回成功或失败, 返回0表示DAC开始输出成功,非0表示失败

调用示例

ret = hal_dac_start(&dac1, 0);

hal_dac_stop

停止DAC输出

函数原型

int32_t hal_dac_stop(dac_dev_t *dac, uint32_t channel);

参数

dac_dev_t *dac 入参 DAC设备描述 使用hal_dac_init传入参数
uint32_t channel 入参 输出通道号 0

返回值

返回成功或失败, 返回0表示DAC停止成功,非0表示失败

调用示例

ret = hal_dac_stop(&dac1, 0);

hal_dac_set_value

设置DAC输出值

函数原型

int32_t hal_dac_set_value(dac_dev_t *dac, uint32_t channel, uint32_t data);

参数

dac_dev_t *dac 入参 DAC设备描述 使用hal_dac_init传入参数
uint32_t channel 入参 输出通道号 0
uint32_t data 入参 输出值 10

返回值

返回成功或失败, 返回0表示DAC输出值设定成功,非0表示失败

调用示例

ret = hal_dac_set_value(&dac1, 0, 10);

hal_dac_get_value

获取当前DAC输出值

函数原型

int32_t hal_dac_get_value(dac_dev_t *dac, uint32_t channel);

参数

dac_dev_t *dac 入参 DAC设备描述 使用hal_dac_init传入参数
uint32_t channel 入参 输出通道号 0

返回值

返回DAC输出值,获取失败返回负数。

调用示例

int value;
value = hal_dac_get_value(&dac1, 0);

hal_dac_finalize

关闭指定DAC

函数原型

int32_t hal_dac_finalize(dac_dev_t *dac);

参数

adc_dev_t *adc 入参 ADC设备描述 使用hal_adc_init时传入adc_dev_t结构体

返回值

返回成功或失败, 返回0表示DAC关闭成功,非0表示失败

调用示例

ret = hal_dac_finalize(&dac1);

使用

添加该组件

在相应的platform/mcu的mk内,添加对应hal文件的编译包含。

包含头文件

#include "aos/hal/dac.h"

使用示例

#include <aos/hal/dac.h>

#define DAC1_PORT_NUM 1
#define DAC1_CHANNEL_NUM 1

/* define dev */
dac_dev_t dac1;

int application_start(int argc, char *argv[])
{
    int ret   = -1;
    int value = 0;
    static int count = 0;

    /* dac port set */
    dac1.port = DAC1_PORT_NUM;

    /* init dac1 with the given settings */
    ret = hal_dac_init(&dac1);
    if (ret != 0) {
        printf("dac1 init error !\n");
    }

    value = 10;

    ret = hal_dac_set_value(&dac1, DAC1_CHANNEL_NUM, value);
    if (ret != 0) {
        printf("dac1 set value error !\n");
    }

    /* start dac output */
    ret = hal_dac_start(&dac1, DAC1_CHANNEL_NUM);
    if (ret != 0) {
        printf("dac1 start error !\n");
    }

    while(1) {
        if (count == 10) {
            /* finalize dac1 */
            hal_dac_finalize(&dac1);
        }

        /* sleep 500ms */
        aos_msleep(500);

        count++;
    };
}

注:port为逻辑端口号,其与物理端口号的对应关系见具体的对接实现

移植说明

新建hal_dac_xxmcu.c和hal_dac_xxmcu.h的文件,并将这两个文件放到platform/mcu/xxmcu/hal目录下。在hal_dac_xxmcu.c中实现所需要的hal函数,hal_dac_xxmcu.h中放置相关宏定义。 参考platform/mcu/stm32l4xx/src/STM32L496G-Discovery/hal/hal_dac_stm32l4.c