HarmonyOS 驱动子系统开发

小石猛猛冲
发布于 2022-7-23 09:52
浏览
0收藏

@toc

1.OpenHarmony驱动子系统开发——操作GPIO

1.1 GPIO API介绍

wifiiot_gpio.h接口简介:
这个.h中包含声明GPIO接口函数,这些功能用于初始化GPIO。

接口名 功能描述
GpioInit 初始化GPIO
GpioDeinit 取消初始化GPIO
GpioSetDir 设置GPIO引脚方向
GpioGetDir 获取GPIO引脚方向
GpioSetOutputVal 设置GPIO引脚输出电平值
GpioGetOutputVal 获取GPIO引脚输出电平值

wifiiot_gpio_ex.h接口简介:

这个.h中包含声明扩展的GPIO接口函数,这些功能用于设置GPIO拉力和驱动器强度。

接口名 功能描述
IoSetPull 设置GPIO引脚上拉
IoGetPull 获取GPIO引脚上拉
IoSetFunc 设置GPIO引脚功能
IoGetFunc 获取GPIO引脚功能
IOSetDriveStrength 设置GPIO驱动能力
IOGetDriveStrength 获取GPIO驱动能力

1.2 查看LED对应的GPIO引脚

LED对应的GPIO引脚是GPIO2通过控制GPIO2输出的的电平信号来实现LED灯的闪烁。

  • 高电平时点亮LED灯。

  • 低电平时熄灭LED灯。

HarmonyOS 驱动子系统开发-鸿蒙开发者社区
HarmonyOS 驱动子系统开发-鸿蒙开发者社区

1.3 操作GPIO点亮LED

打开Visual Studio Code软件。点击文件,打开文件夹,点击映射文件—>home—>bearpi—>code—>打开,在“项目名\applications\BearPi\BearPi-HM_Nano\sample”文件下打开"B1_basic_led_blink" 工程的led_example.c文件,可在代码中查看实现LED以1S的频率闪烁代码

实操过程及扩展见:https://www.bilibili.com/video/BV1tv411b7SA?p=10&share_source=copy_web&vd_source=8f1cf1d7278a65d1271a6ccbd8891dc6 P17

static void LedTask(void)
{
    //初始化GPIO
    GpioInit();

    //设置GPIO_2的复用功能为普通GPIO
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_IO_FUNC_GPIO_2_GPIO);
    //设置GP1O_2为输出模式
    GpiosetDir(WIFI_IOT_GPIO_IDX_2,WIFI_IOT_GPIO_DIR_OUT);

    while (1)
    {
        //设置GPIO_2输出高电平点亮LED灯
        GpiosetoutputVal(WIFI_IOT_GPIO_IDX_2,1);
        
        //延时1s
        usleep( 1000000);
    
        //设置GPIo_2输出低电平熄灭LED灯T
        GpiosetoutputVal(WIFI_IOT_GPIO_IDX_2,0);
    
        //延时1s
        usleep( 1000000);
    }
}

2.OpenHarmony驱动子系统开发——GPIO中断

2.1 GPIO中断API介绍

wifiiot_gpio.h接口简介:

wifiliot_gpio.h中包含声明GPIO中断相关函数。

接口名 功能描述
GpioRegisterIsrFunc 设置GPIO引脚中断功能
GpioUnregisterIsrFunc 取消GPIO引脚中断功能
GpioSetIsrMask 屏蔽GPIO引脚中断功能
GpioSetIsrMode 设置GPIO引脚中断触发模式

2.2 查看按键对应的GPIO引脚

F1和F2按键对应的GPIO引脚是分别是GPIO11和GPIO12,通过检测GPIO的电平信号来判断按键的状态。

HarmonyOS 驱动子系统开发-鸿蒙开发者社区
HarmonyOS 驱动子系统开发-鸿蒙开发者社区

2.3 操作GPIO点亮LED

