STM32F103 direccionamiento de memoria

-1

He escrito mi código para la placa STM32F103C8T6 en Keil usando los archivos de inicio adecuados. Escribí directamente a las direcciones de memoria usando información de la hoja de datos, pero la carga de ST-Link parece subir el archivo hexadecimal a las direcciones incorrectas, por ejemplo:

GPIOA = 0x4001 0800 

Esto está de acuerdo con la hoja de datos de STM. Pero ST-Link muestra el rango de datos del dispositivo desde:

0x0800 0000 to 0x0800 03d4.

Mi código es un programa simple para hacer parpadear el LED en el puerto A1. Conecté el LED a través de una resistencia de 10k. ¿Por qué STM asigna las direcciones incorrectas cuando usé los punteros para especificar las ubicaciones de la memoria, o podría haber otros errores? Código abajo.

void delay(int a);

int main(void)
{
    unsigned int* GPIO_A;
    GPIO_A = (unsigned int*)0x40010800 ; // Assigning GPIOA to the correct memory location

    unsigned int* GPIO_A_CRL;
    GPIO_A_CRL = GPIO_A + 0x00 ; // Assigning GPIO_A_CRL to the correct memory location

    /*unsigned int* GPIO_A_IDR;
    GPIO_A_IDR = GPIO_A + 0X08 ; // Assigning GPIO_A_IDR to the correct memory location  */

    unsigned int* GPIO_A_BSRR;
    GPIO_A_BSRR = GPIO_A + 0X10 ; // Assigning GPIO_A_BSRR to the correct memory location

    unsigned int* GPIO_A_BRR;
    GPIO_A_BRR = GPIO_A + 0X14 ; // Assigning GPIO_A_BSRR to the correct memory   location

    unsigned int* RCC_APB2ENR;
    RCC_APB2ENR = (unsigned int*)(0x40021000 + 0X18) ; // Assigning                RCC_APB2ENR to the correct memory location

    *RCC_APB2ENR = 0X04; // Set clock for GPIOA

    *GPIO_A_CRL = 0X00008888 ; // Defining pin modes for GPIO_A_CRL

    while(1)  // infinite loop
    {
        *GPIO_A_BSRR = 0X00000002;  // Set bit 1 to 1
        delay(2); // delay
        *GPIO_A_BRR = 0x00000002;  // reset bit 1 to reset value(0)
        delay(2); // delay
    }
}

void delay(int a)
{
    long b = a*1000000;

    for(int i=0;i<b;i++)
    {
        int c = 1;
    }
}
    
pregunta ched

2 respuestas

0

Verifique el mapa de memoria en la hoja de datos. Los periféricos están en las direcciones que comienzan en 0x40000000 . 0x08000000 es el comienzo de la memoria Flash (código).

    
respondido por el user28910
-1

Podrías haber tenido la dirección incorrecta para gpioa.

    
respondido por el dannyf

Lea otras preguntas en las etiquetas