Me he topado con un problema peculiar con mi PDC (Controlador DMA Periférico) donde usar el PDC para transferir una cadena constante de flash sobre UART 0 parece producir un resultado inesperado. Se envía el número correcto de bytes, pero todos son cero.
La cadena se define en el espacio de nombres global de la siguiente manera
char* str = "Hello world!";
Solo lo envío una vez al inicio de main
como esto:
UART0->UART_TPR = str; // PDC transfer pointer
UART0->UART_TCR = strlen(str); // PDC counter
UART0->UART_PTCR = UART_PTCR_TXTEN; // PDC enable for UART 0
que me envía 12 ceros sobre UART en el inicio.
Ahora, si copio la cadena en una matriz que está en el alcance de la función:
int main()
{
// ... some initialization stuff ...
char buffer[100];
int i;
for (i = 0; i < 100 && str[i] != 'char* str = "Hello world!";
'; ++i)
{
buffer[i] = str[i];
}
buffer[i] = 'UART0->UART_TPR = str; // PDC transfer pointer
UART0->UART_TCR = strlen(str); // PDC counter
UART0->UART_PTCR = UART_PTCR_TXTEN; // PDC enable for UART 0
';
UART0->UART_TPR = buffer; // PDC transfer pointer
UART0->UART_TCR = strlen(buffer); // PDC counter
UART0->UART_PTCR = UART_PTCR_TXTEN; // PDC enable for UART 0
// ... other code here ...
}
Este me envía la cadena "¡Hola mundo!" sobre UART + un carácter aleatorio que es bastante fácil de arreglar.
Mi pregunta es, ¿por qué no funcionó el primer método?
La hoja de datos indica que el PDC puede acceder a cualquiera de las memorias en chip, así que, ¿qué está pasando? con flash?
Usando SAM-ICE confirmé lo obvio:
-
La dirección de la variable global comienza con 0x004 ..., lo que significa que reside en Flash
-
La dirección del búfer local comienza con 0x200 ..., indicando que reside en SRAM.
Este problema está ocurriendo en una placa de prototipo comercial. Tengo un kit de evaluación SAM3N4C para el cual puedo reescribir el código si lo necesita para ayudarme, pero me gustaría evitarlo si es posible.
Las secciones de la hoja de datos que son de interés son las siguientes:
Sección 10.5: ARM Cortex M3 - > Modelo de memoria (10.5.2 y 10.5.3 en particular)
Sección 22: Controlador de DMA periférico
Sección 29: UART (si no es suficiente información, mira 30, USART, podría dar algunas pistas).
No estoy seguro de qué pensar ya que solo estoy accediendo a los bytes, por lo que la alineación y la endiancia no deberían ser un problema. Además, la sección de flash en la hoja de datos también dice que el Flash puede leerse en bytes, por lo que no veo ningún problema. Por lo tanto, me dirijo a la comunidad en busca de ayuda. Gracias de antemano.