ARM9自学笔记_GPIO设置

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)


#define GPGCON      (*(volatile unsigned long *)0x56000060)
#define GPGDAT      (*(volatile unsigned long *)0x56000064)


/*
 * LED1,LED2,LED4对应GPF4、GPF5、GPF6
 */
#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2))


#define GPF4_msk (3<<(4*2))
#define GPF5_msk (3<<(5*2))
#define GPF6_msk (3<<(6*2))


/*
 * S2,S3,S4对应GPF0、GPF2、GPG3
 */
#define GPF0_in     (0<<(0*2))
#define GPF2_in     (0<<(2*2))
#define GPG3_in     (0<<(3*2))


#define GPF0_msk    (3<<(0*2))
#define GPF2_msk    (3<<(2*2))
#define GPG3_msk    (3<<(3*2))


int main()
{
        unsigned long dwDat;
        // LED1,LED2,LED4对应的3根引脚设为输出
        GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
        GPFCON |= GPF4_out | GPF5_out | GPF6_out;
        
        // S2,S3对应的2根引脚设为输入
        GPFCON &= ~(GPF0_msk | GPF2_msk);
        GPFCON |= GPF0_in | GPF2_in;


        // S4对应的引脚设为输入
        GPGCON &= ~GPG3_msk;
        GPGCON |= GPG3_in;


        while(1){
            //若Kn为0(表示按下),则令LEDn为0(表示点亮)
            dwDat = GPFDAT;             // 读取GPF管脚电平状态
        
            if (dwDat & (1<<0))        // S2没有按下
                GPFDAT |= (1<<4);       // LED1熄灭
            else    
                GPFDAT &= ~(1<<4);      // LED1点亮
                
            if (dwDat & (1<<2))         // S3没有按下
                GPFDAT |= (1<<5);       // LED2熄灭
            else    
                GPFDAT &= ~(1<<5);      // LED2点亮
    
            dwDat = GPGDAT;             // 读取GPG管脚电平状态
            
            if (dwDat & (1<<3))         // S4没有按下
                GPFDAT |= (1<<6);       // LED3熄灭
            else    
                GPFDAT &= ~(1<<6);      // LED3点亮
    }


    return 0;
}

 

ARM9和STM32差不太多,最先做的就是寄存器的配置

1  首先通过宏定义

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT       (*(volatile unsigned long *)0x56000054)
#define GPGCON       (*(volatile unsigned long *)0x56000060)
#define GPGDAT       (*(volatile unsigned long *)0x56000064)

给相关的寄存器的地址命名,寄存器的地址通过芯片手册查询


       2 寄存器里面存放的值的设置

  #define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2))
#define GPF4_msk (3<<(4*2))
#define GPF5_msk (3<<(5*2))
#define GPF6_msk (3<<(6*2))
#define GPF0_in             (0<<(0*2))
#define GPF2_in             (0<<(2*2))
#define GPG3_in                 (0<<(3*2))
#define GPF0_msk             (3<<(0*2))
#define GPF2_msk             (3<<(2*2))
#define GPG3_msk            (3<<(3*2))

   这里面的out 和in表示将这个引脚设置为输入引脚或者输出引脚

                                msk是为了防止许多寄存器里面其他没有用到的位对寄存器的配置的影响,应该将他们先规制位0


        3 通过& | 将没有用到的位进行清零

     GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
         GPFCON |= GPF4_out | GPF5_out | GPF6_out;
        GPFCON &= ~(GPF0_msk | GPF2_msk);
        GPFCON |= GPF0_in | GPF2_in;
        GPGCON &= ~GPG3_msk;
        GPGCON |= GPG3_in;

  &的时候注意位的对应



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值