新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2019-5-16
- 在线时间
- 4 小时
|
5金钱
我利用基本定时器6的更新触发DMA,然后从内存到外设更新tim6->ARR。问题时DMA没有搬运数据到ARR中。现在的情况时tim6正常产生了更新时间,并且ARR也能手动更新,但是就是DMA不起作用。
实在想不明白,各位大佬求助。
代码如下
uint16_t fbuff;
void DMA_CONFIG(vioid)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_IniitTypeDef NVIC_InitStructure;
DMA_InitTYpeDef DMA_InitStruct;
uint32_t padr = (uint32_t)&TIM6->ARR;
uint32_t madr = (uint32_t)&fbuff;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);
TIM_TimeBaseStructure.TIM_Period = 10-1;
TIM_TimeBaseStructure.TIM_Prescaler = 8400 -1;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
TIM_DMACmd(TIM6,TIM_DMA_Update,ENABLE);
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//打开更新DMA请求
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_DeInit(DMA1_Stream1);
DMA_Cmd(DMA1_Stream1,DISABLE);
DMA_InitStruct.DMA_Channel = 7;
DMA_InitStruct.DMA_PeripheralBaseAddr = padr;
DMA_InitStruct.DMA_Memory0BaseAddr = madr;
DMA_InitStruct.DMA_DIR = DMA_DIR_MemoryToPeripherl;
DMA_InitStruct.DMA_BufferSize = 1;
DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
DMA_InitStruct.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStruct.DMA_MemoryBurst =DMA_MemoryBurst_Single;
DMA_InitStruct.DMA_PeripheralBurst =DMA_PeripheralBurst_Single;
DMA_Init(DMA1_Stream1,&DMA_InitStruct);
TIM_Cmd(TIM6,ENABLE);
}
void TIME6_IRQHandler(void)
{
if(TIM_GetITStatus(TIM6,TIM_IT_Update) !=RESET)
TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
}
void main(void)
{
u16 input;
DMA_CONFIG();
while(1)
{
fbuff = 10 + input; //input为外部可控输入
if(Key_Scan(0) == 1)
{
DMA1_Stream1->CR &= 0xFFFFFFFE;
DMA1_Stream1->NDTR = 1;
DMA1_Stream1->CR |=0x00000001;//进行一次DMA传输
}
}
}
|
最佳答案
查看完整内容[请看2#楼]
你参考这个帖子看看:http://www.openedv.com/forum.php?mod=viewthread&tid=281340&extra=
|