梅科尔工作室-14.6

燃新梨。
发布于 2022-7-25 12:04
浏览
0收藏

HarmonyOS驱动子系统开发—操作GPIO

GPIO的API

梅科尔工作室-14.6-鸿蒙开发者社区
梅科尔工作室-14.6-鸿蒙开发者社区

查看LED对应的GPIO引脚

梅科尔工作室-14.6-鸿蒙开发者社区

操作GPIO点亮LED

梅科尔工作室-14.6-鸿蒙开发者社区

static void LedTask(void)
{
//初始化GPIO
GpioInit();
//设置GPIO_2的复用功能为普通GPIO
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_IO_FUNC_GPIO_2_GPIO);
//设置GPIO_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灯
GpioSetOutputVal(WIFI_IOT_GPIO_IDX_2, 0);
//延时1s
usleep(1000000);
}
}

GPIO扩展实验

通过程序读取GPIO引脚方向、输出电平值等,并通过串口打印显示出来。

static void LedTask(void)
{
//初始化GPIO
GpioInit();
//设置GPIO_2的复用功能为普通GPIO
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_2, WIFI_IOT_IO_FUNC_GPIO_2_GPIO);
//设置GPIO_2为输出模式
GpioSetDir(WIFI_IOT_GPIO_IDX_2, WIFI_IOT_GPIO_DIR_OUT);
WifiIotGpioDir val = {0};
GpioGetDir(WIFI_IOT_GPIO_IDX_2,&val);
printf("GPIO_2 Dir is %d\r\n",val);
WifiIotGpioValue OutputVal = {0};
while (1)
{
//设置GPIO_2输出高电平点亮LED灯
GpioSetOutputVal(WIFI_IOT_GPIO_IDX_2, 1);
GpioGetOutputVal(WIFI_IOT_GPIO_IDX_2,&OutputVal);
printf("GPIO_2 OutputVal is %d\r\n",OutputVal);
//延时1s
usleep(1000000);
//设置GPIO_2输出低电平熄灭LED灯
GpioSetOutputVal(WIFI_IOT_GPIO_IDX_2, 0);
GpioGetOutputVal(WIFI_IOT_GPIO_IDX_2,&OutputVal);
printf("GPIO_2 OutputVal is %d\r\n",OutputVal);
//延时1s 
usleep(1000000);
}
}

HarmonyOS驱动子系统开发—GPIO中断

GPIO 中断API介绍

梅科尔工作室-14.6-鸿蒙开发者社区

查看按键对应的GPIO引脚

梅科尔工作室-14.6-鸿蒙开发者社区

操作GPIO点亮LED

梅科尔工作室-14.6-鸿蒙开发者社区

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_GPIO_11, WIFI_IOT_GPIO_DIR_IN);
IoSetPull(WIFI_IOT_IO_NAME_GPIO_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_GPIO_12, WIFI_IOT_IO_FUNC_GPIO_12_GPIO);
GpioSetDir(WIFI_IOT_IO_NAME_GPIO_12, WIFI_IOT_GPIO_DIR_IN);
IoSetPull(WIFI_IOT_IO_NAME_GPIO_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);
}

GPIO扩展实验

改变中断触发模式,观察现象。

static void F1_Pressed(char *arg)
{
(void)arg;
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2, 1);
printf("This is F1_Pressed\r\n");
GpioSetIsrMode(WIFI_IOT_IO_NAME_GPIO_11,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH);
}
static void F2_Pressed(char *arg)
{
(void)arg;
GpioSetOutputVal(WIFI_IOT_IO_NAME_GPIO_2, 0);
printf("This is F2_Pressed\r\n");
GpioSetIsrMask(WIFI_IOT_IO_NAME_GPIO_12,1);
}

HarmonyOS驱动子系统开发—PWM输出

PWM API介绍

梅科尔工作室-14.6-鸿蒙开发者社区

查看LED对应的GPIO引脚

梅科尔工作室-14.6-鸿蒙开发者社区

输出PWM改变LED亮度

梅科尔工作室-14.6-鸿蒙开发者社区

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_PWM2_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 = 0; i < 40000; i += 100)
{
//输出不同占空比的PWM波
PwmStart(WIFI_IOT_PWM_PORT_PWM2, i, 40000);
usleep(10);
}
i = 0;
}
}

PWM扩展实验

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_PWM2_OUT);
//设置GPIO_2引脚为输出模式
GpioSetDir(WIFI_IOT_GPIO_IDX_2, WIFI_IOT_GPIO_DIR_OUT);
//初始化PWM2端口
PwmInit(WIFI_IOT_PWM_PORT_PWM2);
uint8_t j = 0;
while (1)
{
for (i = 0; i < 40000; i += 100)
{
//输出不同占空比的PWM波
PwmStart(WIFI_IOT_PWM_PORT_PWM2, i, 40000);
//PwmStop(WIFI_IOT_PWM_PORT_PWM2);
usleep(10);
}
i = 0;
j++;
if(j == 5)
{
PwmDeinit(WIFI_IOT_PWM_PORT_PWM2);
}
}
}

收藏
回复
举报
回复