问题与主题一样简单。如何在STM32中延迟确切的一个时钟周期?如果控制器以168MHz运行,则一个时钟周期等于1 / 168MHz,即5.95ns吗?
我正在尝试使用DMA将数据发送到SPI1.然后SPI1将控制DAC以进行电压更新.
使用的芯片是STM32F407.因此,相应的频道/流是:channel3/stream5,如参考手册中所示.但是,当DMA使能时,SPI1-> DR中不显示任何数据,示波器中没有显示结果.
当SPI1-> DR由软件写入时,SPI工作正常.谁能帮忙看看发生了什么?代码如下:
uint16_t DACData[1];
void InitDMA(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_Cmd(DMA2_Stream2, DISABLE);
while (DMA2_Stream2->CR & DMA_SxCR_EN);
//SPI1 Tx DMA
DMA_DeInit(DMA2_Stream5);
DMA_StructInit(&DMA_InitStructure);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); //Init DMA clock
DMA_InitStructure.DMA_Channel = DMA_Channel_3;//SPI1 Tx
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(SPI1->DR); //Set the SPI1 Tx
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&DACData; //Set the memory location
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; //
DMA_InitStructure.DMA_BufferSize = 1; //Define the number of bytes to send
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //Normal mode (not circular)
DMA_InitStructure.DMA_Priority …Run Code Online (Sandbox Code Playgroud) 我有一个有五种状态的FSM(s1,s2,s3,s4,s5).
但是,对于每个州,应该进行一系列操作.例如,在s2中,计数器应从1到10计数.
我的问题出现了:FSM怎么知道"我应该从s2改为s3"?或者以另一种方式说话,s2如何通知FSM"我已经完成",并且应该根据LookUpTable启动新状态?
stm32F4系列的DMA有一些高级功能,我可以在这里要求澄清吗?
并发流:两个流可以同时传输数据吗?由于允许一个字节传输.如果总线宽度为32位,则可以进行4次并发传输.顺便说一下,STM32的AHB总线宽度是多少?
FIFO模式:如果无法进行并发传输,我猜这里可以使用FIFO.FIFO将有助于将数据从低速外设等待到DMA而不占用AHB总线.当准备好一定数量的数据时,数据块将一起发送到内存.我的理解是否正确?
四字深度每个流32个先进先出存储缓冲器(FIFO)
那是什么意思?FIFO中可以存储多少数据?4或4*32?
突发模式:实际突发模式有什么作用?它在数据表中说可以传输65535个数据.65535与突发模式之间有什么关系?
双缓冲模式:
双缓冲区类型事务:使用两个
内存指针进行内存的双缓冲区传输(当DMA
从/向缓冲区读/写时,应用程序可以向/从另一个
缓冲区写入/读取).-----来自STM32F4的参考手册
我的问题是:在DMA传输期间,AHB总线不适用于Cortex M4,应用程序如何从其他缓冲区读取?