OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3275|回复: 5

STM32F205使用定时器8的TIM_DMA_Update 事件循环触发DMA2,实际上DMA仅执行了一次!

[复制链接]

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2012-4-25
在线时间
31 小时
发表于 2019-9-26 11:53:35 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 c67890 于 2019-9-27 10:03 编辑

STM32F205使用定时器8的TIM_DMA_Update 事件循环触发DMA2搬运,从 test_data 每次搬运五个数据到 dest_arr 中。
使用DMA2_Stream1_Channel7 ,在主程序中启动这两个函数,配置DMA和TIM8,然后观察test_data的值变为了0x06030444,
延时一段时间后清零 test_data,定时器可以正常进入中断,但DMA不再起作用, test_data始终是零,不知道问题出在哪,
请各位协助分析一下。

unsigned int dest_arr;
unsigned int test_data[5] = {0x06030440,0x06030441,0x06030442,0x06030443,0x06030444};
/*DMA配置函数*/
void DMA_Auto_Config(void)
{   
        DMA_InitTypeDef DMA_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);         

        DMA_DeInit(DMA2_Stream1);
        while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}                                                        // 等待DMA可配置

        DMA_InitStructure.DMA_Channel                                 = DMA_Channel_7;                                        // 通道选择
        DMA_InitStructure.DMA_PeripheralBaseAddr                 = (uint32_t)(test_data);                                // DMA外设地址(SOURCE ADDR)
        DMA_InitStructure.DMA_Memory0BaseAddr                 = (uint32_t)(&dest_arr);                                // DMA 存储器0地址
        DMA_InitStructure.DMA_DIR                                 = DMA_DIR_MemoryToMemory;                        // 内存到内存

        DMA_InitStructure.DMA_BufferSize                         = 5;                                                                // 数据传输量
        DMA_InitStructure.DMA_PeripheralInc                         = DMA_PeripheralInc_Enable;                        // 外设增量模式
        DMA_InitStructure.DMA_MemoryInc                         = DMA_MemoryInc_Disable;                        // 存储器非增量模式
        DMA_InitStructure.DMA_PeripheralDataSize                 = DMA_PeripheralDataSize_Word;                // 外设数据长度:32位
        DMA_InitStructure.DMA_MemoryDataSize                 = DMA_MemoryDataSize_Word;                        // 存储器数据长度:32位
        DMA_InitStructure.DMA_Mode                                  = DMA_Mode_Normal;                                // 不使用循环模式
        DMA_InitStructure.DMA_Priority                                  = DMA_Priority_High;                                // 优先级
        DMA_InitStructure.DMA_FIFOMode                          = DMA_FIFOMode_Disable;         

        DMA_InitStructure.DMA_FIFOThreshold                 = DMA_FIFOThreshold_Full;
        DMA_InitStructure.DMA_MemoryBurst                         = DMA_MemoryBurst_Single;                        // 存储器突发单次传输
        DMA_InitStructure.DMA_PeripheralBurst                 = DMA_PeripheralBurst_Single;                         // 外设突发单次传输
        DMA_Init(DMA2_Stream1, &DMA_InitStructure);
        
        DMA_Cmd(DMA2_Stream1, ENABLE);

}
/*timer8配置函数*/
void timer8_init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;        
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
        
        TIM_TimeBaseStructure.TIM_Period = 100-1;                                                                                       
        TIM_TimeBaseStructure.TIM_Prescaler = 60000-1;                                                                                
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

        NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;                                                  
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
        NVIC_Init(&NVIC_InitStructure);  
        
        TIM_ClearFlag(TIM8,TIM_FLAG_Update);
        TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);                                                                                                 // 开中断
        TIM8->CR2 |= TIM_CR2_CCDS;

        TIM_DMACmd(TIM8,TIM_DMA_Update,ENABLE);
        TIM_Cmd(TIM8,ENABLE);
}
/*主函数*/
int main(void)
{        
        uart5_init();
        timer8_init();                                                               
        DMA_Auto_Config();                                       
        delay_ms(100);
        test_arr = 0;               
        
        while(1)
        {               
                delay_ms(100);
                printf("dest_arr = 0x%x\n",dest_arr);
        }
        return 0;
}
/*TIM8中断函数*/
void TIM8_UP_TIM13_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM8,TIM_IT_Update)==SET)                                                                  // 溢出中断
        {
                TIM_Cmd(TIM8, DISABLE);
                TIM_ClearITPendingBit(TIM8,TIM_IT_Update);                                                                // 清除中断标志位
                printf("TIMER_8 IRQ IRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQ!\n");
                delay_ms(100);
                TIM_Cmd(TIM8, ENABLE);
        }
}

打印输出结果:(循环输出如下,dest_arr始终为0)

                dest_arr = 0x0
                TIMER_8 IRQ IRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQ!
                TIMER_8 IRQ IRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQ!
                TIMER_8 IRQ IRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQ!
                dest_arr= 0x0
                TIMER_8 IRQ IRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQ!
                TIMER_8 IRQ IRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQ!
                TIMER_8 IRQ IRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQIRQ!
                dest_arr= 0x0


无标题.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-9-27 02:42:19 | 显示全部楼层
回复

使用道具 举报

7

主题

175

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1327
金钱
1327
注册时间
2019-7-11
在线时间
165 小时
发表于 2019-9-27 08:23:56 | 显示全部楼层
DMA_InitStructure.DMA_PeripheralBaseAddr                 = (uint32_t)(test_data);                                // DMA外设地址(SOURCE ADDR)
DMA_InitStructure.DMA_Memory0BaseAddr                 = (uint32_t)(&dest_arr);                                // DMA 存储器0地址
这个test_data不是外设吧
世界和平
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2012-4-25
在线时间
31 小时
 楼主| 发表于 2019-9-27 10:02:02 | 显示全部楼层
本帖最后由 c67890 于 2019-9-27 10:03 编辑
礼拜天真好 发表于 2019-9-27 08:23
DMA_InitStructure.DMA_PeripheralBaseAddr                 = (uint32_t)(test_data);                   ...

感谢回复,使用的是内存到内存的方式,这两个都是内存地址, DMA_InitStructure.DMA_DIR  = DMA_DIR_MemoryToMemory;  
回复

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
122
金钱
122
注册时间
2012-4-25
在线时间
31 小时
 楼主| 发表于 2019-9-27 16:44:12 | 显示全部楼层
有知道的帮忙解决一下。
回复

使用道具 举报

52

主题

160

帖子

0

精华

高级会员

Rank: 4

积分
725
金钱
725
注册时间
2019-6-27
在线时间
153 小时
发表于 2019-9-28 02:49:37 来自手机 | 显示全部楼层
使用的是地址不对吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 14:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表