当前位置:   article > 正文

ARM架构与编程 · 基于IMX6ULL

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

代码重新定位

异常与中断

    

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/772671
推荐阅读
相关标签
  

闽ICP备14008679号