Autor Tema: Flash PIC32MZ  (Leído 190 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado juaperser1

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2482
Flash PIC32MZ
« en: 07 de Junio de 2018, 12:24:54 »
Buenas necesito ayuda con la escritura lectura en flash, es la primera vez que toco la flash de los pic32mz y no se por que no me funciona la verdad, llevo todo el día con esto.

a ver estoy utilizando un PIC32MZ1024EFG100, por lo tanto tenemos un tamaño de fila de 2048 bytes y un tamaño de pagina de 16384 Bytes, es decir que la región de escritura será de 2048 y la de borrado de 16384 Bytes.

voy a poner un código muy reducido sacado de los ejemplos a ver si entre todos vemos que le pasa a esto:

Código: [Seleccionar]
#include "app.h"

#define APP_PROGRAM_FLASH_BASE_ADDRESS          (unsigned int) 0x9D008000
#define APP_PROGRAM_FLASH_BASE_ADDRESS_VALUE    (KVA0_TO_KVA1((unsigned int *) APP_PROGRAM_FLASH_BASE_ADDRESS))


APP_DATA appData;

uint32_t databuff[DRV_FLASH_ROW_SIZE]; //2048

void APP_Initialize ( void )
{
    appData.state = APP_STATE_INIT;
}


void APP_Tasks ( void )
{

    /* Check the application's current state. */
    switch ( appData.state )
    {
        unsigned int x;
        /* Application's initial state. */
        case APP_STATE_INIT:
        {
            for (x = 0; x < 2048; x++)
            {
                databuff[x] = x;
            }
           
            appData.flashHandle = DRV_FLASH_Open(DRV_FLASH_INDEX_0, intent);
            appData.state = APP_STATE_BORRAR;
            break;
        }

        case APP_STATE_BORRAR:
        {
            DRV_FLASH_ErasePage(appData.flashHandle, APP_PROGRAM_FLASH_BASE_ADDRESS);
            appData.state = APP_STATE_ESPERA_BORRADO;
            break;
        }
        case APP_STATE_ESPERA_BORRADO:
        {
            if(!DRV_FLASH_IsBusy(appData.flashHandle))
            {
                appData.state = APP_STATE_ESCRIBIR;
            }
            break;
        }
        case APP_STATE_ESCRIBIR:
        {
            DRV_FLASH_WriteRow(appData.flashHandle, APP_PROGRAM_FLASH_BASE_ADDRESS, databuff);
            appData.state = APP_STATE_ESPERA_ESCRITO;
            break;
        }
        case APP_STATE_ESPERA_ESCRITO:
        {

            if(!DRV_FLASH_IsBusy(appData.flashHandle))
            {
                if (!memcmp(databuff, (void *)APP_PROGRAM_FLASH_BASE_ADDRESS_VALUE, sizeof(databuff)))
                {
 
                    appData.state = APP_STATE_NVM_SUCCESS_STATE;
                }
                else
                {

                    appData.state = APP_STATE_NVM_ERROR_STATE;
                }
            }
            break;
        }

        default:
        {

            break;
        }
    }
}


Asi tal como esta se queda pillado en la función DRV_FLASH_ErasePage(appData.flashHandle, APP_PROGRAM_FLASH_BASE_ADDRESS);
sin embargo si borro esto:

Código: [Seleccionar]
for (x = 0; x < 2048; x++)
            {
                databuff[x] = x;
            }

no se queda pillado :? :? :? :? :? :? y llega hasta la instrucción  appData.state = APP_STATE_NVM_ERROR_STATE; por lo tanto no concuerda.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado juaperser1

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2482
Re:Flash PIC32MZ
« Respuesta #1 en: 07 de Junio de 2018, 13:38:38 »
Bueno ya se por que no me iba, o eso creo en la aplicación que estoy haciendo me como casi el 80% de la memoria del micro, y por lo visto algo se estaría pisando por que he hecho un proyecto nuevo sin nada y hay si funciona. ¿Como puedo hacer para arreglar esto?

por otro lado, al leer los datos solo puedo leer paquetes de 128 bytes con la instruccion memcpy, es decir, tengo que hacer esto:

Código: [Seleccionar]
memcpy((void *)buff, (void *)0x9D008000, 128);
                    memcpy((void *)buff2, (void *)0x9D008200, 128);
                    memcpy((void *)buff3, (void *)0x9D008400, 128);

si hago esto:

Código: [Seleccionar]
memcpy((void *)buff, (void *)0x9D008000, 2048);
solo me copia los 128 bytes menores. ¿Alguien sabe por que?

Rectifico:

Parece ser que solo lee los bytes que le indico /4 hasta un maximo de 512, es decir si pongo:

Código: [Seleccionar]
memcpy((void *)buff, (void *)0x9D008000, 2048);
me lee 512

si pongo:

Código: [Seleccionar]
memcpy((void *)buff, (void *)0x9D008000, 128);
me lee 32
« Última modificación: 07 de Junio de 2018, 13:51:14 por juaperser1 »
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6621
Re:Flash PIC32MZ
« Respuesta #2 en: 07 de Junio de 2018, 14:53:36 »
Parece ser que solo lee los bytes que le indico /4 hasta un maximo de 512

Hay 4 words de 32bits en un Quad como le llama:

http://ww1.microchip.com/downloads/en/DeviceDoc/60001193B.pdf

Tal ves es por eso. Si le pones uint32_t * en ves de void * que pasa? Asi cuenta como 4 bytes

Desconectado juaperser1

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2482
Re:Flash PIC32MZ
« Respuesta #3 en: 07 de Junio de 2018, 17:42:25 »
Ok mañana lo pruebo y posteo los resultados.

Tambien tengo que ver como reservar la memoria para que no me influya con los datos del programa.

Gracias.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado juaperser1

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2482
Re:Flash PIC32MZ
« Respuesta #4 en: 10 de Junio de 2018, 07:14:57 »
Si coloco uint32_t * no funciona correctamente, lee zonas de memoria distintas.

Alguien tiene algún código probado?, quiero comprobar que el microcontrolador este bien, ya que los ejemplos no funcionan
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw

Desconectado manwenwe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2137
Re:Flash PIC32MZ
« Respuesta #5 en: 10 de Junio de 2018, 07:32:33 »
Juanjo, fijate en los ejemplos de bootloader que ahí están las librerías que funcionan y fíjate en organización de memoria ya que según las funciones que utilizas tienes que direccionar a memoria física o a mapeada.

Saludos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado juaperser1

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2482
Re:Flash PIC32MZ
« Respuesta #6 en: 10 de Junio de 2018, 08:15:05 »
Juanjo, fijate en los ejemplos de bootloader que ahí están las librerías que funcionan y fíjate en organización de memoria ya que según las funciones que utilizas tienes que direccionar a memoria física o a mapeada.

Saludos.

Utilizo la dirección mapeada, la física tampoco funciona bien, pero despues de mucho probar he dejado el driver flash y he probado el driver nvm (el nuevo), este parece que va bien. No se por que pero el driver flash (el antiguo) hace cosas raras en los pic32mz.

Para reservar la memoria he hecho:

const uint8_t gAppFlashReserveArea[APP_NVM_MEMORY_AREA_SIZE] KEEP = {0}; 

siendo keep:

Código: [Seleccionar]
#if defined (__PIC32C__)
#define KEEP
#else
#define KEEP              __attribute__ ((keep)) __attribute__((address(DRV_NVM_MEDIA_START_ADDRESS)))
#endif

#define APP_NVM_MEMORY_AREA_SIZE (DRV_NVM_MEDIA_SIZE * 1024)

Con 1024 tengo de sobra y ahora parece que no hay problema cuando la memoria esta llena, a ver ahora cuando junte todas las partes del programa si va bien.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw