[STM32F103RB][C] - DMA, PWM-Periode kann nicht geändert werden

Hallo, ich möchte die PWM-Periode mit DMA ändern. Ich habe Code geschrieben, aber ich weiß nicht, warum LED mit konstanter Zeit BLINKT

#include "stm32f10x.h"
#include "stm32f1xx_nucleo.h"
#include "stm32f10x.h"

int i =0;
u16 PWM_Buf[198];

void TIMInit(void);
void GPIOInit(void);
void DMAInit(void);
void PWMInit(void);

int main(void)
{
 GPIOInit();
 TIMInit();
 DMAInit();
 PWMInit();

 for(i = 0;i<198;i++)
 {
  PWM_Buf[i] = i * 10; // <-------- VALUE OF TIM PERIOD
 }


    while(1)
    {
    }
}
void TIMInit(void)
{
 TIM_TimeBaseInitTypeDef TIMInit;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

    TIMInit.TIM_Period = 1000;
    TIMInit.TIM_Prescaler = 64000;

    TIMInit.TIM_ClockDivision = TIM_CKD_DIV1;
    TIMInit.TIM_CounterMode = TIM_CounterMode_Up;

    TIMInit.TIM_RepetitionCounter = 200;

    TIM_TimeBaseInit(TIM1, &TIMInit);
}

void GPIOInit(void)
{
  GPIO_InitTypeDef GPIOInit;

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

   GPIOInit.GPIO_Pin = GPIO_Pin_8;
   GPIOInit.GPIO_Mode = GPIO_Mode_AF_PP;
   GPIOInit.GPIO_Speed = GPIO_Speed_50MHz;

   GPIO_Init(GPIOA, &GPIOInit);
}

void DMAInit(void)
{
 #define TIM1_ARR_Address 0X40012C2C

 DMA_InitTypeDef DMAInit;

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
 DMA_DeInit(DMA1_Channel5);
 DMAInit.DMA_PeripheralBaseAddr = (u16)TIM1_ARR_Address;
 DMAInit.DMA_MemoryBaseAddr = (u32)PWM_Buf;
 DMAInit.DMA_DIR = DMA_DIR_PeripheralDST;
 DMAInit.DMA_BufferSize = 198;
 DMAInit.DMA_PeripheralInc = DMA_PeripheralInc_Enable;
 DMAInit.DMA_MemoryInc = DMA_MemoryInc_Enable;
 DMAInit.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
 DMAInit.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
 DMAInit.DMA_Mode = DMA_Mode_Circular;
 DMAInit.DMA_Priority = DMA_Priority_High;
 DMAInit.DMA_M2M = DMA_M2M_Disable;

 DMA_Init(DMA1_Channel5, &DMAInit);

    DMA_Cmd(DMA1_Channel5, ENABLE);
}

void PWMInit(void)
{
 TIM_OCInitTypeDef  PWMInit;

    PWMInit.TIM_OCMode = TIM_OCMode_PWM1;
    PWMInit.TIM_OutputState = TIM_OutputState_Enable;
    PWMInit.TIM_Pulse = 500;
    PWMInit.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM1, &PWMInit);
    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    TIM_ARRPreloadConfig(TIM1, ENABLE);
    TIM_DMACmd(TIM1, TIM_DMA_Update, ENABLE);
    TIM_Cmd(TIM1, ENABLE);
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
Vielen Dank für die Bereitstellung des vollständigen Quellcodes zusammen mit der Frage.
Es ist kein vollständiger Code, ich habe die USart-Kommunikation und den Motortreiber geschnitten. Ich füge nur die DMA-TIMER- UND PWM-Konfiguration ein. Ich dachte, ich hätte guten Code geschrieben, aber ich weiß nicht, warum die Periode nicht anders ist. Ich brauche nur Hilfe dafür.
Sind Sie sicher, dass das richtig ist? DMAInit.DMA_PeripheralInc = DMA_PeripheralInc_Enable;Will das wirklich auf inc gesetzt werden? Ich vermute, dass dies mindestens ein Problem ist, das Sie haben und das es sein möchte DMA_PeripheralInc_Disable. Ich finde.
Es ist wahrscheinlich kein Problem, dass ich dies und dasselbe deaktiviert habe. Ich sehe nichts falsch. Ich dachte, jemand könnte ein Problem erwischt haben
Sie müssen @DiBosco eingeben, damit ich Ihre Antwort sehen kann. Als ich dies vor vielen Jahren tat, um PWMs zu erstellen, war das CPAR-Register meines DMA auf das CCR eingestellt, nicht auf das ARR-Register, das Sie meiner Meinung nach hier verwendet haben.

Antworten (1)

DMAInit.DMA_PeripheralBaseAddr = (u16)TIM1_ARR_Address;  

Sie können einen Zeiger nicht als vorzeichenloses 16-Bit umwandeln. Zeiger sind auf dieser Plattform 32 Bit.
So: (uint32_t)&TIM1->ARR.

DMAInit.DMA_PeripheralInc = DMA_PeripheralInc_Enable;

Sie können die Peripherieadresse nicht erhöhen, der nächste Zyklus wäre TIMx_RCR, dann TIMx_CCR1 usw.

Ich hatte ihn bereits auf die Peripherie-Inc-Sache hingewiesen, und er hatte gesagt, das hätte keinen Unterschied gemacht. Die Pointer-Sache ist jedoch ein guter Punkt.
Ich weiß, es ist dumm, aber kann ich darum bitten, dass der Code korrigiert wird, weil ich keine Ahnung habe, wie ich das machen soll. Ich wäre sehr dankbar
Ich frage mich, wie Sie diesen Code geschrieben haben, wenn Sie keine Ahnung haben, was Sie ändern sollen, oder sich zumindest artikulieren, um zu fragen, was Sie ändern sollen !!?
@MemberCicada warum hast du PeripheralDataSize als Wort und MemoryDataSize als halbes Wort konfiguriert?
@charansai der Timer ist 16 Bit und Halbwortzugriff ist möglich.