HarmonyOS 驱动子系统开发
@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灯。
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的电平信号来判断按键的状态。
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灯。
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的电压。
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芯片。
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数据的收发。
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) ;
}
}
楼主总结的这么全不考虑加个原创吗