Frecuencia de conmutación de GPIO máx. STM32 F4 [duplicado]

0
Acabo de comenzar a usar la placa de evaluación de descubrimiento STM32 F401VC y estoy tratando de obtener la máxima frecuencia de conmutación GPIO sin apostador. Así que mi proceso de enseñanza está siguiendo:

El código que planeaba usar es:

#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx.h"
#include "stm32f4xx_spi.h"

void initializeGreenLed(void){
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD,&GPIO_InitStructure);
}


int main(void)
{
    //RCC_CFGR;
    initializeGreenLed();
    //initialiseSysTick();
    GPIO_SetBits(GPIOD,GPIO_Pin_12);
    while(1)
    {
        GPIO_ToggleBits(GPIOD,GPIO_Pin_12);
    }
}

La frecuencia máxima de conmutación de pines que obtengo es de alrededor de 230 KHz. Como la MCU se puede ejecutar a 84 MHz, tengo la sensación de , de que es posible aumentar la frecuencia máxima de conmutación más allá de 230 KHz.

Así que pensé que necesito cambiar / modificar la fuente del reloj para RCC_AHB1Periph_GPIOD en RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); . Para eso utilicé el manual de referencia STM32 F4. AsíqueelplanerausarPLLCLKcomoSYSCLK.ElPLLCLKseobtendríade8MHzHSE.

Navegandopor YouTube , encontré un buen ejemplo:

#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx.h"
#include "stm32f4xx_flash.h"

void initializeGreenLed(void){
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD,&GPIO_InitStructure);
}


int main() {



//---------------------------down is clc stuff---------------------------

    RCC_DeInit();

    ErrorStatus Errsts;
    RCC_HSEConfig(RCC_HSE_ON);
    Errsts = RCC_WaitForHSEStartUp();

    if (Errsts == SUCCESS) {
        //external clc is ok
        RCC_PLLConfig(RCC_PLLSource_HSI, 8, 336, 2, 7);
        RCC_PLLCmd(ENABLE);
        RCC_GetFlagStatus(RCC_FLAG_PLLRDY == RESET);

        FLASH_SetLatency(FLASH_Latency_5);

        RCC_HCLKConfig(RCC_SYSCLK_Div1);
        RCC_PCLK1Config(RCC_HCLK_Div4);
        RCC_PCLK2Config(RCC_HCLK_Div2);

        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

        initializeGreenLed();
        while(1){
            GPIO_SetBits(GPIOD,GPIO_Pin_12);
                }


        }
    else {
        //External clc no ready

        while(1);
    }
}

Pero no funciona, ya que solo permanece en un estado.

Así que tengo dos preguntas:
  1. ¿Por qué no funciona mi código?
  2. Si mi estrategia mencionada anteriormente es incorrecta, ¿cómo aumentar la frecuencia de conmutación más allá de 230 KHz?

1 respuesta

-2

En su segundo código, tiene la línea GPIO_SetBits (GPIOD, GPIO_Pin_12) ;, ¿realmente restablece el pin en algún punto?

Es más rápido colocar el pin a través del registro en lugar de usar la función de biblioteca, ya que hay muchos gastos generales.

Consulte este tutorial sobre GPIO.

  

Para configurar PC8

     

GPIOC- > ODR | = 0x00000100; // (0b0000000000000000000000100100000000)

     

Para borrar el pin PC8 independientemente de todos los otros pines en GPIOC (RMW), puede usar:

     

GPIOC- > ODR & = ~ (0x00000100); // (0b0000000000000000000000100100000000)

Así que puedes intentarlo

while (1)
{
     GPIOC->ODR |=  0x00000100; 
     // maybe some delay needed here
     GPIOC->ODR &=  ~(0x00000100);
}

Por supuesto, ajuste al pin / registro adecuado que necesita.

El hardware también limita el tiempo de alternancia de pin.

Puede cambiar el pin tan rápido en el lado del software, que el hardware podría no tener tiempo para seguir y, por lo tanto, quedarse atascado en un estado.

También depende de lo que esté conectado a ese pin, el cable largo, la capacitancia, la impedancia y la inductancia ralentizarán el tiempo de conmutación, ya que estará limitado por la corriente que el IC puede extraer de ese pin y la conmutación interna del hardware. latencia.

La latencia del hardware se define en la hoja de datos en la página 95, para este ejemplo no puede exceder 50-100Mhz dependiendo de las condiciones.

    
respondido por el Damien

Lea otras preguntas en las etiquetas