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;
}
}