搜索
bottom↓
回复: 1

STM32 TIM DMA Burst使用遇到问题【已解决】

[复制链接]

出10入18汤圆

发表于 2021-4-27 11:57:46 | 显示全部楼层 |阅读模式
本帖最后由 wpy 于 2021-4-27 14:34 编辑

单片机是STM32F103RCT6。代码目的是使用定时器的Update时间触发DMA传输,同时更新CCR1、CCR2、CCR3、CCR4。现在程序能够更新这几个寄存器,但是CCR1、CCR2、CCR3、CCR4数值结果看起来是错乱的。按设计应该是CCR1=360、CCR2=720、CCR3=1080、CCR4=1440.

void tim_config()
{
        uint32_t address = 0;
        uint16_t i =0;
        for(i=0;i<80;i++)
        {
                uint16_t v = 0;
                v = (i%4)*10;
                dmaCCBuf = 36*(v+10);
        }
       
        LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);

        address = TIM1_DMAR_ADDRESS;
        LL_DMA_ConfigAddresses(DMA1, LL_DMA_CHANNEL_5, (uint32_t)dmaCCBuf, address, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
        LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_5, LL_DMA_DIRECTION_MEMORY_TO_PERIPH);
        LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, 4);
        LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MEMORY_INCREMENT);
        LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PERIPH_NOINCREMENT);
        LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MODE_NORMAL);//
        LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PRIORITY_VERYHIGH);
        LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_PDATAALIGN_HALFWORD);
        LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_5, LL_DMA_MDATAALIGN_HALFWORD);
       
        LL_TIM_ConfigDMABurst(TIM1, LL_TIM_DMABURST_BASEADDR_CCR1, LL_TIM_DMABURST_LENGTH_4TRANSFERS);
       
        LL_TIM_EnableDMAReq_UPDATE(TIM1);
        LL_TIM_EnableIT_UPDATE(TIM1);
       
               
        LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH1);
        LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH2);
        LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH3);
        LL_TIM_CC_EnableChannel(TIM1, LL_TIM_CHANNEL_CH4);
        LL_TIM_SetTriggerOutput(TIM1, LL_TIM_TRGO_OC4REF);
       
        LL_TIM_EnableARRPreload(TIM1);
       
        LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_5);
        LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
       
        NVIC_SetPriority(DMA1_Channel5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));
        NVIC_EnableIRQ(DMA1_Channel5_IRQn);
       
        LL_TIM_EnableCounter(TIM1);       
}

/* USER CODE BEGIN 1 */
void DMA1_Channel5_IRQHandler(void)
{
        LL_GPIO_SetOutputPin(GPIOC, LL_GPIO_PIN_12);
        LL_GPIO_ResetOutputPin(GPIOC, LL_GPIO_PIN_12);
        if(LL_DMA_IsActiveFlag_TC5(DMA1))
        {         
                LL_DMA_ClearFlag_TC5(DMA1);
                LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_5);
                LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, 4);
                LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
                sFlag = 1;
        }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出10入18汤圆

 楼主| 发表于 2021-4-27 13:41:52 | 显示全部楼层
问题解决了:我的代码没问题,直接运行程序就好了,Debug影响到了DMA Burst。
ST社区的回复蛮快的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 21:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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