首先,下面是控制输入输出的三条指令:
GPIO_PAD_EN_SET(GPIO_GROUP(BSPLCD_SHP_VCC_GPIO_GROUP),GPIO_MASK(BSPLCD_SHP_VCC_GPIO_INDEX));——先设置在GPIO口
GPIO_OUTPUT_ENABLE(GPIO,GPIO_GROUP(BSPLCD_SHP_VCC_GPIO_GROUP),GPIO_INDEX(BSPLCD_SHP_VCC_GPIO_INDEX));—识能——控制输出还是输入,这里是输出
PIO_OUTPUT_ONE(GPIO,GPIO_GROUP(BSPLCD_SHP_VCC_GPIO_GROUP), GPIO_INDEX(BSPLCD_SHP_VCC_GPIO_INDEX));——高输出,低不输出!!
(A4 板)GPIO0_7 是控制 LCD 屏幕亮度的,当输出高时,亮度为最亮,当输出低时,屏幕暗——同理,可通过调整它的输出高低来控制屏幕亮度和 LED 灯亮度,当然可在中断服务程序中控制。
实践:
1)新建与 GPIO 驱动相对应的 MFC 窗口应用程序,在它的 init 函数中添加代码:
H_hUSBOtg= CreateFile(TEXT("GIO1:"),//M11 的版本出现问题
GENERIC_READ| GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if (H_hUSBOtg == INVALID_HANDLE_VALUE)
{
::MessageBox(NULL,TEXT("CreateFile CAM1: failed.\r\n"),NULL,0);
return 1;
}
DWORDgroup=0;
DWORDindex=1;
DWORDoutput=0;
DWORDoutputP=0;
DWORDinputPara=(group<<8)|(index<<1)|(output);
if(!DeviceIoControl( H_hUSBOtg,
IOCTL_UIM_SERVICE_SET_GPIO,
&inputPara,//(LPVOID)&uuidSet,
sizeof(DWORD),
NULL,
0,
NULL,
NULL)== FALSE)
{
RETAILMSG(1,(TEXT(" GPIO Setting OK!\r\n")));
// return 0;
}
for(group=0;group<5;group++){
for(index=0;index<32;index++)
{
inputPara=(group<<8)|(index<<1)|(output);
if(!DeviceIoControl( H_hUSBOtg,
IOCTL_UIM_SERVICE_GET_GPIO,
&inputPara,//(LPVOID)&uuidSet,
sizeof(DWORD),
&outputP,
sizeof(DWORD),
NULL,
NULL)== FALSE)
{
RETAILMSG(1,(TEXT(" %d,%d Setting OK!%x\r\n"),group,index,outputP));
// return 0;
}
}
}
CloseHandle(H_hUSBOtg);
当然,为了能够运行,要为其中的两个标志性常数定义,定义如下:
#defineIOCTL_UIM_SERVICE_SET_GPIOCTL_CODE(FILE_DEVICE_UNKNOWN, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
#defineIOCTL_UIM_SERVICE_GET_GPIOCTL_CODE(FILE_DEVICE_UNKNOWN, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
为了能够应用上面的define,我们需要添加头文件——#include "winioctl.h" 。
这样对于应用程序的设置就完成了。
2)GPIO 驱动那边的设置如下:
首先,为了与应用程序那边联系起来,需要对那两个常数进行define:
#include "winioctl.h"
#defineIOCTL_UIM_SERVICE_SET_GPIOCTL_CODE(FILE_DEVICE_UNKNOWN, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
#defineIOCTL_UIM_SERVICE_GET_GPIOCTL_CODE(FILE_DEVICE_UNKNOWN, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
然后,在函数GIO_IOControl中进行编辑。
BOOLGIO_IOControl(DWORD p1, DWORD p2, PBYTE pInBuf, DWORD InBufLen, PBYTEpOutBuf, DWORD OutBufLen, PDWORD p7)
{
DWORDGroup;DWORD Index;
switch (p2)
{
case IOCTL_UIM_SERVICE_SET_GPIO:
if ( NULL != pInBuf && sizeof(DWORD) == InBufLen ){
DWORDvalue = (*(DWORD *)pInBuf);
value&= 0xfff;
Group= value >> 8;
Index= (value & 0xfe) >> 1;
if ( Group <= 4 && Index <= 31 ){
GPIO_PAD_EN_SET(Group,GPIO_MASK(Index) );
if ( value & 1 ){
PIO_OUTPUT_ONE(GPIO, GPIO_GROUP(Group), GPIO_INDEX(Index) );
RETAILMSG(1,(TEXT("-------------------------------------------------high!\r\n")));
}else{
PIO_OUTPUT_ZERO(GPIO, GPIO_GROUP(Group), GPIO_INDEX(Index) );
RETAILMSG(1,(TEXT("--------------------------------------------------low!\r\n")));
}
PIO_OUTPUT_ENABLE(GPIO, GPIO_GROUP(Group), GPIO_INDEX(Index) );
}
}
break;
case IOCTL_UIM_SERVICE_GET_GPIO:
if (NULL != pInBuf && sizeof(DWORD) == InBufLen && NULL != pOutBuf && sizeof(DWORD) == OutBufLen ){
DWORDvalue = (*(DWORD *)pInBuf);
value&= 0xfff;
Group= value >> 8;
Index= (value & 0xfe) >> 1;
if ( Group <= 4 && Index <= 31 ){
RETAILMSG(1,(TEXT("--------------IOCTL_UIM_SERVICE_GET_GPIO!\r\n")));
GPIO_PAD_EN_SET(Group, GPIO_MASK(Index) );
PIO_OUTPUT_DISABLE(GPIO, GPIO_GROUP(Group), GPIO_INDEX(Index) );
*((DWORD*)pOutBuf) = PIO_READ_INPUT( GPIO, GPIO_GROUP(Group), GPIO_INDEX(Index) );
}
}
break;
default:
{
DWORDdwRet = 1;
return dwRet;
}
}
return (TRUE);
}
分享到:
相关推荐
超经典的STM32学习笔记——第一章GPIO口.docx
12-1-1-通用输入输出口 GPIO-相关例程演示 12-1-2-通用输入输出口 GPIO-管脚复用配置 12-1-3-通用输入输出口 GPIO-输入输出模式
本例程演示如何操作GPIO输入和输出。通过检测USER1、USER2按键的状态,点亮不同的LED,同时输出键值到串口1。
GPIO输入输出GPIO输入输出GPIO输入输出GPIO输入输出GPIO输入输出GPIO输入输出GPIO输入输出GPIO输入输出GPIO输入输出GPIO输入输出GPIO输入输出
STM32Cube HAL库——GPIO输入输出的介绍及应用(按键控制灯的闪烁)配套学习代码 与博客配套
STM32学习记录——2.GPIO输入—按键检测 使能 GPIO端口时钟; 初始化 GPIO目标引脚为输入模式(引脚默认电平受按键电路影响,浮空/上拉/下拉均没有区别); 编写简单测试程序,检测按键的状态,实现按键控制 LED灯...
12-1-4-通用输入输出口 GPIO-中断 12-1-5-通用输入输出口 GPIO-EDMA3 12-1-6-通用输入输出口 GPIO-单步调试及测量代码执行时间
RT-AC54U-GPIO-1-PSG1218-64M_3.4.3.9-099路由器固件,刷机更新参考http://www.right.com.cn/forum/thread-161324-1-1.html
RT-N14U-GPIO-1-YKL1-128M_3.4.3.9-099.trx 路由器固件,padavan固件,支持优酷路由器L1
GPIO输出输入
华硕改版RT-N14U-GPIO-1-youku1-128M_3.4.3.9-099
MT7620华硕RT-N14U-GPIO-1-youku1-128M_3.4.3.9-099
树莓派学习笔记——wiringPi GPIO使用详解.docx GPIO使用详解
ZigBee课程实验CC2530--GPIO输出控制实验--LED闪烁——流水灯、内含视频教学、教学过程的pdf。十分详细!还有IAR工程代码。
斐讯K2路由器使用路由器刷breed Web控制台助手刷机后,可以轻松刷入这款功能强大的华硕固件RT-AC54U-GPIO-1-PSG1208-64M_3.4.3.9-099.trx这个华硕固件功能非常丰富:网络地图,显示当前互联网、WIFI、LAN信息状态。...
斐讯K1 改自华硕固件 RT-AC54U-GPIO-1-PSG1208-64M_3.4.3.9
GPIO输入——按键检测
EasyARM2131开发板源码之一----------- 3.GPIO输出实验-流水灯实验
H大2021.6.19日版RT-N14U-GPIO-1-youku1-128M_3.4.3.9-099.trx