主题 : 求助mini2440的GPIO问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 74128
精华: 0
发帖: 17
金钱: 85 两
威望: 17 点
贡献值: 0 点
综合积分: 34 分
注册时间: 2012-07-19
最后登录: 2012-09-12
楼主  发表于: 2012-07-30 15:49

 求助mini2440的GPIO问题

   我在用周立功的《ARM&Wince实验与实践-基于S3C2410》学习ARM,在其中的wince5.0高级实验第一节GPIO输出控制实验中,我把程序写好后录进ARM板后,程序运行时一直无法打开GPIO驱动,在网上查了后觉得应该是gpio驱动没有,但我做LED控制实验是成功的。我现在不知道该怎么办了,写驱动我也不会,求大神们帮忙!我把程序帖出来吧,程序最开始是不能编译成功的,缺少gpio.h,后来我在网上下了个就能编译成功的。但程序写入ARM后不能打开GPIO驱动。
级别: 新手上路
UID: 74128
精华: 0
发帖: 17
金钱: 85 两
威望: 17 点
贡献值: 0 点
综合积分: 34 分
注册时间: 2012-07-19
最后登录: 2012-09-12
1楼  发表于: 2012-07-30 15:51
// GPIOBeepDlg.cpp : implementation file
//

#include "stdafx.h"
#include "GPIOBeep.h"
#include "GPIOBeepDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGPIOBeepDlg dialog

CGPIOBeepDlg::CGPIOBeepDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CGPIOBeepDlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CGPIOBeepDlg)
        // NOTE: the ClassWizard will add member initialization here
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGPIOBeepDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CGPIOBeepDlg)
        // NOTE: the ClassWizard will add DDX and DDV calls here
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CGPIOBeepDlg, CDialog)
    //{{AFX_MSG_MAP(CGPIOBeepDlg)
    ON_BN_CLICKED(IDC_OPEN_PIO1, OnOpenPio1)
    ON_BN_CLICKED(IDC_CLOSE_PIO1, OnClosePio1)
    ON_BN_CLICKED(IDC_BEEP_ON, OnBeepOn)
    ON_BN_CLICKED(IDC_BEEP_OFF, OnBeepOff)
    ON_WM_DESTROY()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGPIOBeepDlg message handlers

BOOL CGPIOBeepDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
    
    CenterWindow(GetDesktopWindow());    // center to the hpc screen

    // TODO: Add extra initialization here
    
    return TRUE;  // return TRUE  unless you set the focus to a control
}

#include "gpio.h"
HANDLE hFile=INVALID_HANDLE_VALUE;
void CGPIOBeepDlg::OnOpenPio1()
    {
        BOOL ret;
        BYTE pinnum=10;

        hFile=CreateFile(TEXT("PIO:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
        if(hFile==INVALID_HANDLE_VALUE)
        {
            MessageBox(_T("打开GPIO驱动失败!"));
            return;
        }
        else
            MessageBox(_T("打开GPIO驱动成功!"));

        ret=::DeviceIoControl(hFile,IOCTL_GPH_SET_PIN_OUT,&pinnum,1,NULL,0,NULL,NULL);
        if(ret!=TRUE)
        {
            OnClosePio1();
            MessageBox(_T("设置GPH10引脚输出失败!"));
            return;
        }
        CButton*pOpenButton=(CButton*)GetDlgItem(IDC_OPEN_PIO1);
        CButton*pCloseButton=(CButton*)GetDlgItem(IDC_CLOSE_PIO1);
        pOpenButton->EnableWindow(FALSE);
        pCloseButton->EnableWindow(TRUE);
}

void CGPIOBeepDlg::OnClosePio1()
{
    // TODO: Add your control notification handler code here
    if(hFile!=INVALID_HANDLE_VALUE)
    {
        CloseHandle(hFile);
        hFile=INVALID_HANDLE_VALUE;
    }
    CButton*pOpenButton=(CButton*)GetDlgItem(IDC_OPEN_PIO1);
    CButton*pCloseButton=(CButton*)GetDlgItem(IDC_CLOSE_PIO1);
    pOpenButton->EnableWindow(TRUE);
    pCloseButton->EnableWindow(FALSE);
}

void CGPIOBeepDlg::OnBeepOn()
{
    // TODO: Add your control notification handler code here
    BOOL ret;
    BYTE pinnum=10;

    ret=::DeviceIoControl(hFile,IOCTL_GPH_CLR_PIN,&pinnum,1,NULL,0,NULL,NULL);
    if(ret!=TRUE)
        MessageBox(_T("设置GPH10低电平失败!"));
}

void CGPIOBeepDlg::OnBeepOff()
{
    // TODO: Add your control notification handler code here
    BOOL ret;
    BYTE pinnum=10;
    ret=::DeviceIoControl(hFile,IOCTL_GPH_SET_PIN,&pinnum,1,NULL,0,NULL,NULL);
    if(ret!=TRUE)
        MessageBox(_T("设置GPH10高电平失败!"));
}

void CGPIOBeepDlg::OnDestroy()
{
    CDialog::OnDestroy();
    
    // TODO: Add your message handler code here
    CDialog::OnDestroy();
    OnClosePio1();
}
这是程序
级别: 新手上路
UID: 73530
精华: 0
发帖: 44
金钱: 225 两
威望: 45 点
贡献值: 0 点
综合积分: 88 分
注册时间: 2012-07-10
最后登录: 2014-09-03
2楼  发表于: 2012-09-23 11:34
这个跨越真大
级别: 新手上路
UID: 102990
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
贡献值: 0 点
综合积分: 14 分
注册时间: 2014-04-15
最后登录: 2014-04-18
3楼  发表于: 2014-04-17 16:07

 回 1楼(酱菌子) 的帖子

您好,为什么我调用
hFile=CreateFile(TEXT("PIO:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
打开GPIO失败。是不是要装什么驱动,我用的是mini2451,和mini2440是一样的。打开Pwm1,ACD1,led都没问题,就是开个GPIO失败