norains的专栏

只专注于WINCE开发

用户操作
[即时聊天] [发私信] [加为好友]
norainsID:norains
142907次访问,排名598,好友0人,关注者53人。
代码其实是一种乐趣
norains的文章
原创 189 篇
翻译 0 篇
转载 10 篇
评论 274 篇
norains的公告
联系方式请看置顶文章
最近评论
dfdf:讨厌MFC!我觉得MFC就是太乱了!看似无用的代码不要不行,MD微软啥都给我们做完了,原理性的东西我们却永远没法搞懂了!
ironox:有个地方 我觉得很别扭,不知道怎么办好

比如说 CReg reg(HKEY_CURRENT_USER,TEXT("ControlPanel\Volume"));
ControlPanel\Volume 有可能不存在呀,这个该怎么处理哦?对象虽然创建了,出错了也没提示
szterry:呵呵,果然工作狂技术狂,同感,一样的感觉……不过我才刚毕业一年……搞IT就是玩……
jinlking:这个botton的实现只是在主窗口画了一块区域,对于事件的处理还要放在主窗口的窗口处理函数之中,在对应的消息处理上调用CheckTap来判断是否是此“按钮”,问一下,这种方法与把按钮封装在子窗口中有什么区别,二者使用那个更好?
KUODY:博主真是好人
文章分类
收藏
    相册
    动漫
    文章图片
    程序交流
    xumercury的BLOG
    狗友们的博客
    清蒸石斑鱼
    美女如刀锋
    茁茁的BLOG
    魅力老姐的窝
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 Sigmatel37xx GPIO的使用收藏

    新一篇:  DeviceIoControl和结构体内嵌指针 | 旧一篇: 格式有点乱,对不起大家了

    //========================================================================
    //TITLE:
    //    Sigmatel37xx GPIO的使用
    //AUTHOR:
    //    norains
    //DATE:
    //    Thursday 21-August-2008
    //Environment:
    //    NONE
    //========================================================================
        在文章开篇之前,先小小抱怨一下。Sigmatel的硬件部分做得不错,这个是必须承认的;但WinCE的软件部分,却不能不让人抓狂。用一句

    黑话来说,就是见过烂的,没有见过这么烂的:条理杂乱无章,结构模糊不清,更不用说那些莫名其妙的BUG了。以GPIO为例子,其实在

    Sigmatel 37xx BSP包已经有驱动,但实际上只是一些代码而已,没有注册表,没有PB选项,换句话说,你根本无法通过简单的设置来使用GPIO

    驱动。
       
        如果想控制GPIO,那么唯一的办法就是直接对寄存器进行读写。
       
        首先我们必须要做的就是,包含头文件:regspinctrl.h。不过这个可得小心了,因为这文件有两个,一个位于:\SRC\INC\37xxRegs,另

    一个则是在\SRC\SOCFirmware\include\37xx\registers。并且这不同位置的文件的开头描述都是一样的,但实际上在宏定义方面区别还挺大,

    从而导致包含不同的regspinctrl.h,程序代码就有不同的写法。弱弱地感叹一下,不能不拜服sigmatel的方式。
       
        在这里为了简便起见,我们用的是\SRC\INC\37xxRegs\regspinctrl.h。
       
        首先,在使用之前,我们必须映射一下内存地址:
        static PVOID pv_HwRegPinCtrl;
       static PHYSICAL_ADDRESS PhysAddr;
        PhysAddr.QuadPart = _PA_REGS_PINCTRL_BASE;
        pv_HwRegPinCtrl = (PVOID) MmMapIoSpace(PhysAddr, 0x1000, FALSE);

        if ( pv_HwRegPinCtrl == NULL)
        {
           RETAILMSG(1, (TEXT("Failed to map device registers \r\n")));
           return FALSE;
        }
       
        如果提示找不到PHYSICAL_ADDRESS的声明,请先包含ceddk.h。在这里还有一点需要提醒一下的是,pv_HwRegPinCtrl变量只能用该名字,

    并且作用域是全局的,否则在接下来的宏使用中会编译无法通过。
       
        在对GPIO进行操作之前,我们先了解如下几个宏:
        REG_HW_PINCTRL_MUXSELx_SET : 设置pin的功能。
        BF_PINCTRL_MUXSELx_BANKx_PINxx :将相应的pin功能转化为写入寄存器的数值。
        REG_HW_PINCTRL_DOUTx_SET :输出high
        REG_HW_PINCTRL_DOUTx_CLR :输出low
        REG_HW_PINCTRL_DOEx_SET :输出使能
        REG_HW_PINCTRL_DOEx_CLR :输入使能
        REG_HW_PINCTRL_DINx_RD :如果PIN为输入,则该宏用来读取相应寄存器的数值。
       
        宏中的x代表数字,对应相应的PIN。
       
       
        现在以实际例子对pin做一次操作。
       
        如果我们在datasheet中看到某个PIN有如下描述:
        HW_PINCTRL_MUXSEL0 BANK0_PIN08
        GPMI_D08 Pin Function Selection.
       00 = GPMI_D8.
       01 = EMI_ADDR15.
       10 = Reserved.
       11 = GPIO.
       
      如果我们想令该PIN作为GPIO并输出high,那么代码如下:
      REG_HW_PINCTRL_MUXSEL0_SET(BF_PINCTRL_MUXSEL0_BANK0_PIN08(3)); 
      REG_HW_PINCTRL_DOUT0_CLR(1 << 8);  
      REG_HW_PINCTRL_DOE0_SET(1 << 8); 
      
      对应datasheet,我们就不难发现以上三个宏的x如何选择相应的数字,如图:
      
      
      若是想将该pin作为输入,也是比较简单,样例代码如下:
      REG_HW_PINCTRL_MUXSEL0_SET(BF_PINCTRL_MUXSEL0_BANK0_PIN08(3));
      REG_HW_PINCTRL_DOE0_CLR(1 << 8); //设置为输入  
      if((REG_HW_PINCTRL_DIN0_RD() & (1 << 8)) != 0)
      {
       //Input high
      }
      else
      {
       //Input low
      }
      
      代码宏中数字的选择,可参考之前图片的解释,在此就不再详表。

    发表于 @ 2008年08月21日 22:38:00|评论(loading...)|编辑|收藏

    新一篇:  DeviceIoControl和结构体内嵌指针 | 旧一篇: 格式有点乱,对不起大家了

    评论

    #zhli6 发表于2008-10-11 14:22:34  IP: 58.61.1.*
    如果我们想令该PIN作为GPIO并输出high,那么代码如下:
    REG_HW_PINCTRL_MUXSEL0_SET(BF_PINCTRL_MUXSEL0_BANK0_PIN08(3));
    REG_HW_PINCTRL_DOUT0_CLR(1 << 8);
    REG_HW_PINCTRL_DOE0_SET(1 << 8);

    ????????
    REG_HW_PINCTRL_DOUT0_CLR(1 << 8); -high

    应该是REG_HW_PINCTRL_DOUT0_SET(1 << 8);
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © norains