中级会员
 
- 积分
- 402
- 金钱
- 402
- 注册时间
- 2020-5-8
- 在线时间
- 153 小时
|
1金钱
本帖最后由 新洲罗远 于 2020-8-10 22:13 编辑
这几天改进STM32F103C8驱动VGA
想用DMA写8位数据到PA口,
控制流程是 TIM3通道4-->DMA1_Channel3。运行结果是TIM3通道4工作(PB1有输出)但DMA没有工作(PA0-7无输出)
贴上有关程序大家看看 ,哪里错了?
void DMA_Configuration(void)
{
DMA_InitTypeDef D;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef nvic;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/////////////////////////////////////////////////////////////
////////////////数据输出口 /////////////////////////////////////////////////
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//端口使能
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//端口设置
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOB, &GPIO_InitStructure);
///////////////////////////////////////////////////////////////
//定时器设置
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 2; //2 定时器 计数 次,为一个定时周期
TIM_TimeBaseStructure.TIM_Prescaler =4; //4设置预分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分频系数:不分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
//TIM_TimeBaseStructure.TIM_RepetitionCounter = 2;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
//PWM通道4模式设置
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse =2;//2
//设置跳变值,当计数器计数到这个值时,电平发生跳变
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//当定时器计数值小于CCR1_Val时为高电平
TIM_OC4Init(TIM3, &TIM_OCInitStructure); //使能通道4
///////////////////////////////////////////////////////////////
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
DMA_DeInit(DMA1_Channel3);//将DMA的通道1寄存器重设为缺省值
D.DMA_PeripheralBaseAddr = (uint32_t)&GPIOA->ODR; //DMA外设ADC基地址
D.DMA_MemoryBaseAddr = (u32) &fb[0][0]; //DMA内存基地址
D.DMA_DIR = DMA_DIR_PeripheralDST;//数据传输方向,从内存读取发送到外设
D.DMA_BufferSize = VTOTAL; //DMA通道的DMA缓存的大小 //=52
D.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址寄存器不变
D.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
D.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//数据宽度为8位
D.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//数据宽度为8位
D.DMA_Mode = DMA_Mode_Normal;//工作在正常缓存模式D.DMA_Mode =DMA_Mode_Circular; //工作在循环模式
D.DMA_Priority = DMA_Priority_Low;//DMA通道 x拥有中优先级
D.DMA_M2M = DMA_M2M_Disable;//DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel3, &D);
nvic.NVIC_IRQChannel = DMA1_Channel3_IRQn;
nvic.NVIC_IRQChannelPreemptionPriority = 0;
nvic.NVIC_IRQChannelSubPriority = 0;
nvic.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvic);
DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);//DMA完成中断
DMA_Cmd(DMA1_Channel3, ENABLE); //DMA1_3使能
TIM_DMACmd(TIM3, TIM_DMA_Update, ENABLE);
//TIM3 DMA请求使能,注:TIM3_Update请求对应DMA通道为DMA1_chanel3
TIM_Cmd(TIM3, ENABLE); //TIM3使能
}
__irq void TIM1_CC_IRQHandler(void)
{
u32 vt;
if (vflag)
{
DMA1_Channel3->CNDTR = VTOTAL; //=52
DMA1_Channel3->CCR |= 0x01; //开启DMA1通道3
}
TIM1->SR = 0xFFFB; //~TIM_IT_CC2; // 清TIM1中断标志位
//TIM_ClearITPendingBit(TIM1,TIM_IT_CC2); // 清TIM1中断标志位
}
|
|