[STM32F103RB][C] - DMA, no se puede cambiar el período de PWM

Hola, me gustaría cambiar el período PWM con DMA. Escribí el código pero no sé por qué el LED PARPADEA con tiempo constante

#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);
}
Gracias por proporcionar el código fuente completo junto con la pregunta.
No es el código completo, corté la comunicación de usart y el controlador del motor. Solo pego la configuración DMA TIMER Y PWM. Pensé que escribí un buen código, pero no sé por qué el período no es diferente. Solo necesito ayuda para ello.
¿Estas seguro que esto es correcto? DMAInit.DMA_PeripheralInc = DMA_PeripheralInc_Enable;¿Esto realmente quiere establecerse en inc? Sospecho que este es al menos un problema que tiene y quiere serlo DMA_PeripheralInc_Disable. Creo.
Probablemente no sea un problema, deshabilité esto y lo mismo. No veo nada malo. Pensé que alguien tal vez detectó el problema
Tienes que poner @DiBosco para que yo vea tu respuesta. Cuando hice esto para crear PWM hace muchos años, el registro CPAR de mi DMA se configuró en CCR, no en el registro ARR que creo que ha utilizado aquí.

Respuestas (1)

DMAInit.DMA_PeripheralBaseAddr = (u16)TIM1_ARR_Address;  

No puede emitir un puntero como un bit de 16 sin firmar. Los punteros son de 32 bits en esta plataforma.
Así: (uint32_t)&TIM1->ARR.

DMAInit.DMA_PeripheralInc = DMA_PeripheralInc_Enable;

No puede incrementar la dirección del periférico, el siguiente ciclo sería TIMx_RCR, luego TIMx_CCR1, etc.

Ya le había señalado lo de la tecnología de periféricos y él dijo que eso no suponía ninguna diferencia. Sin embargo, lo del puntero es un buen punto.
Sé que es estúpido, pero ¿puedo pedir que se corrija el código porque no tengo idea de cómo hacerlo? Estaría muy agradecido
Me pregunto cómo escribió este código si no tiene idea de qué cambiar o al menos articularse para preguntar qué cambiar.
@MemberCicada ¿por qué configuró PeripheralDataSize como palabra y MemoryDataSize como media palabra?
@charansai el temporizador es de 16 bits y es posible el acceso a media palabra.