OpenEdv-开源电子网

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

求助! STM32F103利用 DMA连续修改定时器的寄存器,但怎么调试都无法更改到相对应寄存器的值,求大神指导一下。

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2021-12-3
在线时间
6 小时
发表于 2021-12-8 17:19:49 | 显示全部楼层 |阅读模式
1金钱
代码如下:
利用TIM1的更新事件触发DMA传输,连续修改定时器里的寄存器,但是目前无法更新定时器中相对应的寄存器。
求大神指导一二。

void TIM1_Master_Init(u32 Fre)
{
        NVIC_InitTypeDef         NVIC_InitStruct;
        GPIO_InitTypeDef                 GPIO_InitStruct;
        TIM_TimeBaseInitTypeDef        TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef        TIM_OCInitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //打开 GPIOA 和 TIM1 时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //打开DMA1 时钟
       
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;        //TIM1-CH2
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStruct);
       
       
        TIM_TimeBaseInitStruct.TIM_Period = (1000000 / Fre) - 1;                //重装载值
        TIM_TimeBaseInitStruct.TIM_Prescaler = 72 - 1;        //分频系数
       
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;        //时钟分割
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;        //向上计数
        TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
       
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_Pulse = (1000000 / Fre) / 2 - 1;                //设置占空比,设置CCR
        TIM_OC2Init(TIM1,&TIM_OCInitStruct);
       
        TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);        //设置为主定时器
        TIM_SelectOutputTrigger(TIM1,TIM_TRGOSource_Update);        //更新事件被 选为 TGRO
       
        TIM_ARRPreloadConfig(TIM1, ENABLE);
       


        TIM_DMAConfig(TIM1, TIM_DMABase_ARR, TIM_DMABurstLength_4Transfers);        //ARR、RCR、CCR1、CCR2
       
        TIM1_DMA_Init();        //初始化DMA
       
        TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);        //开启更新事件 开启DMA
}




void TIM1_DMA_Init(void)
{
        DMA_InitTypeDef        DMA_InitStruct;
       
       
        DMA_DeInit(DMA1_Channel5);        //复位DMA通道
       
        DMA_InitStruct.DMA_PeripheralBaseAddr = TIM1->DMAR;
        DMA_InitStruct.DMA_MemoryBaseAddr = (u32)TIM1DataBuf;
        DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralDST;                //内存到外设
        DMA_InitStruct.DMA_BufferSize = 4;
        DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址不增加
        DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
        DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;        // 16 bit
        DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //16 bit
        DMA_InitStruct.DMA_Mode = DMA_Mode_Normal;
        DMA_InitStruct.DMA_Priority = DMA_Priority_Medium;
        DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;        //非内存到内存之间的传输
        DMA_Init(DMA1_Channel5,&DMA_InitStruct);       
       
        DMA_Cmd(DMA1_Channel5, ENABLE);        //开启DMA1_Channel5
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2021-12-9 09:57:01 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 22:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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