• ARM架构与编程 · 基于IMX6ULL


    一、嵌入式系统硬件介绍

    cpu +  RAM(内存) + FALSH  集成(flash存储设备) =  MCU/单片机

    AP/ MPU

     进化之后可以外接内存和存储设备,跑复杂的操作系统,比如手机

    cpu一上电就会执行程序,程序存放在片内的ROM中,帮助运行SPI  flash启动程序,变量存放在RAM中

    cpu发出的地址到哪里中间会经过一个内存控制器,将cpu的指令发给各种控制器,ROM、ROM  

    IMX6ULL 点灯

    点亮LED

    1、看原理图确定控制LED的引脚

    2、看主芯片手册确定如何设置/控制引脚

    3、写程序

     控制芯片的引脚1还是0,来控制输出电压

    1、将GPIO模块组使能

    2、设置多路选择器IO_mux,设置gpio是连接到那个模块

    3、设置GPIO口是输出还是输入

    4、设置gpio输出高低电平

     对引脚的操作不能影响到其他位,因为一个寄存器有很多位,每一个位都是一个引脚

    直接设置寄存器 reg = 1,bit0 = 1、bit1 = 0、bit2 = 0,后面两个被强制设置为0

    使用一个函数set_reg = 1,bit0 = 1、bit1 = 0、bit2 = 0 ,只有第一位起作用,其他为0的无效

    gpio口清零是使用clr_reg  只有1有效

     1、使能某一组GPIO

     2、选择引脚功能

    3、

    1、查看芯片看LED原理图,确定要操作的GPIO口

    2、使能

     

    寄存器CCGR1里面的CG13控制GPIO1组是否使能

    3、设置为GPIO5_3为GPIO

     GPIO模式

    也就是要使得这个寄存器最后三位变成101

    4、设置为输出功能

     

    gpio5_3 设置为输出,就是在将改寄存器的引脚3设置为1(芯片引脚从0开始的)

    绝对地址= 基地址 + 偏移地址

    5、设置电位为高还是低(低就是点亮,高是熄灭)

    o  表示高电位,1表示地电位

    LED操作

    怎么操作寄存器

    定义一个指针,然后让指针指向寄存器,最后给指针赋值就是相当于给寄存器赋值

    程序烧写
    头部 + bin    也就是 imx文件

    头部文件负责告诉ROM将程序读到哪里去

    运行流程

    1、将代码烧写到板子上

    2、头文件负责将告诉rom,要将emmc中的代码读到哪里去

    3、运行汇编文件,start.s,设置sp,然后从下往上执行

    4、运行main函数

    程序

    1. //延时函数
    2. void delay(volatile int d)
    3. {
    4. while(d--);
    5. }
    6. int main(void)
    7. {
    8. volatile unsigned int *pReg;//加上voliate避免编译器优化
    9. /* 使能GPIO5: 默认使能 */
    10. /* 把GPIO5_3设置为GPIO功能 */
    11. pReg = (volatile unsigned int *)(0x02290000 + 0x14); //将右边强制类型转换为指针类型,初始化
    12. *pReg |= (0x5);//修改寄存器,设置为GPIO功能
    13. /* 把GPIO5_3设置为输出引脚 */
    14. pReg = (volatile unsigned int *)(0x020AC004);//孤僻o基地址是0x020AC000 ,偏移地址是4
    15. *pReg |= (1<<3);
    16. pReg = (volatile unsigned int *)(0x020AC000);//gpio5的基地址是(0x020AC000
    17. while (1)
    18. {
    19. /* 设置GPIO5_3输出1 */
    20. *pReg |= (1<<3);//寄存器第四位与1
    21. delay(1000000);//延时
    22. /* 设置GPIO5_3输出0 */
    23. *pReg &= ~(1<<3);//寄存器第四位与0
    24. delay(1000000);
    25. }
    26. return 0;
    27. }

    ARM架构

    cpu眼中的地址与控制器眼中的地址是不同的

    cpu内部有16个寄存器,R0~R12是通用寄存器,其他三个是有特殊作用的

    除这外,还有程序状态寄存器PSR

    指令集

     

    第一个程序深度解析

    进制

    3个二进制位(三个bit)表示一个八进制位

    四个二进制位(四个bit)表示一个16进制位

    进制转换

    八进制转二进制,就是一位八进制使用3位二进制表示

    16进制转二进制,就是一位16进制使用四位二进制表示

    开头标识

    0b 二进制

    0开头表示8进制

    0x开头表示16进制

    汇编_反汇编_机器码

    使用按键控制LED

    原理图 

    1. void delay(volatile int d)
    2. {
    3. while(d--);
    4. }
    5. int main(void)
    6. {
    7. //当发现按键开关按下就开打
    8. volatile unsigned int *pRegLed;//通过gpio5——3控制灯开关
    9. volatile unsigned int *pRegKey;//通过gpio4-14感知按键开关的状态
    10. /* 使能GPIO5: 默认使能 */
    11. /* 使能GPIO4, CCM_CCGR3, b[13:12]=0b11 */
    12. pRegKey = (volatile unsigned int *)(0x020C4074);//
    13. *pRegKey |= (3<<12);
    14. /* 把GPIO5_3设置为GPIO功能 */
    15. pRegLed = (volatile unsigned int *)(0x02290000 + 0x14);
    16. *pRegLed |= (0x5);
    17. /* 把GPIO4_14设置为GPIO功能
    18. * IOMUXC_SW_MUX_CTL_PAD_NAND_CE1_B 地址:20E_0000h base + 1B0h offset = 0x020E01B0
    19. */
    20. pRegKey = (volatile unsigned int *)(0x020E01B0);
    21. *pRegLed &= ~(0xf);
    22. *pRegLed |= (0x5);
    23. /* 把GPIO5_3设置为输出引脚 */
    24. pRegLed = (volatile unsigned int *)(0x020AC004);
    25. *pRegLed |= (1<<3);
    26. /* 把GPIO4_14设置为输入引脚 ,因为我们需要读取它的值,要是写的话就是输出引脚
    27. * GPIO4_GDIR地址:0x020A8004
    28. */
    29. pRegKey = (volatile unsigned int *)(0x020A8004);
    30. *pRegLed &= ~(1<<14);//清零
    31. /* GPIO5_DR */
    32. pRegLed = (volatile unsigned int *)(0x020AC000);
    33. /* GPIO4_DR */
    34. pRegKey = (volatile unsigned int *)(0x020A8000);
    35. while (1)
    36. {
    37. /* 读取GPIO4_14引脚 */
    38. if ((*pRegKey & (1<<14)) == 0) /* 被按下 */
    39. {
    40. /* 设置GPIO5_3输出0 灯亮*/
    41. *pRegLed &= ~(1<<3);
    42. }
    43. else
    44. {
    45. /* 设置GPIO5_3输出1 灯灭 */
    46. *pRegLed |= (1<<3);
    47. }
    48. }
    49. return 0;
    50. }

    串口UATR编程


    1、UATR硬件介绍

    作用

    1、打印调试信息

    2、外接模块

     波特率定义了一位数据传输的时间

    1、数据开始传输的标志是电位为低 

    2、arm将数据一位一位传输,pc机会根据之前设定的波特率确定什么时候传了一位数据,然后读取这个数据

    2、UATR操作

    3、UATR编程

    kile_gcc_Makefile

    代码重新定位

    异常与中断

        

  • 相关阅读:
    艾美捷重组的脱氧核糖核酸酶 I,生物工艺级应用领域
    《统计学习方法》第四章总结与习题
    Linux多线程(线程同步与条件变量)
    PHP+茶叶商城系统 毕业设计-附源码211121
    数据库恢复
    windows系统服务管理命令sc
    undefined reference to `timersub‘ 错误处理
    基于压缩感知的磁共振成像重建算法研究
    C/C++ link-undefined 问题总结
    备战9月,美团50道软件测试经典面试题及答案汇总
  • 原文地址:https://blog.csdn.net/qq_43448818/article/details/128097395