Q:1.为什么flash的起始地址是0x0800 0000?
A:ARM Cortex-M3 M4 M7等微控制器通常遵循一个通用的内存映射,其中0x0800 0000被定义为内部闪存的起始地址,这是ARM的推荐规范,所以许多制造商都遵循这一标准。
2.设置为相同的 可以方便软件开发和维护,
微控制器在上电或复位后,bootloader通常从固定地址开始执行代码。
但是也并不是所有的微控制器都使用这个地址,对于有不同内存映射的 还是需要根据手册来获取准确的内存映射信息。
Q:2.STM32 bootloader通用执行流程是什么?
1.启动模式选择
2.硬件初始化
3.通信接口初始化
4.协议处理
5.固件更新操作
6.跳转到用户程序
STM32有三种启动模式:主闪存存储器,系统存储器(内置bootloader)和内置SRAM。
用户通过BOOT引脚配置启动模式,当选择系统存储器启动时,芯片会执行内置的Bootloader程序
1,上电后或者发生复位后,bootloader会从预定义的复位向量地址开始执行代码,对于STM32,这个地址通常是0x0800 0000。
2.bootloader初始化代码中,首先会执行系统初始化代码。包括
配置时钟系统(HSE、HSI、PLL)以设置所需的系统时钟。
初始化堆栈指针。
配置必要的GPIO和外设
执行一些基本的内存清理操作。
bootloader 执行特定的硬件测试
跳转到应用程序代码
Q:3.8080并口协议的工作原理 和 IIC SPI的工作原理 区别
8080 并行接口是 早期的计算机总线接口标准,是INTEL 为其8080微处理器设计的总线接口,
常见于微控制器与外围设备(LCD显示屏)通信的协议。
包括 数据线 D0-D17 具体用哪几个信号线需要看配置
控制信号 D/CX RDX WRX CSX RESX
8080-I 8080-II的主要区别在于数据线通信时占据的数据位8080-I优先使用的是低8位,8080-II优先使用的是高8位。
使用过最熟悉的支持8080接口协议的就是ILI9341 TFT显示芯片,就以此为例 展开介绍写写,做个部分总结:
9341是一个单芯片控制驱动器,具有262144色的240RGB320像素解决方案,组成包括一个720通道的源极驱动器,一个320通道的栅极驱动器,172800字节用于图形显示的GRAM,以及供电电路。
看起上上面很简单的一段话 还是有一些内涵的。 比如262144色的定义如何来的?为什么是172800字节的GRAM大小?又为什么包含720通道的源极驱动器?
下面给简单解释下:
1.RGB颜色模型,通过组合不同强度 R、G、B三种基本色来形成各种不同的颜色。26万色通道用18bit的颜色深度来表示每个像素的颜色,所以RGB三基色分别用6位二进制表示,所以每种基色组合可表达的状态有2^6
种,总颜色数量等于 2^6*2^6*2^6=2^18
=262144色组合。
2.物理尺寸显示大小为240320像素点 每个像素点需要的bit数为18位来表示一个像素点上的颜色种类,所以总共需要24032018个bit的数据大小=1382400bit,转换为字节的单位就是172800的GRAM了。
3.至于720通道的源极驱动器,同样和RGB颜色模型有关,为了显示一个完整的彩色像素,需要控制RGB三种基本色,从而需要分别控制RGB三个子像素的亮度,而物理层面上源级驱动器可以为每个子像素提供精确的驱动电压,从而控制子像素产生的亮度,对应子像素的数据表示。
所以物理层面上也会需要DAC将RGB的色值通过数值转换为模拟电压,从而产生对应的驱动电压。
难点或者复杂点:
根据项目需求,参考手册上的说明,完成各种过程函数的实现(面向对象里面就可以称呼为方法了),debug,并做成库
IIC
物理层
双线制:SDA SCL 所有连接在总线上的设备都通过这两条线进行通信 开漏输出 开漏输出智能将信号拉低,不能拉高,便于多设备共享总线而不发生电平冲突。多主多从架构,设备上可以有多主多从设备
链路层:
START SCL为高电平,SDA由高电平向低电平的跳变 指示为START信号
STOP SCL为高电平,SDA由低电平向高电平的跳变指示为STOP信号
速率
标准模式 100kHz
快速模式 400KHz
高速模式 3-4MHz 具体需要看设备支持 这里只只是总线的特性。
地址帧:START 信号后 主设备发送一个7bit或10bit的从设备地址,以及一个读写位,总线上的所有设备都会接收这个地址和自己地址比对,比对结果一致的,返回ACK表示响应。
数据帧:地址匹配成功后,开始发送数据,每个字节传输完成后,接收方会发送一个应答位来表示是否成功接收。
SPI
物理层
四线制:CS SCL MOSI MISO 单主多从架构,主设备控制始终信号和从设备的选择,从设备根据主设备的控制进行数据收发
工作模式
由CPOL和CPHA决定 组合可以产生四种工作模式
CPOL 指定SPI总线空闲时的电平状态 CPOL = 0 总线空闲低电平 CPOL = 1 总线空闲高电平
CPHA 指定数据在SCK的第一边沿或第二个边沿采样 CPHA=0 第一个边沿采样 CPHA=1第二个边沿采样
由上述定义
CPOL =0 CPHA = 0:空闲低电平 第一个上升沿采样 下降沿发送
CPOL =0 CPHA = 1:空闲低电平 第二个下降沿采样 上升沿发送
链路层
数据是按照bit传输 数据传输速率由SCK频率定义。也受控于主控芯片最高频率。
速率
低速情况下:几百KHz和几MHz之间
高速情况下 几十MHz-100MHz 也存在
Q:经典PID控制算法 如何使实际值慢慢接近目标值?
我们整定参数应该如何整定
Q:数组和链表的区别?
A:数组和链表是两种常见的数据结构。它们在存储和操作数据上有显著的区别。
1.存储方式
数组:数组在内存中是连续存储的。,且定义时需要指定大小,通常是固定的 所有元素在内存中占据一块连续的空间。
链表:链表中的元素在内存中是可以分散存储的,每个元素(节点)包含数据和指向下一个节点的指针。链表的大小是动态的,可以随时增加和减小节点。
2.操作数据
访问:
数组:数据是连续存储的,可以通过索引直接访问任意元素,时间复杂度为O(1)。
链表:链表必须从头节点开始遍历,直到找到目标节点,时间复杂度为O(n)。
插入和删除
数组:
在数组中插入或删除元素需要异动大量的元素,时间复杂度O(n);
链表:在链表中插入或删除元素只需调整指针,时间复杂度为O(1);
3.使用效率上:
数组:数组的内存使用效率较高,因为只有数据本身占用空间。由于连续存储的特性,对缓存的利用较好,访问速度通常较快。
链表:链表每个节点除了数据外还需要额外的空间存储指针,因此内存使用效率较低。链表的节点在内存中分散存储,对缓存的利用较差,访问速度通常较慢。
所以对于数组和链表的使用要注意应用场景,数组适合快速访问和固定大小的场景,链表适合频繁插入和删除操作的动态大小场景。
应用:创建单向链表 ,双向链表 , 环形队列 并定义相关方法