Cómo configurar STM32 con dos velocidades de reloj diferentes

Estoy usando STM32F103RE para implementar una operación que requiere mucho tiempo. Este dispositivo se conecta a la PC a través de un puerto USB. No soy un experto en configurar estas MCU, pero parece que cuando se configura para comunicarse a través de USB, no puede usar la máxima velocidad de procesamiento posible, que es de 72 MHz.

¿Hay alguna forma de configurar mi STM32F103 con dos frecuencias diferentes (una para comunicación USB y otra para procesamiento interno a 72 MHz)?

Esto es parte del código de configuración USB:

RCC->APB1ENR |= (1 << 23);                /* Enable clock for USB */

/* Enable USB interrupts */
NVIC->IPR [5] |= 0x00000010;              /* Set priority lower than SVC */

NVIC->ISER[0] |= (1 << (USB_LP_CAN_RX0_IRQChannel & 0x1F));

/* Control USB connecting via SW */
RCC->APB2ENR |= (1 << 5);                 /* Enable clock for GPIOD */
GPIOD->CRL &= ~0x00000F00;                /* Clear port PD2 */
GPIOD->CRL |=  0x00000700;                /* PD2 General purpose output open-drain, max speed 50 MHz */
GPIOD->BRR  = 0x0004;                     /* Reset PD2 (set to low) */

Y esta es mi configuración de reloj smt32_init:

#define __CLOCK_SETUP              1
#define __RCC_CR_VAL               0x01010082
#define __RCC_CFGR_VAL             0x001D8402
#define __HSE                      8000000

Supongo que algún cambio en RCC_CR o RCC_CFGR debería resolver el problema, pero creo que también hay otras configuraciones para que flash funcione con alta frecuencia.

¿Cómo puedo hacer eso?

Creo que la pregunta es un poco diferente. La pregunta es por qué no puede funcionar a 72 MHz cuando está conectado al USB. El USB generalmente se ejecuta desde un PLL que se registra desde un cristal externo. Es probable que haya un problema de firmware en el que la configuración USB modifica el reloj para todos. ¿Puedes publicar tu reloj y el código de rutina de inicialización USB?
Muestre el código real, no solo los valores. Además, ¿qué código intentas cuando intentas ejecutarlo a 72 MHz?
@PeterMotsenen: ¿qué se gana realmente al hacer ediciones triviales a una pregunta de casi cuatro años? ¿De verdad crees que equilibra el costo de colocarlo en la parte superior de la página principal cuando no necesita la atención de nadie?

Respuestas (1)

Cuando se trata de programar el STM32, el Manual de referencia RM0008 debe ser su compañero constante.

Sección 7.2.3 PLL:

Si se utiliza la interfaz USB en la aplicación, el PLL debe programarse para una salida de 48 o 72 MHz. Esto es necesario para proporcionar un USBCLK de 48 MHz.

Por lo tanto, no solo es posible, es una de las dos frecuencias posibles que puede elegir al utilizar el USB.

Debería poder configurar el reloj del sistema a 72 MHz utilizando las definiciones y funciones en las bibliotecas de suministros de STM. Pero te RCC_CFGRves bien. Ha seleccionado HSE como su PLLSRC. Y estás configurando el PLLMULa x9. Entonces, siempre que su HSE sea alimentado por un oscilador de 8 MHz (que parece que lo es), obtendrá 72 MHz para el SYSCLK. Y ha USBPREconfigurado para 0que divida el PLL por 1,5 para obtener sus 48 MHz.

Mirando el árbol del reloj en la página 90, parece todo lo que se requiere.

Árbol de reloj

En cuanto al acceso a flash, debe asegurarse de tener dos estados de espera. Eso se hace escribiendo 010al FLASH_ACRregistro. Consulte la página 60 para obtener más detalles sobre ese registro.