嵌入式 STM32(三)
更多专栏:
超详细的嵌入式面经专栏(适用于小白学习和大佬复习):https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz
校招公司汇总专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybKdp
目录:
1.什么是DMA?
2.你了解波特率吗?什么是波特率?
3.请你说说存储器都有哪些类型?
4.ROM RAM、FLASH、EEPROM区别
5.你了解USART(串口通信)吗?请你说说什么是USART(串口通信)?
内容:
1.什么是DMA?
DMA(直接内存访问)。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。简单来说,DMA使得设备和内存之间的数据传输可以更加高效,转移数据(尤其是转移大量数据)是可以不需要CPU参与。
在传统的内存访问过程中,CPU需要参与每一笔数据的传输,它会从外设读取数据并将其写入内存,或者从内存读取数据并写入外设。
由下图,数据由NIC搬运到Mermory的过程中,前后一共经历了四次CPU复制数据,CPU一直在重复简单的数据复制。而我们知道,CPU的最主要工作是计算,而不是进行数据复制,这种工作白白浪费了其计算能力,并且极大地限制了整个系统的处理能力。
而使用DMA时,DMA控制器接管了数据传输的工作,比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理。大大为CPU减轻负担。
DMA传输方式
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及三种情况的数据传输。
- 外设到存储器(例如将串口RDR寄存器写入数据buf)
- 存储器到外设(将数据buf写入串口TDR寄存器)
- 存储器到存储器(复制数据buf)
DMA_Mode_Normal,正常模式,
当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
DMA_Mode_Circular ,循环传输模式
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。也就是多次传输模式
DMA的主要特征
- STM32F103 有 2 个 DMA 控制器,DMA1 有 7 个通道,DMA 2 有 5 个通道。一个通道每次只能搬运一个外设的数据,如果同时有多个外设的 DMA 请求,则按照优先级进行响应。
DMA1有7个通道:
DMA2有5个通道:
- 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过 软件来配置。
- 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、 中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)
- 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目 标地址必须按数据传输宽度对齐。
- 支持循环的缓冲器管理
- 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志 逻辑或成为一个单独的中断请求。
- 存储器和存储器间的传输
- 外设和存储器、存储器和外设之间的传输
- 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
- 可编程的数据传输数目:最大为65535
仲裁器
仲裁器的作用是确定各个DMA传输的优先级。仲裁器根据通道请求的优先级来启动外设/存储器的访问。优先权管理分2个阶段,软件:每个通道的优先权可以在DMA_CCRx寄存器中设置,有4个等级:
- 最高优先级
- 高优先级
- 中等优先级
- 低优先级;
硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。比如:如果软件优先级相同,通道2优先于通道4。
注:在大容量产品和互联型产品中,DMA1控制器拥有高于DMA2控制器的优先级。
DMA配置流程
- 开启DMA时钟并且使能
- 初始化DMA,配置DMA结构体
如:外设基地址,外设数据宽度,存储器基地址,存储器数据宽度,是否自增,传输方向想
- DMA使能
2.你了解波特率吗?什么是波特率?
波特率是通信中传输信号的速率,表示每秒钟传输的符号数量。一个符号代表了信号的变化或状态。在串口通信(如RS-232)中,波特率通常用于描述数据传输的速度,单位为“波特”(Baud),例如9600波特、115200波特等。
注意:波特率与比特率是两个不同的概念。比特率是每秒传输的数据比特数,而波特率是每秒钟信号变化的次数。
在串行通信中,波特率决定了数据传输的速率。
在串行通信中,发送方和接收方之间需要以相同的速度进行数据交换。
- 发送方将数据位一位一位地传输给接收方。发送方和接收方需要根据一个共同的波特率来保持同步,以确保数据的正确传输和解析。
- 如果发送方的波特率比接收方的波特率高,接收方可能没有足够的时间去接收每个信号,导致数据丢失或者接收错误。
- 反之,如果接收方的波特率比发送方低,接收方的缓冲区可能无法跟上接收的数据流,导致数据丢失。
- 串口通信依赖于双方对数据传输时序的准确同步。如果波特率不一致,发送方和接收方可能会“听不懂”对方发送的数据,因为它们的时钟不同步。这会导致接收到的字符被错误地解析。
举例:
假设一个发送方以9600波特的速率发送数据,而接收方设置的波特率是115200波特。发送
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新