|
#define TIM1_CCR1_Address 0x40012C34
#define DMA_Channel_TIM1_CCR1 DMA1_Channel2
#define DMA_Channel_TIM1_CCR4 DMA1_Channel4
uint16_t hBuff[4] = {50,600,600,50} ;
DMA的配置↓
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* DMA1 channel1 configuration ----------------------------------------------*/
DMA_DeInit(DMA_Channel_TIM1_CCR1);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DMA_Channel_TIM1_CCR1;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)hBuff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 4;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA_Channel_TIM1_CCR1, &DMA_InitStructure);
/* Enable DMA1 channel1 */
DMA_Cmd(DMA_Channel_TIM1_CCR1, ENABLE);
TIM基本配置不粘在这了,关键地方的配置↓
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; // 触发模式
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //使能通道1
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable); // 失能这个目的就是为了触发下一个波形
TIM_DMAConfig(TIM1, TIM_DMABase_CCR1, TIM_DMABurstLength_4Bytes);
// Enable DMA event
TIM_GenerateEvent(TIM1,TIM_EventSource_Update);
TIM_DMACmd(TIM1, TIM_DMA_CC1, ENABLE);
TIM_DMACmd(TIM1, TIM_DMA_CC1,ENABLE);
TIM_UpdateRequestConfig(TIM1,TIM_UpdateSource_Global);
-------------------------------我是分割线-----------------------------------------------
以上代码目的是为了实现 TIM-CNT 与CCRx 发送比较事件的时候 触发 DMA的传送更新CCRx的值 ,关键的地方就是这个, (是比较事件触发DMA,不是更新事件触发DMA) ←我的理想状态
实际情况是,没有DMA的传输。
-------------------------------我是分割线-----------------------------------------------
上面的目的用数字表示下。。 比如我设置的TIM->ARR是 1000 , TIM->CCR1 初始值是200 , 当TIM-CNT 计数到200的时候,触发一次DMA传送,把我设定好的值送到TIM->CCR1,这样更新了TIM->CCR1,比如这个时候CCR1就变为400了,TIM->CNT不会被清零,它继续加,CNT加到400的时候,再一次触发了DMA |
|