Mi objetivo es generar PWM con ciclo de trabajo = 50% , frecuencia = 50 Hz usando Temporizador de propósito general 2 en el canal de salida 2 que está en PA1 o número de pin 11 Mi sistema objetivo es Placa de desarrollo STM32 BluePill
- El controlador de destino es STM32F103C8T6 DISPOSITIVO DE DENSIDAD MEDIA
- El cristal de la placa de destino es 8 MHz
- Uso la versión de evaluación de Keil Micro vision 4 IDE para programación y depuración
- Depurador: ST-LINK V2
Configuré el GPIOA en el modo Push Pull de salida de función alternativa con una frecuencia máxima que no supera los 50 MHz, conecté una bombilla LED al pin 1 de GPIOA, pero el LED siguió brillando sin reducción en el nivel de brillo. El LED aún estaba encendido incluso después de realizar una prueba con el ciclo de trabajo establecido en 0. En la ventana del depurador, pude ver exactamente todos los parámetros que configuré y el registro de conteo se fue incrementando. No puedo encontrar información sobre la selección de funciones alternativas para un puerto GPIO.
mi código:
/**************************** Header file *******************************/
#include<stm32f10x.h>
/*************************** user defined function **********************/
/************************************************************************
Name : PWM_Init()
Description : Initializes PWM hardware and associated GPIO ports
Enables clocks for peripherals and configure modes
Parameters : None
Return_val : None
************************************************************************/
void PWM_Init()
{
/****configure clocks for PORTA & TIMER2********/
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; // enable port a clock
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; // enable clock for timer 2
/***** configure GPIOA mode *******************/
/* Porta Pin 1 &2 as alternate function output Push pull 50 MHz */
GPIOA->CRL = 0x000000bb;
/*******Set timer 2 Period for PWM**************
Timer Clock = 72MHz = 72000000 Hz
Time Period Required = (1/50Hz) = 0.02 Seconds
Let ARR value be 65535 then,
Prescalar + 1 = 72000000/((ARR+1)*50Hz)
Prescalar = 21 (approx)
***********************************************/
TIM2->ARR = 65535; // Set Auto reload value
TIM2->PSC = 21; // Set Prescalar value
/* Output Compare Mode, ENABLE Preload,PWM mode:2*/
TIM2->CCMR1 = 0x00007800;
TIM2->EGR |= TIM_EGR_UG; // ENABLE update generation
/*CC2E : channel 2 enabled; polarity : active high*/
TIM2->CCER = 0x00000010;
TIM2->CR1 |= TIM_CR1_ARPE; // Auto preload ENABLE
TIM2->CR1 |= TIM_CR1_CEN; // ENABLE Timer counter
}
/**************Main Function**********************************/
int main()
{
PWM_Init(); // initialize PWM
while(1)
{
TIM2->CCR2 = 32768; // SET duty cycle to 50%
}
}
Tenga una vista de mi código fuente y notifíqueme las correcciones que deben hacerse. Las especificaciones de destino se mencionan en el código fuente.
Gracias