IMX6ULL裸机开发学习1-汇编点亮led

通过GNU ARM汇编实现对led灯闪烁控制。

编程环境搭建:

开发板:野火Imx6ull mini板

编程环境:Ubuntu18.04         +          VScode

直接上汇编代码:

/*******************
*文件名:    led.s
*作者    :     桂志威
*邮箱    :  [email protected]
*描述    :裸机实验测试1 汇编点亮led灯
 ********************/

 .global    _start      @全局标号

 /*****
 *描述 : _start函数
  */
  _start :

  /*****
  *点亮LED灯 GPIO5_IO03
  *开漏输出
  */

  /*****
  *1.使能控制时钟
   */
ldr r0, =0x020c4068      @配置寄存器CCM_CCGR0
ldr r1, =0xffffffff
str r1, [r0]

ldr r0, =0x020c406C      @配置寄存器CCM_CCGR1
ldr r1, =0xffffffff
str r1, [r0]

ldr r0, =0x020c4070      @配置寄存器CCM_CCGR2
ldr r1, =0xffffffff
str r1, [r0]

ldr r0, =0x020c4074      @配置寄存器CCM_CCGR3
ldr r1, =0xffffffff
str r1, [r0]

ldr r0, =0x020c4078      @配置寄存器CCM_CCGR4
ldr r1, =0xffffffff
str r1, [r0]

ldr r0, =0x020c407C      @配置寄存器CCM_CCGR5
ldr r1, =0xffffffff
str r1, [r0]

ldr r0, =0x020c4080      @配置寄存器CCM_CCGR6
ldr r1, =0xffffffff
str r1, [r0]

  /*****
  *2.GPIO5_IO03 复用功能配置GPIO
  *IOMUXC_SNVS_SW_MUX_CTL_PAD_SNVS_TAMPER3 地址229_0014h
   */
ldr r0, =0x02290014      @配置寄存器SNVS_TAMPER3
ldr r1, =0x5                        @AL5
str r1, [r0]

  /*****
  *3.GPIO5_IO03 配置IO属性功能
  *IOMUXC_SNVS_SW_PAD_CTL_PAD_SNVS_TAMPER3 地址 229_0058h
  *BIT0 压摆率 0-慢速
  *BIT5-3 驱动能力R0/6  -110
  *BIT7-6 速度 100mhz-10
  * BIT11 开漏输出使能 1-开启
  *BIT12 上下拉功能使能 0-关闭上下拉
  *BIT13 保持功能0
  *BIT15-14 100K上下拉电阻 -00
  *BIT16 hys-0关闭
  *设置配置值:8B0-100010110000
   */
ldr r0, =0x02290058      @配置寄存器SNVS_TAMPER3
ldr r1, =0x08B0                @AL5
str r1, [r0]

/*****
*4.设置GPIO5_IO03 为输出
*GPIO5_GDIR   地址20A_C004
*GPIO5_DR       地址20A_C000
*/
ldr r0, =0x020AC004      @配置寄存器GPIO5_GDIR
ldr r1, =0x08                    @BIT3
str r1, [r0]

/*****
*5打开GPIO LED
*/
ldr r0, =0x020AC000      @GPIO5_DR
ldr r1, =0x00                     @BIT3
str r1, [r0]

/*****
*6 loop循环运行
*/
loop:
   /**
   *开灯
    */
   ldr r0, =0x020AC000      @GPIO5_DR
   ldr r1, =0x00                     @BIT3
   str r1, [r0]

   /**
   *延时
    */
   bl delay

   /**
   *关灯
    */
   ldr r0, =0x020AC000      @GPIO5_DR
   ldr r1, =0x08                     @BIT3
   str r1, [r0]

   /**
   *延时
    */
   bl delay

    b loop

/**
 *延时
*/
delay:
   ldr r2, =0xfffff
   ldr r3, =0x0
delay_loop:
   sub r2,r2, #1
   cmp r2,r3
   bne delay_loop
   mov pc,lr      @返回主函数

简化版的makefie

led.bin : led.s
	arm-linux-gnueabihf-gcc -g -c led.s -o led.o
	arm-linux-gnueabihf-ld -Ttext 0x87800000 led.o -o led.elf
	arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin

clean:
	rm -rf *.o led.bin led.elf led.dis

dump:
	arm-linux-gnueabihf-objdump -D led.elf > led.dis

dowmload:
	./imxdownload led.bin /dev/sdb

最终效果:

大概0.5s时间闪烁。

简单汇编延时代码:

/**
 *延时
*/
delay:
   ldr r2, =0xfffff
   ldr r3, =0x0
delay_loop:
   sub r2,r2, #1
   cmp r2,r3
   bne delay_loop
   mov pc,lr      @返回主函数

你可能感兴趣的:(Linux工业嵌入式开发笔记,单片机,stm32,嵌入式硬件,ARM汇编,GNU汇编)