香帮主,用二个DMA通道进行SPI定时传送的程序设置行吗?
目的:定时发送3个16位数据到SPI接口芯片中 思路:开始时禁止SPI的TXE产生DMA请求 定时到后TIMx发生溢出产生DMA请求,由DMA传送新设置值,使将SPI发送缓冲区空后产生DMA请求。然后由SPI的TXE_DMA进行3个16位数传送。 定时器产生溢出的时间间隔tc(20us<=tc<=100ms)由用户设置
具体如下: 3.1 TIM3设置 /* TIM3CLK = 72 MHz, Prescaler = 0, TIM3 counter clock = 72 MHz */ /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 256; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* Enable TIM3 DMA */ TIM_DMACmd(TIM3, TIM_DMA_Update, ENABLE);
/* Enable TIM3 counter */ TIM_Cmd(TIM3, ENABLE); 3.2 TIM3对应的DMA通道设置 TIM3的计数溢出DMA通道是通道3,设置如下: DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)& SPI2 -> CR2; DMA_InitStructure.DMA_MemoryBaseAddr = (u32) Parallel_Data_Buffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 1; 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_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA_Channel3, &DMA_InitStructure);
/* Enable DMA Channel6 */ DMA_Cmd(DMA_Channel3, ENABLE);
3.3 SPI2对应的DMA通道设置 SPI2的发送缓冲器空(TXE)DMA通道为通道5,设置如下: DMA_DeInit(DMA_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)SPI2_DR_Address; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI1_Buffer_Tx; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_Priority = DMA_Priority_Low; DMA_Init(DMA_Channel5, &DMA_InitStructure);
担心程序太长,TIMx、SPI2的初始化设置程序没有贴上。
|
|