编辑
2024-03-23
学习记录
0
请注意,本文编写于 445 天前,最后修改于 411 天前,其中某些信息可能已经过时。

目录

imx6ull裸机开发
1.处理器区分:MCU、MPU、AP(Application Processor)
2.GPIO操作方法
3.ARM架构
4.gcc编译
5.段与代码重定位
6.异常、中断与寄存器
6.GPIO中断:
7.IIC集成电路总线
8.SPI全双工同步串行通讯总线
8.CAN总线
9.各种模块
1.IRDA红外遥控模块(3个引脚):
2.DHT11温湿度模块(3个引脚):
3.DS18B20温度模块(3个引脚):
4.SR501人体红外模块(3个引脚):
5.SR01超声波测距模块(4个引脚):
6.步进电机模块28BYJ-48:
7.OLED显示模块:
8.DAC(Digital Analog Convector)模块:
9.EEPROM模块AT24C02:
10.GPS模块:
11.ADC实验_光敏模块:

imx6ull裸机开发

1.处理器区分:MCU、MPU、AP(Application Processor)

mcu = cpu + flash + RAM

2.GPIO操作方法

  1. 时钟使能寄存器;
  2. IO功能(复用)寄存器;
  3. 输入/输出寄存器;
  4. 值寄存器;

3.ARM架构

1.RISC精简指令集计算机和CISC复杂指令集计算机(核心:汇编代码);

2.汇编基本代码:内存访问、数据处理、跳转指令;

3.串口编程:

  1. 确定使用哪个串口并使能该串口的两个引脚;
  2. 设置串口参数:波特率、数据位、校验位、停止位;
  3. 根据状态寄存器读写数据;

4.gcc编译

1.过程:编译、汇编、反汇编、链接;

2.Makefile编写,简化汇编过程指令的操作;

5.段与代码重定位

在EMMC上烧写一个程序led.imx=头部+led.bin,头部中含有后面的led.bin读到那个addr(链接地址/运行地址),有多长len;上电后运行到ROM内的程序时,会根据头部信息将led.bin复制到内存中,并开始运行。

imx6ull和stm32f157中都有ROM中的程序将led.bin根据头部信息放在指示的位置。 stm32f103就没有这么强大的ROM,只能有程序本身把自己复制到指示的位置。

1.段的概念:将整个程序分成一个一个段,并起个名字,链接时用这个名字来指示这些段,使得这些段排布在合适的位置。内存中有程序段、可读可写数据段、只读数据段、BSS段(存放初始化为0和未初始化的变量,不需要重定位,使用的时候将那一块内存清零);(局部变量保存在栈里面)(堆是一块空闲的空间,app可以使用malloc管理);

2.重定位:

  1. 头部信息中的地址(加载地址)和链接地址不一致时需要重定位;
  2. 各个段的重定位。核心:内存的复制;
  3. 使用位置无关码来运行重定位之前的代码(要求只能使用相对跳转指令b、bl,不能用绝对跳转指令idr,不访问全局变量、静态变量、字符串、数组、重定位完后使用绝对跳转指令跳转到**函数的链接地址去);

3.散列文件和链接脚本

6.异常、中断与寄存器

1.处理过程:

  1. 保存现场(保存各个寄存器到栈中);
  2. 处理异常(中断);
  3. 回复现场(从栈中读取各个寄存器的值);

