梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发

鹴绛_Amon
发布于 2022-8-10 01:01
浏览
0收藏

第四章 驱动子系统开发

一、GPIO

1. GPIO API介绍

wifiiot_gpio.h接口简介:

这个.h中包含声明GPIO接口函数,这些功能用于初始化GPIO。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

wifiiot_gpio_ex.h接口简介:

这个.h中包含声明扩展的GPIO接口函数,这些功能用于设置GPIO拉力和驱动器强度。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

2. 查看LED对应的GPIO引脚

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

  • 高电平时点亮LED灯。
  • 低电平时熄灭LED灯。
    梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区
    梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

3. 操作GPIO点亮LED

打开“B1_basic_led_blink”工程的led_example.c文件,可在代码中查看实现LED以 1S 的频率闪烁代码
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

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);
	}
}

4. 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);
	}
}

二、GPIO中断

1. GPIO中断API介绍

wifiiot_gpio.h接口简介:

wifiiot_gpio.h中包含声明GPIO中断相关函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

2. 查看按键对应的GPIO引脚

F1和F2按键对应的GPIO引脚是分别是GPIO11和GPIO12,通过检测GPIO的电平信号来判断按键的状态。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

3. GPIO中断读取按键状态

打开“B2_basic_button”工程的button_example.c文件,可在代码中查看实现按键控制LED灯亮灭的代码
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

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);
}

4. 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);
}

三、PWM

1. PWM API介绍

wifiiot_pwm.h接口简介:

这个wifiiot_pwm.h中包含声明PWM接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

2. 查看LED对应的GPIO引脚

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

  • 高电平时点亮LED灯。
  • 低电平时熄灭LED灯。
    梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区
    梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

3. 输出PWM改变LED亮度

打开“B3_basic_pwm_led”工程的pwm_example.c文件,可在代码中查看实现输出不同占空比的PWM来改变LED 的亮度代码
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

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;
	}
}

4. 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);
		}
	}
}

四、ADC

1. ADC API介绍

wifiiot_adc.h接口简介:

这个wifiiot_adc.h中包含声明ADC接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区
AdcRead (WifiIotAdcChannelIndex channel, unsigned short * data, WifiIotAdcEquModelSel equModel, WifiIotAdcCurBais curBais, unsigned short rstCnt )
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

2. 查看ADC对应的GPIO引脚

本案例将使用板载用户按键F1来模拟GPIO口电压的变化。GPIO_11对应的是 ADC Channel 5 ,所以需要编写软件去读取ADC Channel 5的电压。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

3. ADC读取GPIO的电压值

打开“B4_basic_adc”工程的adc_example.c文件,可在代码中查看实现读取ADC通道5的电压值的代码
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

/***** 获取电压值函数 *****/
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;
}

五、12C

1. I2C API介绍

wifiiot_i2c.h接口简介:

wifiiot_i2c.h中包含声明I2C接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

wifiiot_i2c_ex.h接口简介:

wifiiot_i2c_ex.h中包含声明扩展I2C接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

2. 查看NFC的I2C对应的GPIO引脚

NFC芯片的I2C对应的GPIO引脚是分别是GPIO0和GPIO1,所以需要编写软件使用GPIO_0和GPIO_1产生I2C信号去控制NFC芯片。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

3. I2C读写NFC芯片

打开“B5_basic_i2c_nfc”工程的i2c_example.c文件,可在代码中查看实现NCF读写的代码
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

uint8_t ret;
GpioInit();
//GPIO_0复用为I2C1_SDA
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA);
//GPIO_1复用为I2C1_SCL
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL);
//baudrate: 400kbps
I2cInit(WIFI_IOT_I2C_IDX_1, 400000);
I2cSetBaudrate(WIFI_IOT_I2C_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);
}

六、UART

1. UART API介绍

wifiiot_uart.h接口简介:

wifiiot_uart.h中包含声明UART接口函数。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

2. 查看UART1对应的GPIO引脚

UART1对应的GPIO引脚是分别是GPIO5和GPIO6,将使用GPIO5和GPIO6进行UART数据的收发。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

3. UART读写数据

打开“B6_basic_uart”工程的uart_example.c文件,可在代码中查看实现UART读写数据。
梅科尔工作室-14天鸿蒙设备开发实战笔记-第四章 驱动子系统开发-鸿蒙开发者社区

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(1000000);
	}
}

已于2022-8-10 01:01:46修改
收藏
回复
举报
回复
    相关推荐