ARM学习之GPIO实现流水灯

今天在学习MMU时的时候,写了一个流水灯程序。虽然很简单,但是不怕大家笑话,由于学C语言的时候没学位运算操作,再加上硬件实验做的少,所以实现这个也费了不少力气呢。

/*
 * leds.c: 循环点亮4个LED
 * 属于第二部分程序,此时MMU已开启,使用虚拟地址
 */ 

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

#define GPF4_out    (1<<(4*2))
#define GPF5_out    (1<<(5*2))
#define GPF6_out    (1<<(6*2))


static inline void wait(volatile unsigned long dly)
{
    int i;
    for(; dly > 0; dly--)
        for(i = 0;i<100;++i)
            ;
}

int main(void)
{
    unsigned long i = 4;

    GPFCON = GPF4_out|GPF5_out|GPF6_out;        // 将LED1,2,4对应的GPF4/5/6三个引脚设为输出

    while(1)
    {

        wait(30000);
        GPFDAT |= 0x70;      //每次循环关闭4,5,6三个灯
        GPFDAT &= ~(1<<i);    //0位每次循环4,5,6位

        if(++i == 7)
            i = 4;
    }

    return 0;
}
代码分析:在实现流水灯程序时,主要是配置GPF数据寄存器和GPF控制寄存器。在向GPFDAT中写数的时候,就本人认为,应该保证不影响到其他的位(这里是除了4,5,6的其他的位,因为你不知道其他的位有没有用于其他的用途,在这里虽然没影响。)
 对于寄存器的操作,对寄存器特定位进行置 1 或者清 0 或者取反, 关键点在于要事先构建一个特别的数, 这个数和原来的值进行位与、 位或、 位异或等操作。
    (1)、寄存器特定位清零用&。
    (2)、寄存器特定位置 1 用|
    (3)、寄存器特定位取反用~
  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值