新手入门
- 积分
- 8
- 金钱
- 8
- 注册时间
- 2021-12-3
- 在线时间
- 6 小时
|
1金钱
代码如下:
利用TIM1的更新事件触发DMA传输,连续修改定时器里的寄存器,但是目前无法更新定时器中相对应的寄存器。
求大神指导一二。
void TIM1_Master_Init(u32 Fre)
{
NVIC_InitTypeDef NVIC_InitStruct;
GPIO_InitTypeDef GPIO_InitStruct;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_OCInitTypeDef TIM_OCInitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开 GPIOA 和 TIM1 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //打开DMA1 时钟
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //TIM1-CH2
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
TIM_TimeBaseInitStruct.TIM_Period = (1000000 / Fre) - 1; //重装载值
TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1; //分频系数
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_Pulse = (1000000 / Fre) / 2 - 1; //设置占空比,设置CCR
TIM_OC2Init(TIM1,&TIM_OCInitStruct);
TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable); //设置为主定时器
TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update); //更新事件被 选为 TGRO
TIM_ARRPreloadConfig(TIM1, ENABLE);
TIM_DMAConfig(TIM1, TIM_DMABase_ARR, TIM_DMABurstLength_4Transfers); //ARR、RCR、CCR1、CCR2
TIM1_DMA_Init(); //初始化DMA
TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE); //开启更新事件 开启DMA
}
void TIM1_DMA_Init(void)
{
DMA_InitTypeDef DMA_InitStruct;
DMA_DeInit(DMA1_Channel5); //复位DMA通道
DMA_InitStruct.DMA_PeripheralBaseAddr = TIM1->DMAR;
DMA_InitStruct.DMA_MemoryBaseAddr = (u32)TIM1DataBuf;
DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST; //内存到外设
DMA_InitStruct.DMA_BufferSize = 4;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不增加
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 16 bit
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //16 bit
DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;
DMA_InitStruct.DMA_M2M = DMA_M2M_Disable; //非内存到内存之间的传输
DMA_Init(DMA1_Channel5,&DMA_InitStruct);
DMA_Cmd(DMA1_Channel5, ENABLE); //开启DMA1_Channel5
}
|
|