开发环境

Ubuntu虚拟机
正点原子Linux-mini开发板
芯片I.MX6UL
内核Cortex-A7

参考手册

《 I.MX6UL参考手册》

开发流程

新建

  1. 新建ledc文件夹
  2. 新建start.S, main.c, main.h文件
  3. start.S还是汇编语言,用来初始化C语言环境,比如初始化DDR、设置堆栈指针SP等

    编写

    start.S ```css .global _start / 全局标号 / /*

    • 描述: _start函数,程序从此函数开始执行,此函数主要功能是设置C
    • 运行环境。 */ _start:

      / 进入SVC模式 / mrs r0, cpsr bic r0, r0, #0x1f / 将r0的低5位清零,也就是cpsr的M0~M4 / orr r0, r0, #0x13 / r0或上0x13,表示使用SVC模式 / msr cpsr, r0 / 将r0 的数据写入到cpsr_c中 /

      ldr sp, =0X80200000 / 设置栈指针 / b main / 跳转到main函数 /

  1. main.h
  2. ```c
  3. #ifndef __MAIN_H
  4. #define __MAIN_H
  5. /*
  6. * CCM相关寄存器地址
  7. */
  8. #define CCM_CCGR0 *((volatile unsigned int *)0X020C4068)
  9. #define CCM_CCGR1 *((volatile unsigned int *)0X020C406C)
  10. #define CCM_CCGR2 *((volatile unsigned int *)0X020C4070)
  11. #define CCM_CCGR3 *((volatile unsigned int *)0X020C4074)
  12. #define CCM_CCGR4 *((volatile unsigned int *)0X020C4078)
  13. #define CCM_CCGR5 *((volatile unsigned int *)0X020C407C)
  14. #define CCM_CCGR6 *((volatile unsigned int *)0X020C4080)
  15. /*
  16. * IOMUX相关寄存器地址
  17. */
  18. #define SW_MUX_GPIO1_IO03 *((volatile unsigned int *)0X020E0068)
  19. #define SW_PAD_GPIO1_IO03 *((volatile unsigned int *)0X020E02F4)
  20. /*
  21. * GPIO1相关寄存器地址
  22. */
  23. #define GPIO1_DR *((volatile unsigned int *)0X0209C000)
  24. #define GPIO1_GDIR *((volatile unsigned int *)0X0209C004)
  25. #define GPIO1_PSR *((volatile unsigned int *)0X0209C008)
  26. #define GPIO1_ICR1 *((volatile unsigned int *)0X0209C00C)
  27. #define GPIO1_ICR2 *((volatile unsigned int *)0X0209C010)
  28. #define GPIO1_IMR *((volatile unsigned int *)0X0209C014)
  29. #define GPIO1_ISR *((volatile unsigned int *)0X0209C018)
  30. #define GPIO1_EDGE_SEL *((volatile unsigned int *)0X0209C01C)
  31. #endif

main.c

  1. #include "main.h"
  2. void clk_enable(void)
  3. {
  4. CCM_CCGR0 = 0xffffffff;
  5. CCM_CCGR1 = 0xffffffff;
  6. CCM_CCGR2 = 0xffffffff;
  7. CCM_CCGR3 = 0xffffffff;
  8. CCM_CCGR4 = 0xffffffff;
  9. CCM_CCGR5 = 0xffffffff;
  10. CCM_CCGR6 = 0xffffffff;
  11. }
  12. void led_init(void)
  13. {
  14. /* 1、初始化IO复用, 复用为GPIO1_IO03 */
  15. SW_MUX_GPIO1_IO03 = 0x5;
  16. /* 2、配置GPIO1_IO03的IO属性 */
  17. SW_PAD_GPIO1_IO03 = 0x10B0;
  18. /* 3、初始化GPIO, GPIO1_IO03设置为输出 */
  19. GPIO1_GDIR = 0x0000008;
  20. /* 4、设置GPIO1_IO03输出低电平,打开LED0 */
  21. GPIO1_DR = 0x0;
  22. }
  23. void led_on(void)
  24. {
  25. GPIO1_DR &= ~(1<<3);
  26. }
  27. void led_off(void)
  28. {
  29. GPIO1_DR |= (1<<3);
  30. }
  31. void delay_short(volatile unsigned int n)
  32. {
  33. while(n--){}
  34. }
  35. void delay(volatile unsigned int n)
  36. {
  37. while (n--)
  38. {
  39. delay_short(0x7ff);
  40. }
  41. }
  42. int main(void)
  43. {
  44. clk_enable();
  45. led_init();
  46. while (1)
  47. {
  48. led_off();
  49. delay(500);
  50. led_on();
  51. delay(500);
  52. }
  53. }

Makefile

  1. objs := start.o main.o
  2. ledc.bin:$(objs)
  3. arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^
  4. arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
  5. arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
  6. %.o:%.s
  7. arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
  8. %.o:%.S
  9. arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
  10. %.o:%.c
  11. arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<
  12. clean:
  13. rm -rf *.o ledc.bin ledc.elf ledc.dis

image.png
image.png

烧录

chmod 777 imxdownload //给予 imxdownoad可执行权限,一次即可
./imxdownload ledc.bin /dev/sdd //下载到 SD卡