S3C2440硬件编程实例

发布时间:2024-06-11  

S3C2440硬件编程实例——GPIO(一)汇编程序:

  1. @******************************************************************************  

  2.   

  3. @ 功能:LED点灯程序,点亮LED1-4  

  4.   

  5. @******************************************************************************         

  6.   

  7.               

  8.   

  9. .text  

  10.   

  11. .global _start  

  12.   

  13. _start:       

  14.   

  15.             LDR     R0,=0x56000010      @ R0设为GPBCON寄存器。此寄存器  

  16.   

  17.                                         @ 用于选择端口B各引脚的功能:  

  18.   

  19.                                         @ 是输出、是输入、还是其他  

  20.   

  21.                                         @ GPB5-8对应LED1-4  

  22.   

  23.             MOV     R1,#0x00015400          

  24.   

  25.             STR     R1,[R0]             @ 设置GPB5-8为输出口,   

  26.   

  27.                                         @位[11:10]=0b01,[13:12]=0b01,[115:14]=0b01,[17:16]=0b01  

  28.   

  29.             LDR     R0,=0x56000014      @ R0设为GPBDAT寄存器。此寄存器  

  30.   

  31.                                         @ 用于读/写端口B各引脚的数据  

  32.   

  33.             MOV     R1,#0x00000000      @ 此值改为0x000000F0,  

  34.   

  35.                                         @ 可让LED1熄灭  

  36.   

  37.             STR     R1,[R0]             @ GPB5-8输出0,LED1-4点亮  

  38.   

  39. MAIN_LOOP:  

  40.   

  41.             B       MAIN_LOOP   

 


使用如下命令进行编译和连接:

arm-linux-gcc -g -c -o led_on.o led_on.S
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf


@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@******************************************************************************      

.text
.global _start
_start:
            ldr     r0, =0x56000010     @ WATCHDOG寄存器地址
            mov     r1, #0x0                    
            str     r1, [r0]            @ 写入0,禁止WATCHDOG,否则CPU会不断重启
           
            ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
                                        @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
            bl      main                @ 调用C程序中的main函数
halt_loop:
            b       halt_loop


 

 

#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)

int main()
{
    GPBCON = 0x00015400;    // 设置GPB5-8为输出口
                             //[11:10]=0b01,[13:12]=0b01,
                             //[15:14]=0b01,[17:16]=0b01,
    GPBDAT = 0x00000000;    // GPB5-8输出0,LED1点亮

    return 0;
}

使用如下命令进行编译和连接

arm-linux-gcc -g -c -o crt0.o crt0.S
arm-linux-gcc -g -c -nostdlib -o led_on_c.o led_on_c.c
arm-linux-ld -Ttext 0x0000000 -g  crt0.o led_on_c.o -o led_on_c_elf
arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin


  1. #define    GPB5_out    (1<<(5*2))    移位操作,左移n位就在[n]

  2. #define    GPBCON        (*(volatile unsigned long *)0x56000010)      对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的。如果系统结构支持独立的IO地址空间,并且是端口映射,就必须使用汇编语言完成实际对设备的控制,因为C语言并没有提供真正的“端口”的概念。如果是内存映射,那就方便的多了。ARM的外设就是采用内存映射。ARM嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,那么按照C语言的语法规则,这个表示地址的量应该是指针类型。
        第一步是要把它强制转换为指针类型
        比如,(volatile unsigned long *)0x56000010。volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改变——意想不到。
        第二步,对指针变量解引用,就能操作指针所指向的地址的内容了
        比如,*(volatile unsigned long *)0x56000010
        第三步,把#define宏中的参数用括号括起来,这是一个很好的习惯,
        所以#define    GPBCON        (*(volatile unsigned long *)0x56000010)

  3. GSTATUS1寄存器为通用状态寄存器,用来描述芯片ID(标识),可以通过读取GSTATUS1寄存器的值来确定处理器的类型:
    0x32410000=S3C2410
    0x32410002=S3C2410a
    0x32440000=S3C2440
    0x32440002=S3C2440a


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>