stm32的dma从pa0~7采集引脚状态数据到内存。疑问,dma怎么确定什么时候应该采集呢?引脚

2024-05-17 00:43

1. stm32的dma从pa0~7采集引脚状态数据到内存。疑问,dma怎么确定什么时候应该采集呢?引脚

你代码里有开始命令,你让他传输他就传输,或者你设置了触发条件也会触发DMA。
外部芯片想送数据肯定会有一个信号吧,你检测到数据准备好信号就通知DMA可以去取数据了。

stm32的dma从pa0~7采集引脚状态数据到内存。疑问,dma怎么确定什么时候应该采集呢?引脚

2. STM32 DMA 问题

下面的描述可以帮你理解DMA,具体使用自行查手册,读代码
DMA每一个通道可以视作一个独立的外设,  有一个源地址寄存器(),一个目标地址寄存器,
一个传输次数寄存器,若干控制寄存器
可以将传输过程视作一个额外的cpu在启动之后,开始执行如下代码:
UDdst * pDst; //UDdst可以是 u8 u16 u32 任意
UDsrc  * pDst; //UDsrc  可以是 u8 u16 u32 
while(TransCNT)

{
if(触发了一次传输)        //一般来说指定了特定硬件功能(P2P,P2m,M2P)的话, 触发型号是外设电路给到DMA电路的,有时候启动传输会作为传输过程的第一个触发信号(比如用M2P模式发送若干数据至串口,启动时直接触发一次,后续触发则是传输完成时串口外设电路发送给DMA)
{

*pDst = *pSrc; TransCNT--;
if(源地址自动增 ==true)pSrc++;
if(目标地址自动增==true)pDst++;        
}
}

3. STM32 DMA 内存地址不会设。

stm32手册里有一块是关于外设地址,还有一般全局变量地址以及局部变量地址的介绍,如果使用dma的话,可以把地址尽量往后设,比如 0x40012440,这就已经是离你会用的那些变量的地址很远很远了,不会有冲突。

STM32 DMA 内存地址不会设。

4. STm32的DMA实验问题?

对于硬件uart(串口)来说收到的数据总是放到一个指定的寄存器,对于你这个case来说就是0x40004804这个地址,对于dma每次只能到这个地址来读取数据,所以对于dma源地址来说它是固定不变的。但是dma的目的地址是可以不断增加的。

5. 初学STM32,但是库函数开发里面的很多很多代码都看不懂

看不用的代码可以在网上学习,主要都是c语言的只是,还有一些就是结构体和数据结构一类的程序不好懂。精通C语言是做开发最最基础的能力。

初学STM32,但是库函数开发里面的很多很多代码都看不懂

6. STM32用DMA把数组中的数据依次从内存传到GOIO口输出,如何操作?

触发设置是根据你需求看如何触发
用DMA从内存到GPIO通过M2M模式就可以
其他设置和通用DMA相类似,主要是GPIO的地址需要阅读数据手册确定

7. stm32单片机的core_cm3.h库函数是干什么的啊?

STM32的内核是ARM CORTEX-M3,这个core_cm3.h包含的是一些内核相关的函数和宏定义,例如核内寄存器定义、部分核内外设的地址等等,其对应的是core_cm3.c文件。初学可以不管他,只要把它包含进工程里就行了,这里都是非常底层的函数,上层的一些函数直接调用它们了。如果对CORTEX-M3内核有兴趣或者基础较高,想深入了解这些函数,可以仔细研读一下。。

希望对你有帮助~~

stm32单片机的core_cm3.h库函数是干什么的啊?

8. stm32库函数代码自动生成器 是什么?有什么用?

什么是STM32的DMA?其全称是:Direct Memory Access;根据ST公司提供的相关信息,DMA是STM32中一个独立与Cortex-M3内核的模块,有点类似与ADC、PWM、TIMER等模块;主要功能是通信“桥梁”的作用,可以将所有外设映射的寄存器“连接”起来,这样就可以高速问各寄存器,其传输不受CPU的支配,传输还是双向的。
 
过程:怎样启用DMA?首先,众所周知的是初始化,任何设备启用前都要对其进行初始化,要对模块初始化,还要先了解该模块相应的结构及其函数,以便正确的设置;由于DMA较为复杂,我就只谈谈DMA的基本结构和和常用函数,这些都是ST公司提供在库函数中的。
 
1、 下面代码是一个标准DMA设置,当然实际应用中可根据实际情况进行裁减: DMA_DeInit(DMA_Channel1);
 
上面这句是给DMA配置通道,根据ST提供的资料,STM3210Fx中DMA包含7个通道(CH1~CH7),也就是说可以为外设或memory提供7座“桥梁”
 
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
 
上面语句中的DMA_InitStructure是一个DMA结构体,在库中有声明了,当然使用时就要先定义了;DMA_PeripheralBaseAddr是该结构体中一个数据成员,给DMA一个起始地址,好比是一个buffer起始地址,数据流程是:外设寄存器à DMA_PeripheralBaseAddàmemory中变量空间(或flash中数据空间等),ADC1_DR_Address是我定义的一个地址变量; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;
 
上面这句很显然是DMA要连接在Memory中变量的地址,ADC_ConvertedValue是我自己在memory中定义的一个变量;
 
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
 
上面的这句是设置DMA的传输方向,就如前面我所说的,DMA可以双向传输,也可以单向传输,这里设置的是单向传输,如果需要双向传输:把DMA_DIR_PeripheralSRC改成DMA_DIR_PeripheralDST即可。
 
DMA_InitStructure.DMA_BufferSize = 2;
 
上面的这句是设置DMA在传输时缓冲区的长度,前面有定义过了buffer的起始地址:ADC1_DR_Address ,为了安全性和可靠性,一般需要给buffer定义一个储存片区,这个参数的单位有三种类型:Byte、HalfWord、word,我设置的2个half-word(见下面的设置);32位的MCU中1个half-word占16 bits。
 
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
 
上面的这句是设置DMA的外设递增模式,如果DMA选用的通道(CHx)有多个外设连接,需要使用外设递增模式:DMA_PeripheralInc_Enable;我的例子里DMA只与ADC1建立了联系,所以选用DMA_PeripheralInc_Disable