|
100汤圆
本帖最后由 zjr0411 于 2022-7-22 04:11 编辑
在一个大神逆变器的程序里DMA的通道使用不怎么了解,请懂的帮我解答一下:大神的逆变器帖子在这:https://www.amobbs.com/thread-5545884-1-1.html
1、程序使用tim1的通道1和2输出带死区的pwm驱动H桥做逆变功能,
既然使用了tim1的通道1和2,那芯片手册上写的tim1的通道1和2分别对应了DMA1的2和3通道呀,结果程序里使用了DMA1的通道5,他的通道5是用了手册上写的哪个功能呢?手册如下图:
2、下面程序里#define TIM1_DMAR_Address 0x40012C4C里这个地址是怎么得出的呢?程序如下:
只上传了这个单独文件和函数,要整个工程的请到原帖下载。
#define TIM1_DMAR_Address 0x40012C4C
void Time1Config(void)
{
// INT32U j=0,K=(u32)&dmabuff;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
TIM_BDTRInitTypeDef TIM_BDTR_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1|RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB,ENABLE);
//GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);
TIM_DeInit(TIM1);
TIM_TimeBaseStructure.TIM_Period = Fsys / Fpwm; //重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = 0; //TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM中央对齐模式1计数模式
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分割
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = ((Fsys / Fpwm) * 50) / 100;
TIM_OC1Init(TIM1,&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = ((Fsys / Fpwm) * 50) / 100;
TIM_OC2Init(TIM1,&TIM_OCInitStructure);
TIM_BDTR_InitStructure.TIM_OSSRState = TIM_OSSRState_Disable;
TIM_BDTR_InitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
TIM_BDTR_InitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
TIM_BDTR_InitStructure.TIM_DeadTime = 0x15;
TIM_BDTR_InitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTR_InitStructure.TIM_BreakPolarity =TIM_BreakPolarity_High;
TIM_BDTRConfig(TIM1,&TIM_BDTR_InitStructure);
TIM_ARRPreloadConfig(TIM1, ENABLE);//ARR预装载缓冲器
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_Cmd(TIM1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //SD
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);//置低
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
TIM_DMAConfig(TIM1, TIM_DMABase_CCR2, TIM_DMABurstLength_1Byte );
TIM_DMACmd(TIM1,TIM_DMA_Update,ENABLE);
DMA_DeInit(DMA1_Channel5); //初始化DMA1 第五通道
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(TIM1_DMAR_Address) ;
DMA_InitStructure.DMA_MemoryBaseAddr =(uint32_t)dmabuff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //外设作为目的地
DMA_InitStructure.DMA_BufferSize = 250;
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_Mode_Normal;//
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
DMA_Cmd(DMA1_Channel5, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; //DMA通道1中断允许
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); //开传输完成中断
}
|
附件: 您需要 登录 才可以下载或查看,没有帐号?注册
最佳答案
查看完整内容
见这一行:
代码使能的DMA请求是TIM1_UP,所以对应的CH5。
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果天空是黑暗的,那就摸黑生存;
如果发出声音是危险的,那就保持沉默;
如果自觉无力发光,那就蜷伏于牆角。
但是,不要习惯了黑暗就为黑暗辩护;
也不要为自己的苟且而得意;
不要嘲讽那些比自己更勇敢的人。
我们可以卑微如尘土,但不可扭曲如蛆虫。
|