单片机_day9_ADC+LCD+DMA

目录

[1. 模数转换器(ADC)](#1. 模数转换器(ADC))

[1.1 基础知识](#1.1 基础知识)

[1.2 概念](#1.2 概念)

[1.3 ADC原理](#1.3 ADC原理)

[1.4 STM32U5的ADC简介](#1.4 STM32U5的ADC简介)

[​​​​​​​1.5 ADC特性](#1.5 ADC特性)

[​​​​​​​1.6 工作模式](#1.6 工作模式)

[​​​​​​​1.7 ADC单通道采集实验](#1.7 ADC单通道采集实验)

[​​​​​​​1.7.1 ADC相关函数](#1.7.1 ADC相关函数)

[​​​​​​​1.8 双通道采集实验](#1.8 双通道采集实验)

[2. LCD](#2. LCD)

[2.1 原理](#2.1 原理)

[​​​​​​​2.2 ILI9341(显示驱动芯片)](#2.2 ILI9341(显示驱动芯片))

[2.3 图片显示](#2.3 图片显示)

[2.3.1 找到一张心仪的图片并用"照片"打开](#2.3.1 找到一张心仪的图片并用“照片”打开)

[​​​​​​​2.3.2 图片取模](#2.3.2 图片取模)

[​​​​​​​2.3.3 创建项目](#2.3.3 创建项目)

[​​​​​​​2.3.4 移植驱动文件和图片数组文件](#2.3.4 移植驱动文件和图片数组文件)

[​​​​​​​2.3.5 兼容驱动文件,改引脚名字](#2.3.5 兼容驱动文件,改引脚名字)

[​​​​​​​2.3.6 引用头文件](#2.3.6 引用头文件)

[​​​​​​​2.3.7 主函数调驱动函数即可实现屏幕显示](#2.3.7 主函数调驱动函数即可实现屏幕显示)

[3. DMA(数据的搬运工)](#3. DMA(数据的搬运工))

[3.1 DMA简介](#3.1 DMA简介)

[3.1 ​​​​​​​DMA作用](#3.1 DMA作用)

[​​​​​​​3.1 DMA主要特性](#3.1 DMA主要特性)

[​​​​​​​3.4 DMA寄存器](#3.4 DMA寄存器)

[​​​​​​​3.5 DMA的增量或者循环模式](#3.5 DMA的增量或者循环模式)

[​​​​​​​3.6 DMA搬运ADC实验](#3.6 DMA搬运ADC实验)


1. 模数转换器(ADC)

1.1 基础知识

A:模拟信号(Analog)

模拟信号是指用连续变化的物理量所表达的信息,如温度、湿度、压力、长度、电流、电压等等,我们通常又把模拟信号称为连续信号,它在一定的时间范围内可以有无限多个不同的取值。模拟信号传输过程中,先把信息信号转换成几乎"一模一样"的波动电信号(因此叫"模拟")(传感器可以将非电学量转换成电学量)

D:数字(Digital)

0、1(二进制)

数字信号,是指自变量是离散的、因变量也是离散的信号,这种信号的自变量用整数表示,因变量用有限数字中的一个数字来表示。在计算机中,数字信号的大小常用有限位的二进制数表示。

C:转换器(Converter)

转换器(converter)是指将一种信号转换成另一种信号的装置。信号是信息存在的形式或载体。在自动化仪表设备和自动控制系统中,常将一种信号转换成另一种与标准量或参考量比较后的信号,以便将两类仪表联接起来,因此,转换器常常是两个仪表(或装置)间的中间环节。

最直观的体现,模拟信号是连续变化的曲线,而数字量是不连续的一个个离散的点。

1.2 概念

ADC,全称模数转换器(Analog-to-Digital Converter),模拟数字转换器即A/D转换器,ADC的作用就是将连续变化的模拟信号转换为离散的数字信号。通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小。

ADC应用场景

1)智能手机(陀螺仪,加速度计,光传感器)

2)温度计和湿度计(模拟信号转换为数字信号进行处理和显示)

3)电子秤(压力传感器测量物体的重量)

1.3 ADC原理

逐次逼近

​​​​​​​1.4 STM32U5的ADC简介

​​​​​​​1.5 ADC特性

量程:能测量的电压范围 0 ~ 3.6V(VSS ~VDD) (单片机供电范围是2.0到3.6)

分辨率:ADC的分辨率通常以输出二进制数的位数表示,位数越多,分辨率越高,一般来说分辨率越高,转化时间越长。

可配置的转换精度:6位,8位,10位,12位 2^6 2^8 2^10 2^12

转化时间:模拟输入电压在允许的最大变化范围内,从转换开始到获得稳定的数字量输出所需要的时间称为转换时间

​​​​​​​1.6 工作模式

1、单次转换模式:ADC只执行一次转换;(CHx:通道 )

2、 连续转换模式:转换结束之后马上开始新的转换;

3、 扫描模式:ADC扫描选中的所有通道,在每个组的每个通道上执行单次转换。在每个转换结束时,这一组的下一个通道被自动转换。如果设置了CONT位(开启了连续转换模式),转换不会在选择组的最后一个通道上停止,而是再次从选择组的第一个通道继续转换。

  1. 间断模式:触发一次,转换一个通道,在触发,在转换。在所选转换通道循环,由触发信号启动新一轮

使用ADC

  1. ADC外设的确定
  2. 将指定引脚配置为模拟量输入(内部通道不需要)
  3. 选择ADC的位数
  4. 左对齐和右对齐问题
  5. 选择模式
  6. 多通道需要选择顺序
  7. 设置转换时间--偏慢一点好--准确性更好一些

​​​​​​​1.7 ADC单通道采集实验

采集VBAT电压

ADC4各参数详解时钟分频(Clock Prescaler): 主时钟给到ADC后,可根据不同需要设置分频系数,分频越低,能耗越低,当然对应的转换时间也会更长。

分辨率(Resolution): ADC位数不同,其采样精度就不一样,以3.3V参考源为例,6位的ADC,其转换电压的颗粒度是3.3/2^6,而12位的ADC,转换电压的颗粒度则是3.3/2^12。所以分辨率越高,其采样的精度也就越高,当然代价就是转换时间更长,能耗更高。

数据对齐方式(Data Alignment): 可以选择采样后的数据左对齐存放或右对齐存放。STM32U5的AD转换后存储数据的对齐方式可通过软件配置成左对齐、右对齐。比如规则组12位分辨率左右对齐如下:

扫描方向(Scan Conversion Mode): 可选择从0到18向后扫描,也可以选择从18到0向前扫描。这个单片机只能支持这两个顺序扫描,F1之后的单片机,是支持自己设置扫描顺序的。

连续转换模式(Continuous Conversion Mode)和非连续转换模式(Discontinuous Conversion Mode): 设置成连续转换模式时,在一个组的ADC转换结束后,可以继续启动转换,不需要触发源介入。禁止时,则是在一个组转换结束后即停止转换,需要等到下个触发启动才开始转换。这两个寄存器实则是互斥的关系,即开启了连续转换模式,就不能开启非连续转换模式;开启了非连续转换模式,就不能开启连续转换模式。

DMA传输模式(DMA Continuous Requests): 开启此功能可召唤DMA当搬运工帮你搬运数据,具体还需要配置DMA相关的参数。

数据覆盖方式(Overrun Behaviour): 当ADC的DR寄存器里已经存有上次转换完的数据,并且未读取时,又有一次ADC通道转换完成时,可通过此选项,选择是保持之前的数据,还是用新的数据覆盖之前的数据。

低电压自动等待(Low Power Auto Wait): 低电压时不进行转换,等待电压恢复。低电压自动断电(Low Power Auto Power Off): 低电压时断ADC外设的电,电压恢复后需要手动给ADC上电。

采样时间(Sampling Time): 前面原理讲到的,ADC采样需要一定的时间,而这个时间跟外部电路也有一定的关系,所以这个时间是根据外部电路可以做灵活调整,一般来讲时间设置越长,检测的准确性也就越高。如果对时序要求不高的场合,设置成最大的周期数即可。

​​​​​​​1.7.1 ADC相关函数

//U5特有步骤

HAL_PWREx_EnableVddA();

这个函数用于启用VDDA电压域。VDDA是指处理器的模拟电源电压域,用于供电模拟功能模块,例如ADC,DAC等。通过HAL_PWREx_EnableVddA()函数,可以使处理器的VDDA电压域处于启用状态,以供给模拟功能模块所需的电源。

HAL_PWREx_EnableVddIO2();

这个函数用于启用VDDIO2电压域。VDDIO2是指处理器的I/O引脚电源域,用于供电处理器的I/O引脚。通过调用HAL_PWREx_EnableVddIO2()函数,可以使处理器的VDDIO2电压域处于启用状态,以供给处理器的I/O引脚所需的电源。

HAL_ADCEx_Calibration_Start(&hadc4,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //校准单端ADC采样

HAL_ADCEx_Calibration_Start(&hadc1,ADC_DIFFERENTIAL_ENDED); //校准差分端ADC采样

//这是共同操作逻辑

HAL_ADC_Start(&hadc4);//启动adc转换

HAL_ADC_PollForConversion(&hadc4,100); //等待转换完成,第二个参数表示超时时间,单位ms

HAL_ADC_GetValue(&hadc4); //获取ADC转换结果

​​​​​​​1.8 双通道采集实验

2. LCD

2.1 原理

三基色:红R绿G蓝B

RGB565

图片--->每个像素点对应的颜色(每个像素点需要写入的16位二进制数)

图片取模软件

cpp 复制代码
PA4------SPI1_NSS------Output
PA5------SPI1_SCK
PA6------SPI_MISO
PA7------SPI_MOSI

​​​​​​​2.2 ILI9341(显示驱动芯片)

  1. ILI9341是一个支持分辨率为240RGBx320点阵的a-TFT LCD 的262144(2^18)色单片驱动器。这个单片驱动器包含了一个720通道的源极驱动器(source driver),一个320通道的栅极驱动器(gate driver),172800字节的GRAM用于显示240RGB x 320分辨率的图片数据,一套电源支持电路。
  2. ILI9341提供8位/9位/16位/18位的并行MCU数据总线,6位/16位/18位RGB接口数据总线以及3或4线SPI接口(serial peripheral interface)。通过窗口地址函数,显示区域被指定在GRAM内。这个指定的窗口区域可以被有选择地更新,因此显示区域能够同时被显示在静态图像的区域内。
  3. ILI9341的IO接口电压工作于1.65V-3.3V。一种合并的电压跟随电路,用以产生驱动液晶显示器的电压电平。ILI9341支持full color ,8-color显示模式,支持由软件控制的精确电源睡眠模式。这些功能使ILI9341成为类似于移动电话,小电话,MP3需要电池长效工作的中等或小尺寸便携产品的理想驱动器。

2.3 图片显示

2.3.1 找到一张心仪的图片并用"照片"打开

​​​​​​​2.3.2 图片取模

​​​​​​​2.3.3 创建项目

cpp 复制代码
#define LCD_DCX_Pin GPIO_PIN_4
#define LCD_DCX_GPIO_Port GPIOA
#define LCD_RST_Pin GPIO_PIN_8
#define LCD_RST_GPIO_Port GPIOA

​​​​​​​2.3.4 移植驱动文件和图片数组文件

​​​​​​​2.3.5 兼容驱动文件,改引脚名字

在main.h中,补充引脚宏定义部分

cpp 复制代码
#define LCD_DCX_Pin GPIO_PIN_4
#define LCD_DCX_GPIO_Port GPIOA
#define LCD_RST_Pin GPIO_PIN_8
#define LCD_RST_GPIO_Port GPIOA

​​​​​​​2.3.6 引用头文件

​​​​​​​2.3.7 主函数调驱动函数即可实现屏幕显示


3. DMA(数据的搬运工)

3.1 DMA简介

DMA(直接存储器访问),DMA传输是将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

CPU无时不刻的在处理着大量的事务,但有些事情却没有那么复杂,比方说数据的复制和存储数据,如果我们把这部分的CPU资源拿出来,让CPU去处理其他的复杂计算事务,能够更好的利用CPU的资源.

因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理

3.1 ​​​​​​​DMA作用

DMA的传输方式无需CPU参与,可以直接控制传输。

DMA给外部设备和内存开辟了一条直接数据传输的通道。

目的:给CPU节省资源,使CPU的工作效率提高

​​​​​​​3.1 DMA主要特性

1)同一个DMA模块可以有多个优先级请求:很高、高、中等、低

2)每个通道有3个事件标志: DMA半传输、DMA传输完成、 DMA传输出错

3)数据源 目标源 数据传输宽度对齐

4)传输数据 字节(8位) 半字(16位) 全字(32位 )

5)双向的AHB主端口,GPDMA:2个端口

6)内存映射数据从源到目标的传输:

外设到内存

内存到外设

内存到内存

外设到外设

7)在睡眠和停止模式下自主数据传输

8)并发DMA通道

9)GPDMA 有 16 个通道。

​​​​​​​3.4 DMA寄存器

DMA_CPARx : 设置外设地址的寄存器

DMA_CMARx : 设置存储器地址的寄存器

DMA_CCRx : 设置数据传输方向

DMA_CNDTRx:设置传输的数据量

​​​​​​​3.5 DMA的增量或者循环模式

1)增量:外设搬移到存储器的时候 ,不希望覆盖上一个数据,会将内存设置为增量模式

2)循环:DMA不停循环的搬移数据,一组的数据传输完成时,计数寄存器将会自动地被恢复成配置该通道时设置的初值。

DMA的增量或循环模式是指在进行连续数据传输时,DMA可以选择以递增的方式访问源和目标地址,或者以循环的方式重复访问相同的地址。

在增量模式下,DMA控制器在每次传输完成后,会自动增加内存地址的值,使得下一次传输的数据存储在内存中的下一个位置。这样,外部设备可以连续地读写数据,而不需要额外的指令干预。

在循环模式下,DMA控制器在传输完成后,会重新回到起始内存地址,再次开始传输数据。这样,外部设备可以循环地读写同一块内存区域,方便处理需要重复操作的数据。

DMA配置要点:

  1. 数据源 2. 目标 3. 数据宽度 4.DMA模式 增量/循环

​​​​​​​3.6 DMA搬运ADC实验

搬运PB1(电位器分得的电压)

ADC的DMA转运结束后会进入此中断

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)

相关推荐
qichengzong_right2 分钟前
树莓派(Raspberry Pi)picotool
linux·c++·单片机
Tanecious.3 小时前
STM32——外部中断
stm32·单片机·嵌入式硬件
相醉为友3 小时前
STM32读写内部FLASH
stm32·单片机·嵌入式硬件
姓刘的哦7 小时前
MCU的时钟体系
单片机·嵌入式硬件
ShiinaKaze7 小时前
【STM32】USB 简要驱动软件架构图
stm32·单片机·mcu·usb
仰望星(兴)空8 小时前
FreeRTOS消息队列实验与出现的问题
嵌入式硬件·freertos
GOTXX8 小时前
STM32设计的物联网智能鱼缸
stm32·嵌入式硬件·物联网
陌夏微秋9 小时前
51单片机基础07 实时时钟-思路及代码参考1
arm开发·单片机·嵌入式硬件·51单片机·硬件工程
电子小子洋酱11 小时前
ESP32移植Openharmony外设篇(5)aht20温湿度传感器
单片机·嵌入式硬件·物联网·harmonyos·鸿蒙