打开Visual Studio Code软件。点击文件,打开文件夹,点击映射文件—>home—>bearpi—>code—>打开,在“项目名\applications\BearPi\BearPi-HM_Nano\sample”文件下打开“B2_basic_button"工程的button_example.c文件,可在代码中查看实现按键控制LED灯亮灭的代码

实操过程及扩展见:https://www.bilibili.com/video/BV1tv411b7SA?p=10&share_source=copy_web&vd_source=8f1cf1d7278a65d1271a6ccbd8891dc6 P18

static void F1_Pressed(char *arg)
{
    (void)arg;
    Gpiosetoutputval(WIFI_IOT_IO_NAME_GPIO_2,1);
}
static void F2_Pressed(char *arg)
{
    (void)arg;
    Gpiosetoutputval(WIFI_IOT_IO_NAME_GPIO_2,0);
}
static void ButtonExampleEntry(void)
{
    GpioInit();
    //初始化LED灯
    IoSetFunc(wIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_IO_FUNC_GPIO_2_GPIO);
    GpiosetDir(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_GPIO_DIR_OUT);

    //初始化F1按键,设置为下降沿触发中断
    IosetFunc(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_IO_FUNC_GPIO_11_GPIO);
    GpiosetDir(WIFI_IOT_IO_NAME_GPI0_11,WIFI_IOT_GPIO_DIR_IN);
    IoSetPull(wIFI_IOT_IO_NAME_GPI0_11, WIFI_IOT_IO_PULL_UP);
    GpioRegisterIsrFunc(wIFI_IOT_IO_NAME_GPIO_11,wIFI_IOT_INT_TYPE_EDGE,wIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOw,F1_Pressed,NULL);
    //初始化F2按键,设置为下降沿触发中断
    IoSetFunc(WIFI_IOT_IO_NAME_GPI0_12,             WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
    GpiosetDir(WIFI_IOT_IO_NAME_GPI0_12,WIFI_IOT_GPIO_DIR_IN);
    IosetPull(wIFI_IOT_IO_NAME_GPI0_12,WIFI_IOT_IO_PULL_UP);
    GpioRegisterIsrFunc(WIFI_IOT_IO_NAME_GPIO_12, wIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_FALL_LEVEL_LOw,F2_Pressed,NULL);
}

3.OpenHarmony驱动子系统开发——PWM输出

3.1 PWM API介绍

wifiiot_pwm.h接口简介:

这个wifiiot_pwm.h中包含声明PWM接口函数。

接口名 功能描述
PwmInit 初始化PWM
PwmDeinit 取消初始化PWM
PwmStart
根据输入参数输出PWM
PwmStop 停止PWM输出

3.2 查看LED对应的GPIO引脚

LED对应的GPIO引脚是GPIO2通过控制GPIO2输出的的电平信号来实现LED灯的闪烁。

  • 高电平时点亮LED灯。

  • 低电平时熄灭LED灯。

HarmonyOS 驱动子系统开发-鸿蒙开发者社区

HarmonyOS 驱动子系统开发-鸿蒙开发者社区

3.3 输出PWM改变LED亮度

打开Visual Studio Code软件。点击文件,打开文件夹,点击映射文件—>home—>bearpi—>code—>打开,在“项目名\applications\BearPi\BearPi-HM_Nano\sample”文件下打开“B3_basic_pwm_led"工程的pwm_example.c文件,可在代码中查看实现输出不同占空比的PWM来改变LED的亮度代码

实操过程及扩展见:https://www.bilibili.com/video/BV1tv411b7SA?p=10&share_source=copy_web&vd_source=8f1cf1d7278a65d1271a6ccbd8891dc6 P19

static void PwMTask(void)
{
    unsigned int i;

    //初始化GPIO
    GpioInit();

    //设置GPIO_2引脚复用功能为PwM
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2,WIFI_IOT_IO_FUNC_GPIO_2_PlM2_OUT);

    //设置GPIO_2引脚为输出模式
    GpiosetDir(WIFI_IOT_GPIO_IDX_2,WIFI_IOT_GPIO_DIR_OUT);

    //初始化PWM2端口
PwmInit(WIFI_IOT_PWM_PORT_PWM2);
    while (1)
    {
        for (i = e; i < 4080e; i += 100)
        {
            //输出不同占空比的PwM波
            PwmStart(WIFI_IOT_PWM_PORT_PWM2, i, 40000) ;
            usleep( 10);
        }
        i = 0;
    }
}

