打印
[应用相关]

STM32F407 定时6更新事件请求DMA,DMA不起作用

[复制链接]
743|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2021-2-8 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  • 我利用基本定时器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传输
  •               }
  •       }
  • }

[color=rgb(51, 102, 153) !important]复制代码
[color=rgb(51, 102, 153) !important]

使用特权

评论回复
沙发
一刀一级| | 2021-2-8 11:24 | 只看该作者
DMA一次只用来传输1个数据就失去DMA使用的价值了:

DMA_InitStruct.DMA_BufferSice=1;

使用特权

评论回复
板凳
duo点| | 2021-2-8 11:24 | 只看该作者
DMA一次只用来传输1个数据就失去DMA使用的价值了:

DMA_InitStruct.DMA_BufferSice=1;

使用特权

评论回复
地板
内政奇才| | 2021-2-8 11:25 | 只看该作者
用循环模式试试
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        // 使用循环模式

使用特权

评论回复
5
香水城| | 2021-2-9 09:57 | 只看该作者
看了下手册,硬件是支持的。

另外 你代码里有这句DMA_Cmd(DMA1_Stream1,DISABLE); 后来有开启吗?

如果开启了,应该是配置方面的问题。 尽可能使用CubeMx进行配置,那样简捷得多。

使用特权

评论回复
6
paotangsan| | 2021-3-2 21:21 | 只看该作者
其他定时器起作用了吗

使用特权

评论回复
7
renzheshengui| | 2021-3-2 21:22 | 只看该作者
硬件应该支持啊

使用特权

评论回复
8
wakayi| | 2021-3-2 21:23 | 只看该作者
是不是没有开启使能啊

使用特权

评论回复
9
wowu| | 2021-3-2 21:24 | 只看该作者
对比一下跟其他定时器的配置有什么不同

使用特权

评论回复
10
xiaoqizi| | 2021-3-2 21:25 | 只看该作者
只能慢慢找问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1482

主题

4260

帖子

6

粉丝