STSPIN32f0 - ¿Alguien tiene experiencia?

0

Estoy intentando escribir un firmware personalizado para STSPIN32f0 y estoy atascado desesperadamente < br> STSPIN32f0 es un sistema en paquete basado en STM32F031C6. Mi código funciona bien en STM32F031C6. Mi código falla miserablemente tanto en mi placa personalizada como en STEVAL-SPIN3201 . Lo que estoy tratando de lograr es bastante simple: configuro TIM1 en modo 6-PWM. En STM32F031C6 puedo ver 6 señales exactamente como se esperaba, en STSPIN32f0 no puedo ver nada.

¿Alguien tiene experiencia con STSPIN32f0 por favor? ¿Puede alguien por favor darme alguna pista (s)? ¿Alguien puede por favor compartir sus ejemplos de código de trabajo?

Este es mi código:

//

int main(void)
{
    //

    RCC->AHBENR |= RCC_AHBENR_GPIOAEN |                 // enable clock for GPIOA
                   RCC_AHBENR_GPIOBEN;                  // enable clock for GPIOB

    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;                 // enable timer 2
    RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;                 // enable timer 1

    TIM1->ARR = 0xA0;                                   // tim1 period

    // over-current config (pin A-11)

    GPIOA->MODER |= (0x01 << GPIO_MODER_MODER11_Pos);       // output
    GPIOA->OSPEEDR |= (0x01 << GPIO_OSPEEDR_OSPEEDR11_Pos); // medium speed
    GPIOA->PUPDR |= (0x01 << GPIO_PUPDR_PUPDR11_Pos);       // pull-up
    GPIOA->ODR &= ~(1 << 11);                               // set zero

    //

    TIM1->CCMR1 |= TIM_CCMR1_OC1PE |                    // Output compare on channel 1 preload enable (for pin B-13, low-side 1)
                   (0x06 << TIM_CCMR1_OC1M_Pos) |       // Output compare on channel 1 mode = 110 (PWM mode 1)
                   TIM_CCMR1_OC2PE |                    // Output compare on channel 2 preload enable (for pin B-14, low-side 2)
                   (0x06 << TIM_CCMR1_OC2M_Pos);        // Output compare on channel 2 mode = 110 (PWM mode 1)

    TIM1->CCMR2 |= TIM_CCMR2_OC3PE |                    // Output compare channel 3 preload enable (for pin A-10, high-side and pin B-15, low-side)
                   (0x06 << TIM_CCMR2_OC3M_Pos);        // Output compare 3 mode = 110 (PWM mode 1)

    GPIOA->MODER |= (0x02 << GPIO_MODER_MODER8_Pos) |   // alternative function for pin A-8 (pwm channel 1, positive)
                    (0x02 << GPIO_MODER_MODER9_Pos) |   // alternative function for pin A-9 (pwm channel 2, positive)
                    (0x02 << GPIO_MODER_MODER10_Pos);   // alternative function for pin A-10 (pwm channel 3, positive)

    GPIOB->MODER |= (0x02 << GPIO_MODER_MODER13_Pos) |  // alternate function for pin B-13 (PWM channel 1, negative)
                    (0x02 << GPIO_MODER_MODER14_Pos) |  // alternate function for pin B-14 (PWM channel 2, negative)
                    (0x02 << GPIO_MODER_MODER15_Pos);   // alternate function for pin B-15 (PWM channel 3, negative)

    GPIOA->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR8 |           // high speed for pin A-8 (pwm channel 1, positive)
                      GPIO_OSPEEDR_OSPEEDR9 |           // high speed for pin A-9 (pwm channel 2, positive)
                      GPIO_OSPEEDR_OSPEEDR10;           // high speed for pin A-10 (pwm channel 3, positive)

    GPIOB->OSPEEDR |= GPIO_OSPEEDR_OSPEEDR13 |          // high speed for pin B-13 (pwm channel 1, negative)
                      GPIO_OSPEEDR_OSPEEDR14 |          // high speed for pin B-14 (pwm channel 2, negative)
                      GPIO_OSPEEDR_OSPEEDR15;           // high speed for pin B-15 (pwm channel 3, negative)

    GPIOA->AFR[1] |= (0x02 << GPIO_AFRH_AFSEL8_Pos) |   // for pin A-8 alternative funciton 2
                     (0x02 << GPIO_AFRH_AFSEL9_Pos) |   // for pin A-9 alternative funciton 2
                     (0x02 << GPIO_AFRH_AFSEL10_Pos);   // for pin A-10 alternative funciton 2

    GPIOB->AFR[1] |= (0x02 << GPIO_AFRH_AFSEL13_Pos) |  // for pin B-13 alternative funciton 2
                     (0x02 << GPIO_AFRH_AFSEL14_Pos) |  // for pin B-14 alternative funciton 2
                     (0x02 << GPIO_AFRH_AFSEL15_Pos);   // for pin B-15 alternative funciton 2

    TIM1->CCR3 = 0xA;                           // duty cycle of tim1 channel 3
    TIM1->CCR2 = 0xA;                           // duty cycle of tim1 channel 2
    TIM1->CCR1 = 0xA;                           // duty cycle of tim1 channel 1

    TIM1->CR1 |= (0x01 << TIM_CR1_CMS_Pos);     // centre-aligned mode 1 - up&down

    TIM1->RCR = 0x3;                            // repetition counter
    TIM1->BDTR |= TIM_BDTR_MOE |                // main output enable
                  TIM_BDTR_OSSR |               // Off-state selection for Run mode
                  TIM_BDTR_OSSI |               // Off-state selection for Idle mode
                  0x02;                         // 2-count dead-time


    TIM1->CR1 |= TIM_AUTORELOAD_PRELOAD_ENABLE; // enable timer 1 preload

    TIM1->CCER |= TIM_CCER_CC1E |               // enable channel 1, positive
                  TIM_CCER_CC2E |               // enable channel 2, positive
                  TIM_CCER_CC3E |               // enable channel 3, positive

                  TIM_CCER_CC1NE |              // enable channel 1, negative
                  TIM_CCER_CC2NE |              // enable channel 2, negative
                  TIM_CCER_CC3NE;               // enable channel 3, negative

    TIM1->EGR |= TIM_EGR_UG;                    // force update event

    TIM1->CR1 |= TIM_CR1_CEN; // enable timer 1

    while (1)
    {
    }
}
    
pregunta m_kramar

1 respuesta

1

Actualmente estoy haciendo prototipos en este EVB. Configure GPIOF y configure los pines PF6 y PF7 en un estado diferente a 0, ya que fuerza el VREG y la parte del controlador en el modo de espera. Esto se describe en el capítulo 6.4 de la hoja de datos de STSPIN32F0, página 23.

    
respondido por el rur

Lea otras preguntas en las etiquetas