你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
jsrdczy 提问时间:2019-9-6 15:27 /
  1. 我利用基本定时器6的更新事件触发DMA,然后从内存到外设更新tim6->ARR。问题是DMA没有搬运数据到ARR中。现在的情况是tim6正常产生了更新中断,并且ARR也能手动更新,但是DMA不起作用。

  2. 实在想不明白,新人第一次发帖,希望各位大佬求助。
  3. uint16_t fbuff;
  4. void DMA_CONFIG(vioid)
  5. {
  6.        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  7.        NVIC_IniitTypeDef NVIC_InitStructure;
  8.        DMA_InitTYpeDef DMA_InitStruct;

  9.        uint32_t padr = (uint32_t)&TIM6->ARR;
  10.        uint32_t madr = (uint32_t)&fbuff;

  11.        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
  12.        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);

  13.       TIM_TimeBaseStructure.TIM_Period = 10-1;
  14.       TIM_TimeBaseStructure.TIM_Prescaler = 8400 -1;
  15.       TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  16.       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  17.       TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);
  18.       TIM_DMACmd(TIM6,TIM_DMA_Update,ENABLE);
  19.       TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//打开更新DMA请求

  20.       NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
  21.       NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8;
  22.       NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  23.       NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  24.       NVIC_Init(&NVIC_InitStructure);

  25.       DMA_DeInit(DMA1_Stream1);
  26.       DMA_Cmd(DMA1_Stream1,DISABLE);
  27.       DMA_InitStruct.DMA_Channel = 7;
  28.       DMA_InitStruct.DMA_PeripheralBaseAddr = padr;
  29.       DMA_InitStruct.DMA_Memory0BaseAddr = madr;
  30.       DMA_InitStruct.DMA_DIR = DMA_DIR_MemoryToPeripherl;
  31.       DMA_InitStruct.DMA_BufferSize = 1;
  32.       DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  33.       DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Disable;
  34.       DMA_InitStruct.DMA_PeripheralDataSize =  DMA_PeripheralDataSize_HalfWord;
  35.       DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  36.       DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
  37.       DMA_InitStruct.DMA_Priority = DMA_Priority_VeryHigh;
  38.       DMA_InitStruct.DMA_FIFOMode = DMA_FIFOMode_Disable;
  39.       DMA_InitStruct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  40.       DMA_InitStruct.DMA_MemoryBurst =DMA_MemoryBurst_Single;
  41.       DMA_InitStruct.DMA_PeripheralBurst =DMA_PeripheralBurst_Single;
  42.       DMA_Init(DMA1_Stream1,&DMA_InitStruct);
  43.       TIM_Cmd(TIM6,ENABLE);

  44. }
  45. void TIME6_IRQHandler(void)
  46. {
  47.         if(TIM_GetITStatus(TIM6,TIM_IT_Update) !=RESET)
  48.            TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
  49. }

  50. void main(void)
  51. {
  52.         u16 input;

  53.         DMA_CONFIG();
  54.       while(1)
  55. {
  56.                fbuff = 10 + input; //input为外部可控输入

  57.                if(Key_Scan(0) == 1)
  58.               {
  59.                        DMA1_Stream1->CR &= 0xFFFFFFFE;
  60.                        DMA1_Stream1->NDTR = 1;
  61.                        DMA1_Stream1->CR |=0x00000001;//进行一次DMA传输
  62.               }
  63.       }
  64. }
复制代码


收藏 评论6 发布时间:2019-9-6 15:27

举报

6个回答
wenyangzeng 回答时间:2019-9-6 15:58:44
DMA一次只用来传输1个数据就失去DMA使用的价值了:

DMA_InitStruct.DMA_BufferSice=1;
jsrdczy 回答时间:2019-9-6 16:07:10
wenyangzeng 发表于 2019-9-6 15:58
DMA一次只用来传输1个数据就失去DMA使用的价值了:

DMA_InitStruct.DMA_BufferSice=1; ...

我本来是要连续修改,先拿一个的测试下的,结果发现不行。开始我这里填的4。
wenyangzeng 回答时间:2019-9-6 16:12:55
jsrdczy 发表于 2019-9-6 16:07
我本来是要连续修改,先拿一个的测试下的,结果发现不行。开始我这里填的4。 ...

ST官方有DEMO可以参考:
TIM_DMABurst.rar (15.18 KB, 下载次数: 15)
jsrdczy 回答时间:2019-9-6 16:31:10
wenyangzeng 发表于 2019-9-6 16:12
ST官方有DEMO可以参考:

谢谢,我仔细研究下看看
哀歌与世无争 回答时间:2019-9-6 16:51:46
用循环模式试试
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;        // 使用循环模式
jsrdczy 回答时间:2019-9-9 10:24:48
目前看到的例程都是拿TIM1 , 3来作为DMA的访问对象的,TIM6貌似不能访问,容我做个测试看看相同的代码对TIm3和TIm6是不是一样的再来
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版