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)
{
}
}