generation_mbed2

Dependencies:   202hm2_slave mbed

Fork of 202hm2_slave by Yujing Qian

main.cpp

Committer:
allonq
Date:
2014-03-13
Revision:
1:76a206e19490
Parent:
0:7c4f7de16626
Child:
2:4457eb1e9b83

File content as of revision 1:76a206e19490:

//this is a program built for the slave mbed(bed1)
#include "mbed.h"
#include "MKL46Z4.h"

#define buffer_size 9
DigitalOut LED(LED_RED);
Serial pc(USBTX,USBRX);

Serial uart(PTE0, PTE1);
static int loop_num=0;
int state=0;
int buffered=0;
uint32_t T2=0;
uint32_t T3=0;
int delay=0;
uint32_t mod=0;
char buffer[buffer_size];
int buff=0;
uint32_t TIME(){return loop_num*mod+TPM0->CNT;}


void synchronize(){
    switch(state){
    case 0:{pc.printf("state0");
            if(uart.readable()&&buff<4){buffer[buff]=uart.getc();buff++;}
            else if(buff==4){
            pc.printf("0=%d\n",buffer[0]);
            pc.printf("1=%d\n",buffer[1]);
            pc.printf("2=%d\n",buffer[2]);
            pc.printf("3=%d\n",buffer[3]);
            T2=TIME();
            mod=((int)buffer[3])<<24+((int)buffer[2])<<16+((int)buffer[1])<<8+((int)buffer[0]);
                pc.printf("mod=%d",mod);
                pc.printf("\n");
            TPM0->MOD=mod;           
            state++;break;}//sending a 9 char command
            else break;
            }
    case 1: {
        T3=TIME();
        char* tmp=(char*)&T2;
        pc.printf("state1\n");
        uart.putc((*tmp));
        uart.putc((*(tmp+1)));
        uart.putc((*(tmp+2)));
        uart.putc((*(tmp+3)));
        state++;break;
        }// send T2 value
    case 2:{
        
        char* tmp=(char*)&T3;
        uart.putc((*tmp));
        uart.putc((*(tmp+1)));
        uart.putc((*(tmp+2)));
        uart.putc((*(tmp+3)));
        state++;break;
        }//send T3           
    case 3:{
        pc.printf("wait for lanch state=%d\n",state);
            buffer[0]=uart.getc();
            buffer[1]=uart.getc();
            buffer[2]=uart.getc();
            buffer[3]=uart.getc();
            
            loop_num=0;
            TPM0->CNT=0x0;
            TPM0->SC=0x00000048;
            NVIC_DisableIRQ(TPM0_IRQn);    
            state++;
            break;//luanch   
        }
    }
    }
    
void TPM0_IRQHandler(void){ 
        //if((TPM0->SC & 0x0080)==0x0080){
            if(LED){LED=0;}
            else {LED=1;loop_num++;}
            //pc.printf("MOD=%d",TPM0->MOD);
            //pc.printf("Global_time=%d",loop_num);
            //pc.printf(": %d\n",TPM0->CNT);
            TPM0->SC|= 0x000000c8;
            NVIC_ClearPendingIRQ(TPM0_IRQn);
            //pc.printf("SC_after=%d\n",TPM0->SC);
            //}//pc.printf("count=%d",TPM0->CNT);
            return;               
    }


    
void Syc(){    
    state=0;
    NVIC_DisableIRQ(TPM0_IRQn);
    NVIC_ClearPendingIRQ(TPM0_IRQn);  
    pc.printf("set=%d\n",state);     
    while(state<4){synchronize();}
      
    }
void Initial(){
    LED=1;
    SIM->SOPT2=0x07000000;
    SIM->SCGC6=0x01000000;//enable TPM 0,1
    TPM0->SC=0x0;
    //-------------------CnSC-----------------------
    volatile uint32_t * ptrMyReg;
    volatile uint32_t prev;
    ptrMyReg = (volatile uint32_t *) 0x4003800C;//C0SC 
    prev = *ptrMyReg;
    prev = prev | 0x00000040;
    *ptrMyReg = prev;
    //----------------------------------------------
    TPM0->CNT=0x0;
    TPM0->SC=0x00000040;
    TPM0->MOD=0x000000ff;
    TPM0->SC=0x00000048;//0008
    

    }
int main() {
    Initial();    
    pc.baud(9600);
        
    NVIC_SetVector(TPM0_IRQn, (uint32_t)&TPM0_IRQHandler);
    NVIC_SetPriority(TPM0_IRQn, 1);
    NVIC_EnableIRQ(TPM0_IRQn); 
    char tmp;
    pc.printf("done");
    
    
    while(1){
        if(uart.readable()){pc.printf("???\n");
        tmp=uart.getc();pc.printf(&tmp);
        if(tmp=='#')Syc();}
    }
}