FLASH.H
#ifndef _FLASH_H #define _FLASH_H //#include "../rs232/rs_232.h" #define largoMAC 6 //byte #define largoID 19 //words #define largoIP 4 //byte #define largoMasc 4 //byte #define largoE 4 //byte #define largoTot 37 // = largoMAC + largoID +largoIP + largoMasc + largoE // Function prototypes int actualizarFlash(unsigned char tipo); void write_SegA(unsigned char *mac, unsigned char *id, unsigned char *ip, unsigned char *masc, unsigned char *enlace); void read_SegA(char offset, unsigned short largoCampo, unsigned char *campo); //void leerCOM1(unsigned char *campo, unsigned short cuenta, unsigned short offset); unsigned char leerIP(unsigned short octeto); #endif /* _FLASH_H */
FLASHWRITE02.C
/** OJO CON EL RELOJ, ESTE PROGRAMA FUNCIONA CON MCLK ENTRE 550KHz Y 900KHz. * SUPUESTAMENTE DCO POR DEFECTO ESTA FUNCIONANDO con un reloj en este rango de frecuencia. */ #include <msp430x16x.h> #include <stdio.h> #include "flash.h" char *Flash_ptr; // Puntero Flash /** * \brief Función que actualiza un campo guardado (quemado) en la Flash. * \param tipo Inidica el tipo de campo a modificar. * \return Retorna 0 si actualiza. De lo contrario, otro valor. */ /*int actualizarFlash(unsigned char tipo)*/ void main (void) { unsigned char MAC[largoMAC] = {0x01,0xbd,0x3b,0x33,0x05,0x71};//0}; unsigned char ID[largoID] = {"PME010709VCMEMH0001"};//0}; unsigned char IP[largoIP] = {0xAC,0x10,0x10,0x50}; //0}; //172.16.16.80 unsigned char MASCARA[largoMasc] = {0xFF,0xFF,0xFF,0x80};//0}; //255.255.255.128 unsigned char ENLACE[largoE] = {0xAC,0x10,0x10,0x01};//0}; unsigned char buffer_test[largoTot]={0}; //int errorFlash = 0; WDTCTL = WDTPW + WDTHOLD; // Parar watchdog timer FCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator write_SegA(ID,MAC,IP,MASCARA,ENLACE); /*switch(tipo) { case 'm': leerCOM1(MAC, 6, 1); read_SegA(0, 19, ID); read_SegA(25, 4, IP); read_SegA(29, 4, MASCARA); read_SegA(33, 4, ENLACE); write_SegA(ID,MAC,IP,MASCARA,ENLACE); break; case 'd': leerCOM1(ID, 19, 1); read_SegA(19, 6, MAC); read_SegA(25, 4, IP); read_SegA(29, 4, MASCARA); read_SegA(33, 4, ENLACE); write_SegA(ID,MAC,IP,MASCARA,ENLACE); break; case 'p': leerCOM1(IP, 4, 1); read_SegA(0, 19, ID); read_SegA(19, 6, MAC); read_SegA(29, 4, MASCARA); read_SegA(33, 4, ENLACE); write_SegA(ID,MAC,IP,MASCARA,ENLACE); break; case 's': leerCOM1(MASCARA, 4, 1); read_SegA(0, 19, ID); read_SegA(19, 6, MAC); read_SegA(25, 4, IP); read_SegA(33, 4, ENLACE); write_SegA(ID,MAC,IP,MASCARA,ENLACE); break; case 'e': leerCOM1(ENLACE, 4, 1); read_SegA(0, 19, ID); read_SegA(19, 6, MAC); read_SegA(25, 4, IP); read_SegA(29, 4, MASCARA); write_SegA(ID,MAC,IP,MASCARA,ENLACE); break; default: errorFlash = 30; }*/ read_SegA(0,37,buffer_test); //return errorFlash; } /** * \brief Función que escribe en Segmento A de la memoria de Información Flash * * Escribe en el siguiente orden: ID, MAC, IP, Máscara de Subred. * \param *id Identificación de la MSP430. * \param *mac MAC Media Access Control address, Direccion de Control de Acceso al Medio. * \param *ip Protocolo de Internet. * \param *masc Máscara de Red. * \param *enlace Puerta de Enlace de la Subred. */ void write_SegA(unsigned char *id, unsigned char *mac, unsigned char *ip, unsigned char *masc, unsigned char *enlace) { unsigned short i; Flash_ptr = (char *) 0x1080; // Inicialización Puntero Flash FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY; // Clear Lock bit *Flash_ptr = 0; // Dummy write to erase Flash segment FCTL1 = FWKEY + WRT; // Set WRT bit for write operation for(i=0; i < largoTot; i++) { if(i < largoID) // Escribe cada campo en el segmento A de la flash *Flash_ptr++ = id[i]; //ID else if (i < largoMAC + largoID && i >= largoID) *Flash_ptr++ = mac[i-largoID]; //MAC else if (i < largoTot - largoMasc - largoE && i >= largoMAC + largoID) *Flash_ptr++ = ip[i-(largoMAC + largoID)]; //IP else if (i < largoTot - largoE && i >= largoTot - largoMasc - largoE) *Flash_ptr++ = masc[i-(largoTot - largoMasc - largoE)]; //MASCARA else if (i < largoTot && i >= largoTot - largoE) *Flash_ptr++ = enlace[i-(largoTot - largoE)]; //ENLACE _NOP(); // SET BREAKPOINT HERE } FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCK; // Set LOCK bit } /** * \brief Función que lee los campos guardados en segmento A de la memoria Flash. * \param offset Cantidad de byte que debe avanzar antes de leer desde el puntero de memoria Flash. * \param largoCampo Largo del campo leído. * \param *campo Arreglo de caracteres donde se almacenará lo leído. */ void read_SegA(char offset, unsigned short largoCampo, unsigned char *campo) { unsigned short i=0; Flash_ptr = (char *) 0x1080; // Re-Inicialización Puntero Flash Flash_ptr = Flash_ptr + offset; // offset /*while(offset-- > 0) Flash_ptr++;*/ // _NOP(); while(i < largoCampo) // LECTURA DE LA FLASH { campo[i] = *Flash_ptr++; printf("%c", campo[i]); i++; } printf("\n"); } /** * \brief Función que lee el buffer de COM1 * \param *campo Arreglo de caracteres donde se almacenará lo leído desde el COM1. * \param cuenta Largo del campo leído. * \param offset Cantidad de byte que se debe avanzar antes de leer desde el buffer de COM1. void leerCOM1(unsigned char *campo, unsigned short cuenta, unsigned short offset) { unsigned short i; for(i = 0; i < cuenta; i++) { campo[i] = getRXBuffer_0(offset + i); //printf("%c",campo[i]); } _NOP(); }*/
file: /Techref/ti/msp430/flashwrite02_c.htm, 7KB, , updated: 2007/11/6 15:34, local time: 2024/11/24 00:03,
3.144.103.20:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://ecomorder.com/techref/ti/msp430/flashwrite02_c.htm"> MSP430, Microcontroller, FLASH, RS232</A> |
Did you find what you needed? |
Welcome to ecomorder.com! |
Welcome to ecomorder.com! |
.