#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "main_asm.h" /* interface to the assembly module */
#include "hcs08.h"
#include "doonstack.h" // inclui as funções para manipulação da memória FLASH
/* FCDIV: DIVLD=0,PRDIV8=0,DIV5=1,DIV4=0,DIV3=0,DIV2=1,DIV1=1,DIV0=1 */
FCDIV = 0x27;
const char PROTECAO[1] @0xFFBD=0b11100010;
void Start_MCU();
// lê um endereço da memória FLASH
unsigned char flash_read(unsigned int endereco)
{
unsigned char *ponteiro;
ponteiro = (char*) endereco;
return (*ponteiro);
}
// escreve em um endereço da memória FLASH
unsigned char flash_write(unsigned int endereco, unsigned char dado)
{
unsigned char *ponteiro;
// guarda o endereço da memória em um ponteiro
ponteiro = (char*) endereco;
// verifica e apaga flag de erro de acesso a FLASH
if (FSTAT_FACCERR) FSTAT_FACCERR=1;
// chama a função de programação da FLASH
FlashProg(ponteiro,dado);
// se houve erro, retorna 1 caso contrário, retorna 0
if (FSTAT_FACCERR || FSTAT_FPVIOL) return(1); else return(0);
}
// apaga uma página da memória FLASH
unsigned char flash_page_erase(unsigned int endereco)
{
unsigned char *ponteiro;
// guarda o endereço da memória em um ponteiro
ponteiro = (char*) endereco;
// verifica e apaga flag de erro de acesso a FLASH
if (FSTAT_FACCERR) FSTAT_FACCERR=1;
// chama a função de apagamento da FLASH
FlashErase(ponteiro);
// se houve erro, retorna 1 caso contrário, retorna 0
if (FSTAT_FACCERR || FSTAT_FPVIOL) return(1); else return(0);
}
/*
** ===================================================================
** CONFIGURA MCU
** ===================================================================
*/
void Start_MCU()
{
asm
{
lda 0x0000FFAF
sta ICSTRM
}
//ICSTRM = 166; // para 8Mhz
SOPT1 = 0b00000010; // CONFIG 1
/* |||||||+-- RSTPE = PINO RESET HABILITADO ???
||||||+--- BKGDPE = HABILITA BDM ???
|||||+---- ?????? = NULL
||||+----- ?????? = NULL
|||+------ ?????? = NULL
||+------- STOPE = HABILITA MODO STOP ???
|+-------- COPT = CONTAGEM COP 0=8192 OU 1=262144
+--------- COPE = HABILITA COP ???
*/
SOPT2 = 0b10000000; // CONFIG 2
/* |||||||+-- ACIC = CONECTA COMPARADOR CANAL 0 ???
||||||+--- IICPS = I2C 0=SDA->PTA2 SCL->PTA3
|||||+---- ?????? = NULL
||||+----- ?????? = NULL
|||+------ ?????? = NULL
||+------- ?????? = NULL
|+-------- ?????? = NULL
+--------- COPCLKS = CLOCK COP 0=1KHZ 1=FBUS
*/
SPMSC1 =0b01010100; // REGISTRADOR BAIXA TENSÃO
/* |||||||+-- BGBE = HABILITA BUFFER ???
||||||+--- ?????? = NULL
|||||+---- LVDE = HABILITA LVD ???
||||+----- LVDSE = HABILITA LCD MODO STOP ???
|||+------ LVDRE = GERA RESET CASO LVD
||+------- LVDIE = GERA INTERRUPÇÃO CASO LVD
|+-------- LVDACK = 1 APAGA FLAG LVDF
+--------- LVDF = SINALIZA BAIXA TENSÃO
*/
IRQSC = 0b01000100; // INTERRUPÇÃO EXTERNA
/* |||||||+-- IRQMOD = MODO DE DISPARO
||||||+--- IRQIE = HABILITAÇÃO IRQ
|||||+---- IRQACK = 1 APAGA O FLAG IRQF
||||+----- IRQF = SINALIZA IRQ
|||+------ IRQPE = HABILITA PINO IRQ
||+------- IRQEDG = BORDA x NIVEL
|+-------- IRQDD = PULL-UP
+--------- ?????? = NULL
*/
ICSC2 = 0b00110100; // ICSC2
ICSC1 = 0b00000110;
/* |||||||+-- IREFSTEN= REFERENCIA MODO STOP
||||||+--- IRCLKEN = CLOCK INTERNO???
|||||+---- IREFS = REFENCIA INTERNA???
||||+----- RDIV = FATOR DE DIVISAO
|||+------ RDIV =
||+------- RDIV =
|+-------- IRQDD = PULL-UP
+--------- ?????? = NULL
*/
PTADD = 0b00000001; // DIREÇÃO DA PORTA A
/* |||||||+-- PTA0
||||||+--- PTA1
|||||+---- PTA2
||||+----- PTA3
|||+------ PTA4
||+------- PTA5
|+-------- PTA6
+--------- PTA7
*/
PTADS = 0b00000001; // MODO POTENCIA NA PORTA A
/* |||||||+-- PTA0
||||||+--- PTA1
|||||+---- PTA2
||||+----- PTA3
|||+------ PTA4
||+------- PTA5
|+-------- PTA6
+--------- PTA7
*/
PTBDD = 0b11110110; // DIREÇÃO DA PORTA B
/* |||||||+-- PTB0
||||||+--- PTB1
|||||+---- PTB2
||||+----- PTB3
|||+------ PTB4
||+------- PTB5
|+-------- PTB6
+--------- PTB7
*/
PTBDS = 0b11110110; // MODO POTENCIA NA PORTA B
/* |||||||+-- PTB0
||||||+--- PTB1
|||||+---- PTB2
||||+----- PTB3
|||+------ PTB4
||+------- PTB5
|+-------- PTB6
+--------- PTB7
*/
TPMSC = 0b01001000; // Configura TIM
TPMMOD = 798; // Timer 100uS
ADCSC2 = 0b00000000;
ADCCFG = 0b00001000;
if(FSTAT_FACCERR)
FSTAT_FACCERR=1;
FCDIV = vFCDIV;
DisableInterrupts;
// __asm CLI
}
void main(void)
{
volatile unsigned char va, vb, res;
Start_MCU();
va = 10;
vb = 20;
res = flash_page_erase(0xE000); // apaga a página da FLASH
va = flash_write(0xE000, va); // escreve o valor de va no endereço 0xE000
vb = flash_write(0xE001, vb); // escreve o valor de vb no endereço 0xE001
// neste ponto, as variáveis res, va e vb devem estar com o valor 0
// lê as posições 0xE000 e 0xE001 da FLASH e guarda em va e vb
va = flash_read(0xE000);
vb = flash_read(0xE001);
// se va igual a 10 e vb igual a 20, acende o led
if (va==10 && vb==20) PTBD_PTBD6 = 0;
while (1); // fim do programa
}
Voltar para NXP (ex-FreeScale (ex-Motorola))
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante