精华内容
下载资源
问答
  • ARM详解 ARM入门必备

    2009-12-09 22:11:05
    似乎搞ARM开发入门都是用这本书。 上网搜了很久,勉强下载下来了 1分,算是搜索小费啦 然后我还转转成了PDF更合适大家看啦!嘿嘿 介绍如下: 目录 第1 章 ARM 微处理器概述 5 1.1 ARM-Advanced RISC Machines 5 1.2...
  • ARM 嵌入式系统C 语言编程 编程入门教程,来看。
  • ARM入门资料

    2012-06-12 19:36:50
    STR710(ARM7 内核)的C 语言应用程序。手册的前半部分介绍IAR Systems 公司的ARM 开发环境 EWARM 的使用方法,后半部分介绍如何利用ST 公司提供的STR710 软件库和例子编写自己的应用程序。 用户只需按照本手册介绍...
  • ARM初学者入门手册.pdf

    2009-02-15 21:40:22
    本手册以IAR 公司的EWARM 开发环境和ST 公司的STR710-EVAL 评估板为基础,介绍如何编写 STR710(ARM7 内核)的C 语言应用程序。
  •  一般的嵌入式系统在主程序执行之前都需要执行一些初始化的过程以创造嵌入式程序运行的环境,尤其是一些高级的嵌入式系统,由于核心芯片使用内存映射、内存保护等机制以及编程使用高级语言 C,C++ 甚至 JAVA 语言,...
  • arm入门

    千次阅读 2007-01-16 10:13:00
    1 ARM 的启动 一般的嵌入式系统在主程序执行之前都需要执行一些初始化的过程以创造嵌入式程序运行的环境,尤其是一些高级的嵌入式系统,由于核心芯片使用内存映射、内存保护等机制以及编程使用高级语言 C,C++ 甚至 ...
    1 ARM 的启动 
      
      一般的嵌入式系统在主程序执行之前都需要执行一些初始化的过程以创造嵌入式程序运行的环境,尤其是一些高级的嵌入式系统,由于核心芯片使用内存映射、内存保护等机制以及编程使用高级语言 C,C++ 甚至 JAVA 语言,都需要先创建一个适合程序运行的硬件环境,然后初始化或者配置或者剪裁 run-time library, 这些工作都必须在主程序运行前完成,所以一个 startup 程序或者程序组对于一个嵌入式系统来说是非常重要的。要编写 startup 程序,需要对编译器、链接器和汇编器的细节有一定的了解,同时对 ARM 芯片硬件本身的地址分配以及 memory mapping 机制也需要有一些了解。

       2 ARM 程序的工作过程



       首先由各种 source file 经过编译产生 object 文件,然后 object 文件经过链接生成 Image 文件,然后通过 ICE 的方法,根据描述文件的指定下载到目标板上的固态存储器指定地址当中,比如 flash , EEPROM, ROM 等等。在程序执行之前,根据某些描述文件,将需要读写数据的部分读出放入动态存储器比如 RAM 当中,然后程序从 ROM 开始执行。或者有时为了提高程序的运行速度,也可以将所有的程序 ( 有一些 root 的部分除外,以后会提及 ) 通过一个描述文件放入指定的 RAM 当中,然后程序从 RAM 开始执行,但是这样会耗费大量的动态存储器,所以大部分程序会取折中的方法,将需要快速运行的部分和要读写的部分放入 RAM 中 ( 一般读固态存储器的过程和动态存储器的过程是一样的,但是写就不同了,所以读写的部分一定要放到 RAM 中 ) ,而只读的部分和对速度要求不是那么高的部分放入固态存储器。同时 ARM 结构的异常向量表规定放在地址为 0x00000000 开始的地址空间上,而一般的 CPU 为了提高异常相应速度,会将这个向量段 remap 到其他的 RAM 当中,所以在描述文件当中必须精确指定异常向量跳转程序的地址到 remap 的地方。



       在 application 程序执行前,还需要由一些文件描述 application 程序执行的环境。比如系统工作时钟,总线频率。现在一般嵌入式编程语言为 C,C++ 等。如果在使用它们的时候使用的 runtime-library ,那么在程序执行前还需要为这些库函数初始化 heap 。然后 ARM 可能工作在不同的模式,还需要为不同的工作模式设置 stack 。这样,描述链接地址的文件,以及在 application 运行前所有的初始化程序就是 startup 程序组。



       3 STARTUP 分类



       这样,将 startup 程序所完成的功能分类。一类是链接地址描述,一类是各种初始化的程序。根据不同的应用,描述文件和初始化程序的内容以及结构和复杂程度都会不同。但是基本上,它们都必须实现以下功能。



       3.1 描述文件实现功能



       描述文件可以是链接命令行上简单的几个字符,也可以是一个非常复杂的文件,但是它必须完成如下功能:指定程序下载的地址;指定程序执行的地址。



       3.2 初始化程序实现的功能



       初始化程序根据不同的应用,其结构和复杂度也不同,但是它必须完成如下基本功能:异常向量初始化;内存环境初始化;其他硬件环境初始化。
     
    展开全文
  • ARM 快速入门 - 基于AT系列 书籍语言:简体中文 书籍类别:C/C++教程 整理时间:如题描述 资料格式:PDF格式
  • 本教程详细介绍了从51到ARM过度的所有知识,是ARM入门的最好教程,包括: 第1章几个基本概念 ...第9章CC 语言的应用 …… 第10章程序和编辑和编译 …… 第11章程序的连接 …… 第12章ARM调试工具AXD …… 参考文献
  • 本手册以 IAR 公司的EWARM 开发环境和ST 公司的STR710-EVAL 评估板为基础,介绍如何编写STR710(ARM7 内核)的C 语言应用程序。手册的前半部分介绍IAR Systems 公司的ARM 开发环境EWARM 的使用方法,后半部分介绍...
  • 本教程详细介绍了从51到ARM过度的所有知识,是ARM入门的最好教程,包括: 第1章几个基本概念 ...第9章CC 语言的应用 …… 第10章程序和编辑和编译 …… 第11章程序的连接 …… 第12章ARM调试工具AXD …… 参考文献
  • 所用语言 C或汇编 Verilog HDL/VHDL 概念上   ARM是应用,FPGA是芯片设计,前者是软件,后面是硬件,ARM就像单片机,但是它本身的资源是生产厂家固定了的,可以把它看成一个比较优秀的单片机来使用。而 FPGA ...

    FPGA笔记1-ARM单片机和FPGA有什么区别

    ARM FPGA
    总线结构 哈佛总线或冯诺依曼结构 查找表
    执行方式 串行执行 并行执行
    运行层面 软件 硬件
    所用语言 C或汇编 Verilog HDL/VHDL

    概念上

      ARM是应用,FPGA是芯片设计,前者是软件,后面是硬件,ARM就像单片机,但是它本身的资源是生产厂家固定了的,可以把它看成一个比较优秀的单片机来使用。而 FPGA 需要通过自己编程,让它具备一切你想让他具备的功能。比如,你想让它是一个计数器,或者只是一个非门,那么这个芯片就是一个非门,只不过是个很昂贵的非门。你也可以在一款内部资源充分的FPGA 上,让这颗FPGA 成为ARM芯片,并且加上你想要加上的外设,比如网络,内存控制,LCD,等等,只要资源够用!
            从意义上ARM是可以是一种处理器,利用ARM架构体系的处理器,里面整合了很多现成的硬件资源供你编程调用。比如运算器、串口、usb接口等各种现成硬件。可以通过中断、或者DMA的方式直接操控硬件来实现某些功能。
      FPGA,是一个里面没有任何现成的硬件,需要你自己进行设计,比如你可以设计一个ARM CPU或者专门的运算器、串口电路等然后下载到里面。这个硬件是需要你自己设计的,用verilog 或vhdl语言进行设计。

    功能上

            ARM具有比较强的事务管理功能,可以用来跑界面以及应用程序等,其优势主要体现在控制方面,而DSP主要是用来计算的,比如进行加密解 密、调制解调等,优势是强大的数据处理能力和较高的运行速度。

      FPGA可以用VHDL或verilogHDL来编程,灵活性强,由于能够进行编程、除错、 再编程和重复操作,因此可以充分地进行设计开发和验证。当电路有少量改动时,更能显示出FPGA的优势,其现场编程能力可以延长产品在市场上的寿命,而这种能力可以用来进行系统升级或除错。

    用途上

       FPGA可以用作设计CPU的周边电路或者直接设计CPU本身。比如你想设计一个自己的CPU或者是其他的硬件电路。而ARM一般当做微控制器或者嵌入式操作系统CPU来使用,和你的电脑的CPU道理一样。你使用电脑的硬件资源的时候,不需要你去自己设计硬件吧。通过编写的程序控制CPU可以直接使用现成的硬件资源了。相对于省事的多。

    参考文章FPGA

    展开全文
  • 嵌入式Linux C编程入门(第2版) PPT

    热门讨论 2011-03-11 20:48:34
    7.4.5 gcc对内嵌汇编语言的处理方式 223 本章小结 224 动手练练 224 第8章 嵌入式linux c语言基础——arm linux内核常见数据结构 225 8.1 链表 226 8.1.1 链表概述 226 8.1.2 单向链表 226 8.1.3...
  • VxWorks for ARM

    热门讨论 2010-12-29 14:49:01
    编者假设读者有一定软件和硬件知识基础,有一定的汇编语言C 语言或C++语言编程基础,且 对单片系统有相应的了解,除特别说明外,书中不作有关编程或编程语法,以及嵌入式常用缩写、代名 词等作任何解释说明,有...
  • 学习了arm,笔者认为就有必要学习arm的汇编语言。对于软件出错调试,往往需要跟踪c编译器生成的汇编代码和链接器生成的Mapping文件等。对于操作系统,bootloader之类的移植,必须熟悉汇编代码,因为移植涉及到体系...

    S3C2416裸机开发系列二

    汇编入门代码以及sd卡启动

    象棋小子   1048272975

     

    学习了arm,笔者认为就有必要学习arm的汇编语言。对于软件出错调试,往往需要跟踪c编译器生成的汇编代码和链接器生成的Mapping文件等。对于操作系统,bootloader之类的移植,必须熟悉汇编代码,因为移植涉及到体系结构相关的部分只有汇编代码才能胜任,其它高级语言均无能为力。

    1. 流水灯硬件原理图

    6个LED分别接到GPA,GPE,GPG,GPL对应的I/O控制引脚上,I/O口由3.3V供电,当对应I/O口输出为1时,则点亮相应的LED,输出为0时,相应的LED灭掉。对于不同的开发板,灯的GPIO口控制不一样,需修改代码的控制口。

    2. 工程搭建

    打开Keil MDK,版本不是问题,只要能编译armv4指令(arm7/arm9)即可。Project->NewuVersion Project,保存项目后,会出现cpu选择界面,目前最新版本的MDK在Samsung目录下可以找到S3C2416的选项,但还是没有启动代码的。由于我们编写的是汇编程序,此时也无需启动代码,为了说明代码开发只与架构、指令集相关,与各个厂商不同的外设,特殊功能寄存器的定义无关。笔者选择NXP下arm7芯片LPC2103,然后会提示是否加入LPC2103的启动代码到工程,此处即使用c开发S3C2416,LPC2103的启动代码都是不适用的,当然选择不要加入工程。

    3. 代码编写

    创建一个新文件,命名为LEDs.s,.s为arm汇编文件后缀,保存并加入工程。汇编的一些基本用法请google,百度。这里需要说明的是,arm架构的cpu上电复位后都是从地址0x00000000开始执行代码的,并且异常向量进入地址都是0x0偏移处。当然有些厂商的芯片内部固化了芯片bootloader,芯片上电复位后是先执行厂商固化代码(理论上此时第一条固化代码的指令还是在0地址处),用来检测相应的引脚配置,如NXP的LPC系列检测到相应的配置后可以进入到ISP下载模式,通过串口进行代码的烧录,如新唐的NUC501在复位上电后可以配置进入USB下载模式,通过USB进行代码的烧录。这些厂商的固化代码执行完后,可能会对内存重映射,此时用户的入口代码地址可能还会是0x00000000,也可能是其它地址。如笔者此时讲解的S3C2416在nand boot后,内部RAM地址会映射到0地址处,用户代码是从0地址开始执行的。但在IROM boot后,内部RAM地址会映射到0x40000000地址处,用户代码是从0x40000000地址开始执行的。

     

    ; InternalMemory Base Addresses(IROM boot)

    IRAM_BASE       EQU    0x40000000

     

    ; Watchdog TimerBase Address

    WT_BASE         EQU    0x53000000  

     

    ; IO port forcontroling LEDs

    GPA_BASE        EQU    0x56000000  ; GPA Base Address

    GPE_BASE        EQU    0x56000040  ; GPE Base Address

    GPG_BASE        EQU    0x56000060  ; GPG Base Address

    GPL_BASE       EQU           0x560000F0     ;GPL Base Address

    GPCON_OFS       EQU    0x00        ; Control RegisterOffset

    GPDAT_OFS       EQU    0x04        ; Data Register Offset

     

    GPE13_LED2         EQU           13             ; GPE13->LED2

    GPE11_LED3         EQU           11             ; GPE11->LED3

    GPL13_LED4         EQU           13             ; GPL13->LED4

    GPE12_LED5         EQU           12             ; GPE12->LED5

    GPG2_LED6          EQU           2               ; GPG2->LED6

    GPA15_LED7        EQU           15             ; GPA15->LED7

     

    ;-----------------------CODE ----------------------------------

             

            PRESERVE8

            AREA   RESET, CODE, READONLY

              ENTRY

            ARM

    Start

              LDR    R0, =WT_BASE

              MOV    R1, #0

              STR    R1, [R0] ; 关看门狗

                         

              BL        GPIO_Init

                                                                

    Loop  

              LDR           R1,=GPE_BASE

              LDR           R2,[R1, #GPDAT_OFS]

              ORR           R2,R2, #(1<<GPE13_LED2)

              STR           R2,[R1, #GPDAT_OFS] ; GPE13 LED2亮

              LDR           R0, =1000 ; 传参,延时1000*1ms

              BL        Delay_ms

              BIC      R2,R2, #(1<<GPE13_LED2)

              STR           R2,[R1, #GPDAT_OFS] ; GPE13 LED2灭

              LDR           R0,=1000 ; 延时1s

              BL        Delay_ms

     

              LDR           R1,=GPE_BASE

              LDR           R2,[R1, #GPDAT_OFS]

              ORR           R2,R2, #(1<<GPE11_LED3)

              STR           R2,[R1, #GPDAT_OFS] ; GPE11 LED3亮

              LDR           R0,=1000

              BL        Delay_ms

              BIC      R2,R2, #(1<<GPE11_LED3)

              STR           R2,[R1, #GPDAT_OFS] ; GPE11 LED3灭

              LDR           R0,=1000

              BL        Delay_ms

     

              LDR           R1,=GPL_BASE

              LDR           R2,[R1, #GPDAT_OFS]                

              ORR           R2,R2, #(1<<GPL13_LED4)

              STR           R2,[R1, #GPDAT_OFS] ; GPL13 LED4亮

              LDR           R0,=1000

              BL        Delay_ms

              BIC      R2,R2, #(1<<GPL13_LED4)

              STR           R2,[R1, #GPDAT_OFS] ; GPL13 LED4灭

              LDR           R0,=1000

              BL        Delay_ms

     

              LDR           R1,=GPE_BASE

              LDR           R2,[R1, #GPDAT_OFS]

              ORR           R2,R2, #(1<<GPE12_LED5)

              STR           R2,[R1, #GPDAT_OFS] ; GPE12 LED5亮

              LDR           R0,=1000

              BL        Delay_ms

              BIC      R2,R2, #(1<<GPE12_LED5)

              STR           R2,[R1, #GPDAT_OFS] ; GPE12 LED5灭

              LDR           R0,=1000

              BL        Delay_ms

     

              LDR           R1,=GPG_BASE

              LDR           R2,[R1, #GPDAT_OFS]

              ORR           R2,R2, #(1<<GPG2_LED6)

              STR           R2,[R1, #GPDAT_OFS] ; GPG2 LED6亮

              LDR           R0,=1000

              BL        Delay_ms

              BIC      R2,R2, #(1<<GPG2_LED6)

              STR           R2,[R1, #GPDAT_OFS] ; GPG2 LED6灭

              LDR           R0,=1000

              BL        Delay_ms

     

              LDR           R1,=GPA_BASE

              LDR           R2,[R1, #GPDAT_OFS]

              ORR           R2,R2, #(1<<GPA15_LED7)

               STR           R2, [R1, #GPDAT_OFS] ; GPA15 LED7亮

              LDR           R0,=1000

              BL        Delay_ms

              BIC      R2,R2, #(1<<GPA15_LED7)

              STR           R2,[R1, #GPDAT_OFS] ; GPA15 LED7灭

              LDR           R0,=1000

              BL        Delay_ms

             

              B         Loop                    

                         

    GPIO_Init

              LDR           R0,=GPA_BASE

              LDR           R1,[R0]

              BIC      R1,R1, #(1<<GPA15_LED7) ; GPA15 output

              STR           R1,[R0]                     

              LDR           R1,[R0, #GPDAT_OFS]

              BIC      R1,R1, #(1<<GPA15_LED7) ; GPA15 LED7灭

              STR           R2,[R0, #GPDAT_OFS]

     

              LDR           R0,=GPE_BASE

              LDR           R1,[R0]

              BIC      R1,R1, #(0x3<<(GPE13_LED2<<1))

              BIC      R1,R1, #(0x3<<(GPE11_LED3<<1))

              BIC      R1,R1, #(0x3<<(GPE12_LED5<<1))

              ORR           R1,R1, #(0x1<<(GPE13_LED2<<1)) ; GPE13 output

              ORR           R1,R1, #(0x1<<(GPE11_LED3<<1)) ; GPE11 output

              ORR           R1,R1, #(0x1<<(GPE12_LED5<<1)) ; GPE12 output

              STR           R1,[R0]

                         

              LDR           R0,=GPG_BASE

              LDR           R1,[R0]

              BIC      R1,R1, #(0x3<<(GPG2_LED6<<1))  

              ORR           R1,R1, #(0x1<<(GPG2_LED6<<1)) ; GPG2 output

              STR           R1,[R0]         

     

              LDR           R0,=GPL_BASE

              LDR           R1,[R0]

              BIC      R1,R1, #(0x3<<(GPL13_LED4<<1))

              ORR           R1,R1, #(0x1<<(GPL13_LED4<<1)) ; GPL13 output

              STR           R1, [R0]

             

              BX        LR

                         

    ; 软件延时函数,arm汇编较精确计算,共延时R0*1ms

    ; 由于暂未设置时钟,用系统上电复位默认的ARM CLOCK

    ; 对于nand boot,ARM CLOCK = 12M(外部晶体12M)

    ; 对于IROM boot,ARM CLOCK = 120M(外部晶体12M)

    ; 这段汇编延时函数从sd卡启动,用的是IROM boot,120M

    Delay_ms

    ; 函数用到R1寄存器,压栈,以免函数调用前R1数据被覆盖

              STMFD SP!, {R1} ; 此时也是采用上电复位后的栈

    Delay1           

              LDR  R1, =30000 ; ARM CLOCK 120M计(IROMboot)

    Delay2           

              SUBS R1, R1, #1 ; 指令执行需1个ARMCLOCK

              BNE  Delay2 ; 跳转会清流水线,3个ARMCLOCK

    ; Delay2处循环一次为R1*(1+3)=120000个ARM CLOCK,即1ms

              SUBS R0, R0, #1

              BNE     Delay1

              LDMFD SP!, {R1} ; 入栈与出栈必须一一对应

              BX   LR

                         

              END ; 汇编结束

     

    4. 代码编译

    写好以上代码后,由于代码是地址无关的,即代码可以被链接到任意的存储器空间地址,都是可以正常执行的,因此此入门汇编代码可以暂时不用管链接设置。例如对于S3C2416来说,nand boot时这段代码是被拷贝到0x0处的,而IROM boot时这段代码是被拷贝到0x40000000处的,不同的启动模式,代码都是可以正确运行的。直接点击编译,会给出链接警告说没有相应的段匹配InRoot$$Sections,这是因为我们没有处理链接文件,链接器采用了默认的链接文件,一般情况下,代码是要跳转到c函数的main的,而跳转之前,链接器会先链接库相应的函数,进行全局变量,静态变量等的初始化,即先初始化c运行环境。而此处我们没有调用main,所以不会链接这些c环境初始化函数,因此在代码中是没有InRoot$$Sections段的,链接器没有找到代码中InRoot$$Sections段,则忽略这段,并给予警告。MDK编译默认是不会生成代码的二进制代码bin的,此处我们在工程属性->Use->RunUser Programs After Build/Rebuild栏中加入bin生成命令fromelf --bin ".\@L.axf" --output ".\@L.bin",即可在工程目录生成bin,这是我们用来烧录进SD卡或nand等存储器的二进制代码文件。

     

    图4-1 MDK生成二进制执行代码设置

    5. 代码从SD卡启动

    5.1. SdBoot.exe工具

    SdBoot工具是笔者专为Samsung arm9 S3C2450/S3C2451/S3C2416和arm11 S3C6410从sd卡启动,运行代码开发的。IROM SD/MMC启动特别适合代码的调试开发,更改的代码只需通过 IROM_Fusing_Tool.exe把可执行二进制代码烧写进sd卡,设置从sd卡启动,即可运行验证代码。但由之前文章所述IROMSD/MMC启动方式知道,代码需要在sd卡特殊的位置,内部固化代码才能正确地拷贝用户的代码到Steppingstone中。一般裸机开发生成的二进制代码以及编译生成的各个bootloader(如uboot都是需要先从sd卡启动,之后再把uboot,内核等固化到nand flash)直接通过IROM_Fusing_Tool.exe烧写进sd卡,设置从sd卡启动都是无法正确运行代码的,因为直接编译器生成的二进制代码都是不满足IROM SD/MMC启动所要求的代码存放格式的(sd卡启动流程请参考上一章节)。SdBoot工具就是为了修正这些直接编译的二进制代码格式,使之符合sd卡启动的代码位置存放要求。SdBoot工具非常适用于裸机开发,uboot之类的bootloader开发。编译后的可执行二进制代码bin先通过SdBoot.exe工具进行转换,再用IROM_Fusing_Tool.exe烧写进sd卡,设置从sd卡启动,此时即能正确地运行在sd卡中用户代码。

    5.2. SdBoot工具转换成符合sd卡启动的二进制代码格式

    5.2. 1.打开SdBoot.exe,点击浏览,打开由编译器生成的可执行二进制代码bin。

    5.2. 2. 确保选中“制作SD卡启动文件”,点击“生成”,如果成功,将在原bin目录下生成一个文件名比原bin多_1的文件。这个转换后的bin文件即能符合sd卡启动的格式要求。

     

    5.2.3. 如果没有点选“制作SD卡启动文件”,可以生成一个任意大小的文件(对文件扩充),该功能只为有需要的人使用(可生成特定大小的文件进行测试等)。

     

    5.2.4. 通过IROM_Fusing_Tool.exe把转换后的代码烧写进sd卡,设置板从sd卡启动。请匆对生成的sd卡启动bin再重复转换,因为工具无法识别二制进代码是否已转换,重复转换将破坏原有的格式。对于需要nand boot的裸机、uboot二进制代码,无需用此工具进行转换,当然转换后的二进制代码下载进nand,用nand boot也是可以正常运行的,此工具只针对sd卡启动。

    附注:

    如果读者对本文中部分内容不理解,可先参考一下先前的章节,或者google、百度一下。任何疑问或笔者的错误,欢迎联系笔者。

    以下资料笔者认为是与本文相关的,可供学习与参考,点击下面链接即可下载。

    a. SdBoot.exe,笔者开发的在windows平台针对arm9 S3C2450/S3C2451/S3C2416和arm11 S3C6410从sd卡启动,代码格式转换工具。

    b. ARM教程PPT,周立功讲解的NXP arm7 LPC2000系列的ppt教程,里面有arm架构以及汇编语言的教程,值得推荐。

    c. 汇编流水灯代码LEDs.s

    http://pan.baidu.com/s/1qW56wxA


    展开全文
  • 初学arm,写了几个练习小程序,记录在此,道行低微,贻笑大方 包括: 流水灯, 单按键, pwm驱动蜂鸣器, 串口与PC通信 开发板s3c2410, 开发环境realview+h-jtag 废话少说,开始第一个程序,流水灯对于裸板程序...

    初学arm,写了几个练习小程序,记录在此,道行低微,贻笑大方

    包括: 流水灯, 单按键, pwm驱动蜂鸣器, 串口与PC通信

    开发板s3c2410, 开发环境realview + h-jtag

    废话少说,开始第一个程序,流水灯对于裸板程序开发的学习,就像hello world对于任何一门高级语言,新手第一课,呵呵。几个文件内容如下:

    led.c 

     1 #include "s3c2410.h"
     2 #include "delay.h"
     3 
     4 
     5 
     6 void myblink(void)
     7 {
     8     delay(0);
     9     GPFCON = (GPFCON & ~(0xff<<8))|0x5500;
    10 
    11     while(1){
    12         GPFDAT = 0x7f;
    13         delay(1000);
    14         GPFDAT = 0xbf;
    15         delay(1000);
    16         GPFDAT = 0xdf;
    17         delay(1000);
    18         GPFDAT = 0xef;
    19         delay(1000);
    20     }
    21 }

    通过GPFCON配置GPF4, 5, 6,7引脚为输出状态,通过GPFDAT往相应的端口写数据,注意这种位操作的方式。另外,还可以通过GPFUP寄存器配置引脚的上拉,本例未用到。

    delay.c

     1 #include "delay.h"
     2 #include "s3c2410.h"
     3 
     4 
     5 static int delayLoopCount = 400;
     6 
     7 /*********************************************************************************************
     8 * name:     delay
     9 * func:     delay time
    10 * para:     nTime -- input, nTime=0: nAdjust the delay function by WatchDog timer.
    11 *                           nTime>0: the number of loop time, 100us resolution.
    12 * ret:      none
    13 * modify:
    14 * comment:      
    15 *********************************************************************************************/
    16 void delay(int nTime)
    17 {
    18      // time=0: adjust the Delay function by WatchDog timer.
    19      // time>0: the number of loop time
    20      // resolution of time is 100us.
    21     int i,adjust=0;
    22     if(nTime==0)
    23     {
    24         nTime   = 200;
    25         adjust = 1;
    26         delayLoopCount = 400;
    27         //PCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable
    28         WTCON = ((PCLK/1000000-1)<<8)|(2<<3);
    29         WTDAT = 0xffff;                              //for first update
    30         WTCNT = 0xffff;                              //resolution=64us @any PCLK 
    31         WTCON = ((PCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start
    32     }
    33     for(;nTime>0;nTime--)
    34         for(i=0;i<delayLoopCount;i++);
    35     if(adjust==1)
    36     {
    37         WTCON = ((PCLK/1000000-1)<<8)|(2<<3);   //Watch-dog timer stop
    38         i = 0xffff - WTCNT;                     //1count->64us, 200*400 cycle runtime = 64*i us
    39         delayLoopCount = 8000000/(i*64);         //200*400:64*i=1*x:100 -> x=80000*100/(64*i)   
    40     }
    41 }

    这个是开发板例程中的延时代码,直接拿过来用了,注释也比较详细。注意watchdog定时器只用了一次,就是delay(0)的时候,计算delayLoopCount的初值时。偶还是不太喜欢这种延时方式,直接让cpu空跑,太浪费了。

    fs2410_ram.sct

     1 ; *************************************************************
     2 ; *** Scatter-Loading Description File generated by uVision ***
     3 ; *************************************************************
     4 
     5 LR_ROM1 0x30000000 0x00200000  {    ; load region size_region
     6   ER_ROM1 0x30000000 0x00200000  {  ; load address = execution address
     7    *.o (RESET, +First)
     8    ;*(InRoot$$Sections)
     9    .ANY (+RO)
    10   }
    11   RW_RAM1 +0  {  ; RW data
    12    .ANY (+RW +ZI)
    13   }
    14 }
    15 

    fs2410_flash.sct

     1 ; *************************************************************
     2 ; *** Scatter-Loading Description File generated by uVision ***
     3 ; *************************************************************
     4 
     5 LR_ROM1 0x00000000 0x00200000  {    ; load region size_region
     6   ER_ROM1 0x00000000 0x00200000  {  ; load address = execution address
     7    *.o (RESET, +First)
     8    ;*(InRoot$$Sections)
     9    .ANY (+RO)
    10   }
    11   RW_RAM1 0x30000000 0x04000000  {  ; RW data
    12    .ANY (+RW +ZI)
    13   }
    14 }

    DebugInRam.ini

     1 FUNC void Init_Board(void)
     2 {
     3     _WWORD (0x53000000 ,0x00000000);
     4 
     5     _WWORD (0x4A000008 ,0xFFFFFFFF);
     6     _WWORD (0x4A00001C ,0x000007FF);
     7 
     8     _WWORD (0x4C000014 ,0x3);
     9     _WWORD (0x4C000004 ,0x0005c042);
    10 
    11     _WWORD (0x56000070 ,0x00280000);
    12     _WWORD (0x56000078 ,0x00000000);
    13 
    14     _WWORD (0x48000000 ,0x22111110);
    15     _WWORD (0x48000004 ,0x00000700);
    16     _WWORD (0x48000008 ,0x00000700);
    17     _WWORD (0x4800000C ,0x00000700);
    18     _WWORD (0x48000010 ,0x00000700);
    19     _WWORD (0x48000014 ,0x00000700);
    20     _WWORD (0x48000018 ,0x00000700);
    21     _WWORD (0x4800001c ,0x00018005);
    22     _WWORD (0x48000020 ,0x00000700);
    23     _WWORD (0x48000024 ,0x008e0459);
    24     _WWORD (0x48000028 ,0x000000B2);
    25     _WWORD (0x4800002c ,0x00000030);
    26     _WWORD (0x48000030 ,0x00000030);
    27 
    28     _WWORD (0x56000014 ,0x1);
    29 
    30     _WWORD (0x56000020 ,0xaaaa55aa);
    31     _WWORD (0x56000028 ,0xffff);
    32     _WWORD (0x56000024 ,0x0);
    33     pc = 0x30000000;
    34 }
    35 //map 0x48000000, 0x60000000 read write
    36 Init_Board();
    37 

    其实这第一个工程关键的地方在于熟悉处理器,板子,开发环境。所以工程的配置是重点。

    fs2410_ram.sct和fs2410_flash.sct是目标文件分别在ram 和flash上运行的链接脚本,主要用于配置程序代码段和数据段的地址,;*(InRoot$$Sections)注释掉是因为不需要开发板提供的库,写程序前一定要搞清楚板子的地址分配,这一点很关键。这两个文件是realview生成的,一开始没有可以编译一遍工程,自动就产生。

    DebugInRam.ini 是目标在ram上运行时的调试脚本,不是我写的哈,是开发板例程里带的,不过这个很重要哦,不然的话内存并没有被初始化,调试程序就有问题,总不能总在flash上跑程序吧。

    上面的三个脚本,如果不特殊说明的话,后面的程序都会用到,就不再贴出来了。

    main.c很简单,就是包含头文件,然后调用myblink,不贴了哈。这个工程可以不必要工程提供的启动代码

    S3C2410A.C,要也可以,不过配置比较复杂,就是其它文章的内容喽。

    转载于:https://www.cnblogs.com/liujiahi/archive/2011/09/11/2196355.html

    展开全文
  • ARM Cortex-M3权威指南》拔地而起的ARM Cortex-M3处理器。《ARM Cortex-M3权威指南》是编程与实现它的...使用汇编与C来在Cortex-M3上编程 开发流程 电源管理 多处理机通信 开发工具 调试 Kell ReelVlew MDK使用入门
  • C程序设计语言(第2版·新版中文)

    热门讨论 2010-10-22 19:43:48
    人们熟知的“hello,world”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。 内容提要 -------------------------------------------------------------------------------- 《C...
  • 对于 Cortex-A 芯片来讲,大部分芯片在上电以后 C 语言环境还没准备好,所以第一行程序肯定是汇编的,至于要写多少汇编程序,那就看你能在哪一步把 C 语言环境准备好。本文对常用的汇编指令及用法做了详述,便于初学...
  • 这是一本内容不多但很实用的C++入门书籍,强调快速上手与理解C++编程。 本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解。 你不只学到C++的函数和结构,也会学习到它们的设计目的和...
  • Linux gcc入门

    2020-08-22 16:49:57
    最开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。 2.gcc的特点 gcc是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。 gcc不仅是...
  • C语言入门经验

    2019-09-25 09:13:29
    前言:古人云:师傅领进门,修行靠个人 ...C 语言是整个计算机体系的基础,往下可以操作硬件(不止X86计算机,还有ARM,DSP,单片机等各种微处理器)写Firmware,写驱动、写OS,写编译器,往上可以...
  • ARM体系和编程(书)

    2009-06-29 00:53:38
    里面对汇编语言的讲解很详细。包括伪操作等。 以及ARM的存储系统。 还有c,c++程序设计以及相应的编译器有详细的解释。 内容主要这3方面,是入门的好书。 我加工过了。增加了相应的目录便于阅读。
  • axd 调试入门

    2011-08-24 10:21:00
    CodeWarrior集成开发环境(IDE)为管理和开发项目提供了简单多样化的图形用户界面,用户可以使用ADS的CodeWarrior IDE为ARM和Thumb处理器开发用C、C++或者ARM汇编语言编写的程序代码。 ADS中包含有3个调试器:AXD、...
  • 开始gcc是作为C语言的编译器(GNU C Compiler),现在除了c语言,还支持C++、java、Pascal等语言。gcc支持多种硬件平台。  2. gcc的特点  gcc是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。  ...
  • 如果直接使用c语言,调用printf函数,势必会链接c库,那么反汇编代码将会比较复杂,不利于入门,于是计划,是否可以直接使用汇编语言,来写个最简单的程序,输出helloworld。 参考文章:...
  • 在之前的文章中,我们介绍了51单片机的IO口、编写语言、三种中断方式(外部、定时器、串口)和常见外设的应用(LED灯、数码管、按键、显示屏、AD、基于I2C协议通信的EEPROM),同时简要介绍了μC/OS-II嵌入式实时...
  • 支持C/C++、PYTHON等多种语言,OPENCV的设计可以直接运行在ZYNQ的PS上,但是用ARM处理高清视频处理的时候,可能就会处理不过来,于是会使用HLS OPENCV进行硬件加速,本文主要是针对HLS的入门操作

空空如也

空空如也

1 2 3 4
收藏数 76
精华内容 30
关键字:

armc语言入门