4.OpenHarmony驱动子系统开发——ADC采样

4.1 ADC API介绍

wifiiot_adc.h接口简介:

这个wifiiot_adc.h中包含声明ADC接口函数。

接口名 功能描述
AdcRead 根据输入参数从指定的ADC通道读取一段采样数据

AdcRead (WiflotAdcChanelndex channel, unsigned short * data, WifilotAdcEquModelSel equModel WifiotAdcCurBais curBais unsigned short rstCnt )

接口名 功能描述
channel ADC通道
data 指示用于存放读取数据的地址的指针
equModel 表示平均算法的次数
curBais 表示模拟功率控制模式
rstCnt 指示从重置到转换开始的时间计数

4.2 查看ADC对应的GPIO引脚

本案例将使用板载用户按键F1来模拟GPIO口电压的变化。GPIO_11对应的是ADC Channel 5 ,所以需要编写软件去读取ADC Channel 5的电压。

HarmonyOS 驱动子系统开发-鸿蒙开发者社区

HarmonyOS 驱动子系统开发-鸿蒙开发者社区

4.3 ADC读取GPIO电压值

打开Visual Studio Code软件。点击文件,打开文件夹,点击映射文件—>home—>bearpi—>code—>打开,在“项目名\applications\BearPi\BearPi-HM_Nano\sample”文件下打开“B4_basic_adc”工程的adc_example.c文件,可在代码中查看实现读取ADC通道5的电压值的代码

实操过程及扩展见:https://www.bilibili.com/video/BV1tv411b7SA?p=10&share_source=copy_web&vd_source=8f1cf1d7278a65d1271a6ccbd8891dc6 P20

/*****获取电压值函数*****/
static float GetVoltage(void)
{
    unsigned int ret;
    unsigned short data;

    ret = AdcRead(WIFI_IOT_ADC_CHANNEL_5,&data,WIFI_IOT_ADC_EQu_MODEL_8,WIFI_IOT_ADC_CUR_BAIS_DEFAULT,0xff);
    if (ret != WIFI_IOT_succEss)
    {
        printf("ADC Read Fail\n");
    }
    return (float)data * 1.8 * 4 / 4096.0;
}

5.OpenHarmony驱动子系统开发——I2C总线

5.1 I2C API介绍

wifiiot_i2c.h接口简介:

wifiiot_i2c.h中包含声明I2C接口函数。

接口名 功能描述
I2cInit 初始化I2C
I2cDeinit 取消I2C初始化
I2cWrite 将数据写入到I2C设备
I2cRead 从I2C设备读取数据

wifiot_i2c_ex.h接口简介:

wifiiot_i2c_ex.h中包含声明扩展|2C接口函数。

接口名 功能描述
I2cWriteread 向I2C设备发送数据并接受数据响应
I2cSetBaudrate 设置I2C频率

5.2 查看NFC的12C对应的GPIO引脚

NFC芯片的I2C对应的GPIO引脚是分别是GPIO0和GPIO1,所以需要编写软件使用GPIO_0和GPIO_1产生I2C信号去控制NFC芯片。

HarmonyOS 驱动子系统开发-鸿蒙开发者社区
HarmonyOS 驱动子系统开发-鸿蒙开发者社区

5.3 I2C读写NFC芯片

打开Visual Studio Code软件。点击文件,打开文件夹,点击映射文件—>home—>bearpi—>code—>打开,在“项目名\applications\BearPi\BearPi-HM_Nano\sample”文件下打开"B5_basic_i2c_nfc"工程的i2c_example.c文件,可在代码中查看实现NCF读写的代码

实操过程及扩展见:https://www.bilibili.com/video/BV1tv411b7SA?p=10&share_source=copy_web&vd_source=8f1cf1d7278a65d1271a6ccbd8891dc6 P21

