El programa no funciona correctamente cuando alterno el pin a través del registro Establecer y restablecer

1

Tengo dos programas para hacer la misma tarea. los dos deberían alternar GPIOB0 . El primer programa es este:

#include "stm32f10x.h"


/* Private functions ---------------------------------------------------------*/

GPIO_InitTypeDef GPIO_InitStructure;


void GPIO_Configuration(void);


int main(void)
{
    GPIO_Configuration();

    GPIOB->ODR ^= GPIO_Pin_0;
    GPIOB->ODR ^= GPIO_Pin_0;
    GPIOB->ODR ^= GPIO_Pin_0;
    GPIOB->ODR ^= GPIO_Pin_0;
    GPIOB->ODR ^= GPIO_Pin_0;
    GPIOB->ODR ^= GPIO_Pin_0;
    GPIOB->ODR ^= GPIO_Pin_0;
    GPIOB->ODR ^= GPIO_Pin_0;
    GPIOB->ODR ^= GPIO_Pin_0;
    GPIOB->ODR ^= GPIO_Pin_0;

    /* Infinite loop */
    while (1)
    {

  }
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configure GPIO Pin
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);                        
/**
 *  LED1 -> PB0
 */                  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);


}

Y la salida:

Ok,cincopulsoscomoesperaba.otroprogramaeseste:

#include"stm32f10x.h"


/* Private functions ---------------------------------------------------------*/

GPIO_InitTypeDef GPIO_InitStructure;


void GPIO_Configuration(void);


int main(void)
{
    GPIO_Configuration();

    GPIOB->BSRR = GPIO_Pin_0;
    GPIOB->BRR  = GPIO_Pin_0;
    GPIOB->BSRR = GPIO_Pin_0;
    GPIOB->BRR  = GPIO_Pin_0;
    GPIOB->BSRR = GPIO_Pin_0;
    GPIOB->BRR  = GPIO_Pin_0;
    GPIOB->BSRR = GPIO_Pin_0;
    GPIOB->BRR  = GPIO_Pin_0;
    GPIOB->BSRR = GPIO_Pin_0;
    GPIOB->BRR  = GPIO_Pin_0;

    /* Infinite loop */
    while (1)
    {

  }
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configure GPIO Pin
* Input          : None
* Output         : None
* Return         : None
* Attention      : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE);                        
/**
 *  LED1 -> PB0
 */                  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);


}

Y salida:

Comopuedesver,solohayunpulso.¿Porqué?Parecequenopuedehacercuatropulsossiguientes.pero¿porqué?

Edit1:laMCUes STM32F103RET6 .

Edit2: todas las explicaciones que puede ver en el manual de referencia para estos tres registros:

    
pregunta Roh

1 respuesta

1

Su segundo ejemplo generará una mucha frecuencia más alta que la primera, posiblemente más alta que los 16 MHz de su sonda lógica.

El primer ejemplo tiene que usar un ciclo de lectura-modificación-escritura para cada pin de alternancia, que requiere al menos 3 instrucciones para ejecutarse.

El segundo ejemplo solo necesita una única instrucción de escritura para cada conjunto / reinicio, lo que da como resultado una frecuencia de conmutación de pin de 36 MHz para una MCU de 72 MHz.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas