Dirección GPIO de Cortex M3 (LM3s300)

0

Tenía un poco de confusión con respecto a la dirección de GPIO_PortA Como se menciona en la hoja de datos:

  • Dirección basada en GPIO PortA: 0x40004000
  • y GIOP_DATA tiene Offset: 0x000
  • que significa la dirección de GPIO_PortA = 0x40004000;

El problema comienza desde aquí:

  • por qué este código no funciona como se esperaba: (usando direcciones de hoja de datos)

#define porta_data (*(volatile unsigned long*)0x40004000) ... while(1) { porta_data=~porta_data }

  • y por qué este código funciona con una dirección incorrecta (se vio durante el lec en línea de edX)

#define porta_data (*(volatile unsigned long*)0x400043fc) ... while(1) { porta_data=~porta_data }

  • hay otro problema.
  • cuando uso el método de enlace de bits y uso la fórmula.

bit_word_addr = bit_band_base + (byte_offset * 32) + (bit_number * 4)

Como:

#define bit_word_addr (0x40004000+(0x0000*32)+(1*4+4))
#define porta_pin0 (*(volatile unsigned long*)bit_word_addr)
  • usando la dirección base y el desplazamiento como se menciona en la hoja de datos
  • Podría cambiar el bit individual como se esperaba.
  • Pero al usar la misma dirección no pude cambiar todo el puerto (GPIO_PORTA).
pregunta Sajjad Ahmed

1 respuesta

1

Para su primera pregunta, consulte la página 227 y la Sección 7.2.12 en hoja de datos para la pieza. Creo que eso podría explicar el comportamiento que está viendo, no es un registro de datos sencillo que pueda leer / escribir.

Observará que el espacio GPIODATA es 0x400, o 2 ^ 10 de tamaño. Parece excesivo trabajar solo con 8 bits, ¿verdad? Para las escrituras en este registro, los bits 9 a 2 se utilizan como una máscara de bits. Entonces, cuando intentó ingresar a 0x40004000, su máscara de bits era todo ceros, lo que le impedía modificar cualquier parte del registro. Los dos bits más bajos son la dirección "real" que te da acceso a los 8 bits de GPIO que realmente tienes.

Entonces, si siempre quisieras editar todo el registro a la vez, tu rango de direcciones sería de 0x400043FC a 0x400043FF. Eso establece los bits 9 a 2 a 1, lo que permite escribir en todos los bits del registro. Esta es una poderosa capacidad que le impide tener que realizar operaciones de enmascaramiento de bits / lectura-modificación-escritura manual. Esta es la razón por la que el código de ejemplo de curso edX funciona porque utilizan una dirección de memoria que permite escribir en cada bit.

En cuanto a su segunda pregunta, ¿no debería utilizar la región de alias de banda de bits a partir de 0x42000000 en lugar de la región directa de 0x40000000?

    
respondido por el Krunal Desai

Lea otras preguntas en las etiquetas