uint8_t ret;
GpioInit();
//GPIO_o复用为I2C1_SDA
IoSetFunc(wIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA);

//GPIO_1复用为12C1_SCL
IoSetFunc(wIFI_IOT_IO_NAME_GPIO_1, WIFI_IOT_IO_FUNC_GPIO_1_I2c1_SCL);

// baudrate: 40okbps
I2cInit(WIFI_IOT_I2C_IDx_1,400000);

I2csetBaudrate(wIFI_IOT_12C_IDx_1,400000) ;

printf( "I2C Test start\n");

ret = storeText(NDEFFirstPos,(uint8_t *)TEXT);
if (ret != 1)
{
    printf( "NFC Write Data Falied :%d ", ret);
}
ret = storeUrihttp(NDEFLastPos,(uint8_t *)WEB);
if (ret != 1)
{
    printf("NFC Write Data Falied :%d ", ret) ;
}
while (1)
{
    printf("=======================================\r\n");
    printf( ""***********I2C_NFC_example**********\r\n");
    printf("=======================================\r\n");
    printf("Please use the mobile phone with NFC function close to the     development board! \r\n");
    usleep( 1000000) ;
}

6.OpenHarmony驱动子系统开发——UART读写

6.1 UART API介绍

wifiiot_uart.h接口简介:

wifiiot_uart.h中包含声明UART接口函数。

接口名 功能描述
UartInit 初始化UART
UartDeinit 取消UART初始化
UartRead 从UART读取数据
UartWrite 将数据写入UART
UartSetFlowCtrl 设置UART流控制

6.2 查看UART1对应的GPIO引脚

UART1对应的GPIO引脚是分别是GPIO5和GPIO6,将使用GPIO5和GPIO6进行UART数据的收发。

HarmonyOS 驱动子系统开发-鸿蒙开发者社区
HarmonyOS 驱动子系统开发-鸿蒙开发者社区

6.3 UART读写数据

打开Visual Studio Code软件。点击文件,打开文件夹,点击映射文件—>home—>bearpi—>code—>打开,在“项目名\applications\BearPi\BearPi-HM_Nano\sample”文件下打开"B6_basic_uart"工程的uart_example.c文件,可在代码中查看实现UART读写数据。

实操过程及扩展见:https://www.bilibili.com/video/BV1tv411b7SA?p=10&share_source=copy_web&vd_source=8f1cf1d7278a65d1271a6ccbd8891dc6 P22

static void UART_Task(void)
{
    uint8_t uart_buff[UART_BUFF_SIZE] = {0};
    uint8_t *uart_buff_ptr = uart_buff;
    uint32_t ret;

    WifiIotUartAttribute uart_attr = {
        // baud_rate: 9600
        .baudRate = 9600,

        // data_bits : 8bits
        .dataBits = 8,
        .stopBits = 1,
        .parity = 0,
    };
    // Initialize uart driver
    ret = UartInit(WIFI_IOT_UART_IDX_1,&uart_attr,NULL);
    if (ret != WIFI_IOT_SUCCESS)
    {
        printf( "Failed to init uart! Err code = %d \n" , ret);
        return;
    }
    printf( "UART Test start\n");
    while (1)
    {

        printf( "=======================================\r\n" ) ;
        printf("*************UART_example**************\r\n" );
        printf( "=======================================\r\n");


        //通过串口1发送数据
        Uartwrite(WIFI_IOT_UART_IDX_1,(unsigned char *)data,strlen(data));

        //通过串口1接收数据
        UartRead(WIFI_IOT_UART_IDX_1,uart_buff_ptr,UART_BUFF_SIZE);


        printf( "Uart1 read data: %s" , uart_buff_ptr);
        usleep( 1000800) ;
    }
}

标签
已于2022-11-23 20:53:56修改
5
收藏
回复
举报
1条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

楼主总结的这么全不考虑加个原创吗

回复
2022-7-25 10:23:50
回复
    相关推荐