2.Cortex 7的cpu工作的模式9种:

  1. usr正常模式;
  2. sys系统模式;
  3. monitor模式
  4. Hyp模式
  5. 异常模式:
    1. und未定义指令模式;
    2. svc管理模式(一条指令svc #VAL,因为应用程序和内核程序是分开的,通过这种异常进入内核执行操作):
    3. abt中止模式;(指令预取中止、数据访问中止)
    4. IRQ中断模式;
    5. FIQ快中断模式(可快速处理); 3.und未定义指令异常和svc异常:核心都是异常的处理过程,根据开发手册保存恢复寄存器;

4.中断,三个部件:中断源、中断控制器、cpu

5.GIC中断控制器,作用:接收优先级最高的中断源分发给不同的CPU—interface,再发给相应的寄存器;

6.寄存器:

  1. ARM 体系结构提供了十六个 32 位通用寄存器(R0-R15)供软件使用。其中的 15 个(R0-R14)可用于通用数据存储,而 R15 是程序计数器,其值随处理器执行指令而改变。
  2. R13(在所有模式下)是堆栈指针,但是当堆栈操作不需要时,它可以用作通用寄存器。
  3. R14(链接寄存器)保存 BL 分支指令的下一条指令的地址。当它不支持子程序的返回时,它也可以用作通用寄存器。R14_svc,R14_irq,R14_fiq,R14_abt 和 R14_und 同样用于在发生中断和异常时,或者执行转移和链接指令时,备份 R15 的返回值。
  4. R15 是程序计数器并保存当前程序地址(实际上,在 ARM 状态下,它始终指向当前指令之后的八个字节,而在 Thumb 状态下,它始终指向当前指令之后的四个字节,这是原始 ARM1 的三级流水线的遗留特性)。在 ARM 状态下读取R15 时,位[1:0]为零,位[31:2]包含 PC 值。在 Thumb 状态下,位[0]始终读为零。
  5. 程序状态寄存器(CPSR,current programmer status register)包含处理器的状态和一些控制标记位。

image.png

6.GPIO中断:

  1. 使能分发器寄存器GICD_、设置目标cpu_interface;
  2. 使能寄存器GICC_、设置目标processor;
  3. processor读取相应寄存器确定中断;
  4. 清除中断;

7.IIC集成电路总线

1.写寄存器流程:

  1. master发起start;
  2. master发送slave的addr(7位) + w操作(1位)。等待ACK;
  3. slave发送ACK;
  4. master发送寄存器addr(8位),等待ACK;
  5. slave发送ACK;
  6. master发送date(8位),等待ACK;
  7. slave发送ACK;
  8. 第六步和第七步可以重复多次,顺序写多个寄存器;
  9. master发起stop;

11.读寄存器流程:

  1. master发起start;(下面先假写)
  2. master发送slave的addr(7bit) + w操作(1bit),等待ACK;
  3. slave发送ACK;
  4. master发送寄存器addr(8bit),等待ACK;
  5. slave发送ACK;
  6. master发起restart;
  7. master发送slave的addr(7bit) + r操作(1bit),等待ACK;
  8. slave发送ACK;
  9. slave发送data(8bit),即寄存器里的值;
  10. master发送ACK;
  11. 第9步和第10步可以重复多次,即顺序读寄存器里的值;
  12. master发送NO ACK表示读取完成,从机也不用发送ACK;
  13. master发送STOP;

8.SPI全双工同步串行通讯总线

1.四根线:SCLK\CS\MOSI\MISO;

2.MISO和MOSI在SCLK的上升沿变化,在下降沿锁存数据;

3.SPI控制器初始化流程:

  1. 清除 CONFREG 寄存器的 EN 位来复位模块;
  2. 使能 SPI 时钟,具体在 CCM 模块中进行设置;
  3. 配置控制寄存器,并使能 ECSPI_CONFREG 寄存器的 EN 位来让模块工作;
  4. 配置 SPI 引脚,具体在 IOMUX 中设置;
  5. 配置 SPI 引脚,具体在 IOMUX 中设置;

8.CAN总线

CAN总线是一种多主控(Multi-Master)的总线系统。CAN网络的消息是广播式的,即在同一时刻网络上所有节点侦测的数据是一致的,它是一种基于消息广播模式的串行通信总线。

CAN总线分高速CAN和低速CAN,收发器也分为高速CAN收发器(1Mbps)和低速CAN收发器(125Kbps)。低速CAN也叫FaultTolerance CAN,指的是即使总线上一根线失效,总线依然可以通信。如同串口中的MAX3232用作电平转换,CAN收发器的作用则是把逻辑信号转换为差分信号。

CAN总线采用差分信号传输,通常情况下只需要两根信号线就可以进行正常的通信。在差分信号中,逻辑0和逻辑1是用两根差分信号线的电压差来表示。当处于逻辑1,CAN_High和CAN_Low的电压差小于0.5V时,称为隐性电平(Recessive);当处于逻辑0,CAN_High和CAN_Low的电压差大于0.9V,称为显性电平(Dominant)。

CAN总线遵从“线与”机制:“显性”位可以覆 盖“隐性”位(和IIC相同);只有所有节点都发 送“隐性”位, 总线才处于“隐性” 状态。这种“线与”机制使CAN总线呈现显性优先的特性。

CAN网络通信是通过5中类型的帧(Frame)进行的:

  1. 数据帧(Data frame):节点发送的包含ID和数据的帧,用于发送单元向接收单元传送数据的帧。
  2. 遥控帧(Remote frame):节点向网络上的其他节点发出的某个ID的数据请求,发送节点收到遥控帧后就可以发送相应ID的数据帧:
  3. 错误帧(Error frame):节点检测出错误时,向其他节点发送的通知错误的帧
  4. 过载帧(Overload frame):接收单元未做好接收数据的准备时发送的帧,发送节点收到过载帧后可以暂缓发送数据帧。
  5. 帧间空间(Inter-frame space):用于将数据帧、遥控帧与前后的帧分隔开的帧。

9.各种模块

1.IRDA红外遥控模块(3个引脚):

  1. 一根线传输信号,单总线协议;
  2. 红外协议有NEC\SONY\RC5\RC6,常用的是NEC格式;
  3. NEC协议:引导码(9ms的低脉冲+4.5ms的高脉冲) + 数据(地址+地址取反+数据+数据取反)
  4. (注意:发送的数据1和0开始都是0.56ms的低脉冲,对于数据1后面的高脉冲比较长;如果遥控器长按则发送一个9ms的低脉冲+2.25ms的高脉冲的引导码;)

2.DHT11温湿度模块(3个引脚):

  1. 一根线传输信号,单总线协议;
  2. 通信发送过程:
    1. 主机与DHT11没有通信时,总线处于空闲状态,此时总线电平由于上拉电阻处于高电平;
    2. 主机将对应的GPIO管脚配置为输出,发送一个开始信号(一个低脉冲 + 一个高脉冲。低脉冲至少持续18ms,高脉冲持续20-40us);
    3. 主机将对应的GPIO管脚配置为输入,准备接收数据,此时信号由上拉电阻拉高;
    4. DHT11发出响应信号(一个低脉冲 + 一个高脉冲。低脉冲持续80us,高脉冲持续80us);
    5. DHT11发送数据(8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据+8bit湿度小数数据+8bit校验和,数据传输正确时,校验和等于前32位数据的末8位。信号0表示为一个50us的低脉冲+26~28us的高脉冲;信号1表示为一个50us的低脉冲+70us的高脉冲。)
    6. DHT11发送结束信号;

3.DS18B20温度模块(3个引脚):

  1. 通讯时序:

    1. 最开始引脚上拉为高电平;
    2. 主机必须要拉低至少 480us,复位,随后释放总线,等待15~60us;
    3. 如果GPIO 上连有 DS18B20 芯片,它会拉低 60~240us。
    4. 如果主机在最后检查到 60~240us 的低脉冲,则表示 DS18B20 初始化成功
    5. 写时序:
      1. 如果写 0,拉低至少 60us(写周期为 60-120us)即可;
      2. 如果写 1,先拉低至少 1us,然后拉高,整个写周期至少为 60us 即可。
    6. 读时序:
      1. 主机先拉低至少 1us,随后读取电平,如果为 0,即读到的数据是 0,如果为 1,即可读到的数据是 1。
      2. 整个过程必须在 15us 内完成,15us 后引脚都会被拉高。
  2. DS18B20 中有两类命令:ROM 命令、功能命令

  3. 总线上只一个 DS18B20 设备时,根据下表发送命令、读取数据。因为只有一个 DS18B20,所以不需要选择设备,发出“Skip ROM”命令。然后发户“Convert T”命令启动温度转换;

4.SR501人体红外模块(3个引脚):

  1. 人体恒温37度,会发出10uM左右特定波长的红外线;
  2. 通过跳线设置是否可以重复触发,默认为 L。其中 L 表示不可重复,H 表示可重复;
  3. 可以调节检测距离,修改封锁时间;
  4. 探测到人体时,红外模块会发生电平跳变,正常为低电平,有人活动跳变为高电平;

5.SR01超声波测距模块(4个引脚):

  1. 通信时序:
    1. 触发:向Trig脉冲触发引脚发出一个10us的高电平;
    2. 模块自动发送8个40Khz的超声波,遇到障碍物返回;
    3. 回响:模块发送完超声波后,Echo引脚输出高电平,接收到超声波后,Echo引脚输出低电平;
  2. 测量Echo的高电平时间(计数值除频率)×声波的速度340m/s,即可计算来回距离;

6.步进电机模块28BYJ-48:

  1. 其名称的含义为外径 28 毫米四相八拍式永磁减速型步进电机,B:表示是步进电机;Y:表示是永磁式;J:表示是减速型
  2. 4相B-A-D-C 的四节拍操作后,转子转过了1/8圈,每拍11.25度;在单四拍的每两个节拍之间再插入一个双绕组导通的中间节拍,组成八拍模式,每拍5.625度,
  3. 双路有刷直流马达驱动芯片 MX1508,有待机、正转、反转、刹车模式;

7.OLED显示模块:

  1. 驱动芯片 SSD1306可以驱动共阴型 OLED 面板。芯片内部包含晶振、显示 RAM、对比度控制模块以及 256 级亮度控制模块,大大降低了外围元器件数量和功耗。
  2. 为 0.96 寸的屏幕,支持 128×64 像素显示。
  3. 实际上,我们只需要把数据发给 OLED,不需要从 OLED 读取数据,所以 MISO引脚用不到。
  4. 另外,还需要一个 GPIO 来表示发送给 OLED 的是命令,还是数据。低电平是命令,高电平是数据。

8.DAC(Digital Analog Convector)模块:

  1. 性能指标:
    1. 分辨率: N 位 DAC 转换器,其分辨率为:1/(2^N-1)
    2. 精度线性度;
    3. 转换精度:影响转换精度的主要因素有失调误差、增益误差、非线性误差和微分非线性误差灯;
    4. 转换速度。
  2. 不同类型的DAC有不同的通讯方式,此处选用SPI接口的DAC芯片TLC5615,10位DAC;
  3. 最大输出两倍的参考电压,输出电压out = 2×V(参考)×占空比,范围是0到2×参考电压;
  4. 注意要输出16位,高四位和低二位置0,输出数字值0-1024给芯片前要左移两位;

9.EEPROM模块AT24C02:

  1. 用于掉电保存;
  2. AT24C02 是基于 I2C 总线的存储器件;
  3. 存储容量为2Kbit,即2048bit = 256×8bit = 256 Byte, 其中它被分为32页,每页8Byte。

10.GPS模块:

  1. 使用者接收机(即用户设备),追踪所有的 GPS 卫星,并实时的计算出接收机所在位置的坐标、移动速度及时间;
  2. GPS模块为集成模块,主板使用串口与其通信,波特率为 9600bps,1bit 停止位,无校验位;默认每秒输出一次标准格式数据。

11.ADC实验_光敏模块:

  1. 原理:有光照射电阻减小,无光照射高阻状态,在光敏电阻两端加一个电压,ADC检测电压就能得知光照变化;
  2. IMX6ULL 中有 2 个 ADC,每个 ADC 都有 16 个通道;
  3. ADC 精度最大为 12 位,最大采样率是 1M。它还有比较功能,当采样值小于、大于或是等于某个值时,可以设置让它发出中断;
  4. ADC 有 3 种状态:禁止(Disabled),空闲(IDLE)、正在转换(Performing conversions)。ADC 默认处于禁止状态,需要先配置它才能使用;
  5. 校准后使用,可以选择ADC_HC0 寄存器既可以用于软件触发,也可以用于硬件触发;
  6. 当 ADC 结束时,结果保存在 ADC_Rn 寄存器中,并且 ADC_HS[COCOn](硬件状态寄存器的转换结束标记)将被设置为 1,如果 ADC_HCn[AIEN]=1 的话还会触发中断。
  7. ADC 还有自动求平均值的功能,这叫硬件平均功能。通过 ADC_GC[AVGE]位来使能。
  8. ADC时钟源有4个可以通过 ADC_CFG[ADICLK]来选择;这个时钟还可以进一步分频,通过 ADC_CFG[ADIV]设置分频系数。
  9. 主要的寄存器:
    1. 控制寄存器ADCx_HC0,用来选择通道,用来控制软件触发 ADC;
    2. 状态寄存器 ADCx_HS,它的 BIT0 就是 COCO0,用来表示转换是否完成;
    3. 数据结果寄存器 ADCx_R0有效数据从 BIT0 开始存放,用不到的位值为 0;
    4. 配置寄存器 ADCx_CFG用来配置数据是否覆盖、计算平均值、参考电压、采样周期、时钟源、分频系数、采集速率、转换精度等;
    5. 通用控制寄存器 ADCx_GC来控制校准、转换模式和电压参考选择等;
  10. 代码编写配置过程:
    1. ADC初始化:选定精度、启动校准;
    2. 往 ADC_HC0 寄存器中写入值,选择 ADC 通道,即可启动 ADC 转换;
    3. 获取ADC值;

本文作者:zzw

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 License 许可协议。转载请注明出处!