Estoy intentando que la salida PWM basada en el temporizador funcione en la placa Núcleo F103 y no puedo hacer que la MCU produzca nada. Pasé una cantidad de tiempo decente mirando los ejemplos en las preguntas relacionadas con las MCU F4 y F0, pero no pude encontrar una respuesta allí. Mi código provino originalmente de la herramienta CubeMX, pero cambié el nombre de la función PWM_MspInit para que coincida con la función que llama HAL_TIM_PWM_INIT ().
Mis funciones de inicialización del temporizador y de inialización de PWM tienen este aspecto:
/* TIM3 init function */
static void MX_TIM3_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
TIM_OC_InitTypeDef sConfigOC;
htim3.Instance = TIM3;
htim3.Init.Prescaler = 6400-1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 10000-1;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim3);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig);
HAL_TIM_PWM_Init(&htim3);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1000-1;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2);
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3);
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_ALL);
}
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim) {
GPIO_InitTypeDef GPIO_InitStruct;
if (htim->Instance == TIM3) {
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
//Configure GPIO pins : PA6 PA7
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//Configure GPIO pins : PB0 PB1
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
}
Entonces mi main () se ve así:
int main(void) {
// Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
// Configure the system clock
SystemClock_Config();
// Initialize all configured peripherals
MX_TIM3_Init();
// Infinite loop
while (1) {
}
}
La única parte de mi main.c que no se muestra es la función SystemClock_Config () no modificada que produjo CubeMX. A mi entender, debido al reloj del sistema de 64MHz, esto debería producir una señal PWM de 1Hz con un ciclo de trabajo del 10%. Cuando pruebo PA6 o PA7 no obtengo nada.