(一)GPIO
GPIO(GeneralPurpose Input/Output) 的每个引脚都可以配置为输入或输出模式,并可通过相对应的寄存器进行读写操作。在本文介绍的应用中是读取特定引脚状态。
(二)PIT
PIT(PeriodicInterrupt Timer) 是周期定时器,开发者可以根据任务开发需求,预设周期时间产生定时中断。本文实验采用的是PIT产生的周期信号将触发DMA 传输,以便实现周期性地读取GPIO 状态。其他应用场景中可以周期读取ADC数值、周期触发通信(SPI、UART、I2C等)、周期采集气压\温湿度等传感器数值。
本文介绍方法是通过配置PIT 的计数周期,可以精确控制读取GPIO 状态的时间间隔。
需要注意的是PIT的计数周期一定大于DMA传输数据的时间。
(三)DMA
DMA(directmemory access) 允许在不经过CPU 干预的情况下,直接在内存和外设之间传输数据。对于读取GPIO 状态这一操作,利用DMA 可以将 GPIO数据寄存器的值直接传输到内存中的指定缓冲区,大大提高了数据传输效率。
二、验证步骤
(一)PIT 主要配置
1: void PIT_Init(PIT_Type *base, const pit_config_t *config)
PIT 模块进行初始化,设置PIT 的时钟源,合适的系统时钟分频值来确定PIT 的计数频率,确保定时器正常运行。
2:static inline void PIT_SetTimerPeriod(PIT_Type *base,pit_chnl_t channel, uint32_t count)
设置满足开发需求的配置PIT 的周期值。根据需要读取的GPIO 状态读取频率,计算并设置PIT 的计数值。
3:static inline voidPIT_EnableInterrupts(PIT_Type *base, pit_chnl_t channel, uint32_t mask)
使能 PIT 中断,并将中断服务程序与PIT 中断关联起来。当中断发生触发后续的DMA 操作。
4:static inline void PIT_StartTimer(PIT_Type *base,pit_chnl_t channel)
启动PIT周期定时器。
(二)DMA主要 配置
1:void EDMA_Init(DMA_Type *base, const edma_config_t *config)
初始化 DMA 控制器,设置DMA 的工作模式。
2:voidEDMA_PrepareTransfer(edma_transfer_config_t *config,
void *srcAddr,
uint32_t srcWidth,
void *destAddr,
uint32_t destWidth,
uint32_t bytesEachRequest,
uint32_t transferBytes,
edma_transfer_type_t transferType)
a. DMA 的源地址设置为对应GPIO接口的数据寄存器的地址(GPIOdata register (DR))。DMA GPIO data register (DR)获取数据。
b. DMA 的目标地址设置为内存中预先分配的缓冲区地址。这个缓冲区将用于存储读取到的GPIO 状态数据。
c. DMA 的传输数据大小和数据宽度设置。根据GPIO 数据寄存器的宽度和一次传输的数据量来确定。因为MIMXRT170MCU的GPIO 数据寄存器DR是 32 位,每次读取一个32 位,即4字节长度的值,需要相应地设置好这些参数。
需要注意的是源地址是GPIO数据寄存器地址,数据宽度是32bit(4Bytes),数据地址和数据宽度一定是一致的,否则会报错。
d. void EDMA_StartTransfer(edma_handle_t *handle)
使能 DMA 通道,并将其与PIT 中断触发源相关联。当PIT 产生中断时,触发DMA 传输。
(三)GPIO 配置
1:voidGPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *Config)
设置需要读取状态的GPIO 引脚,配置为输入模式。根据开发板外部电路的电气特性,为保证输入引脚信号的可靠精确性,可能需要设置上拉或下拉电阻等配置。
注意:高速GPIO不支持DMA方式读取。
三、软件分析和数据处理
(一)软件分析
本方案实现最重要的一个接口函数是EDMA_PrepareTransfer函数。