任务
SCI演示程序
1.插上串口A,设置波特率为9600,8,n,1
2.可以通过串口助手将波特率更改为115200。
3.可以通过串口助手将led(1 2 3)点亮关闭。
4.可以通过串口助手改变定时器时间,同时将定时时间返回到助手。
5.可以接收不定长度的字符串。
#include “MPC5634M_MLQB80.h”
#include “stdio.h”
#define LED1IN SIU.GPDI[191].R
#define LED1OUT SIU.GPDO[191].R
#define LED2IN SIU.GPDI[190].R
#define LED2OUT SIU.GPDO[190].R
#define LED3IN SIU.GPDI[189].R
#define LED3OUT SIU.GPDO[189].R
static uint32_t Result = 0;
static uint32_t ResultInMv = 0;
uint32_t E[5]={0};
uint32_t a=0,i=0;
uint32_t flag=0;
void initADC0(void)
{
EQADC.CFPR[0].R = 0x80801001;
EQADC.CFCR[0].R = 0x0410;
while (EQADC.FISR[0].B.EOQF !=1) {}
EQADC.FISR[0].B.EOQF = 1;
}
void SendConvCmd (void)
{
EQADC.CFPR[0].R = 0x00000000;
EQADC.CFCR[0].R = 0x0410;
}
uint32_t ReadResult(void)
{
SendConvCmd();
while (EQADC.FISR[0].B.RFDF != 1){}
Result = EQADC.RFPR[0].R;
ResultInMv = (uint32_t)((5000*Result)/0x3FFC);
EQADC.FISR[0].B.RFDF = 1;
EQADC.FISR[0].B.EOQF = 1;
return Result;
}
void initSysclk (void)
{
FMPLL.ESYNCR1.B.CLKCFG = 0X7;
FMPLL.SYNCR.R = 0x16080000;
while (FMPLL.SYNSR.B.LOCK != 1) {};
FMPLL.SYNCR.R = 0x16000000;
}
void initESCIA (void)
{
ESCI_A.CR2.R = 0x2000;
ESCI_A.CR1.R = 0x01A1002C;
SIU.PCR[89].R = 0x400;
SIU.PCR[90].R = 0x400;
}
void SCIA_putchar(char c)
{
while (ESCI_A.SR.B.TDRE == 0) {}
ESCI_A.SR.R = 0x80000000;
ESCI_A.DR.B.D = c;
}
unsigned char SCIA_getchar()
{
while (ESCI_A.SR.B.RDRF == 0) {}
ESCI_A.SR.R = 0x40000000;
return ESCI_A.DR.B.D;
}
void SCIA_putstr(char *str)
{
while(*str!=0)
{
SCIA_putchar(*str++);
}
}
void SCIA_CR1_ISR(void)
{
static unsigned char i;
E[i]=SCIA_getchar();
i++;
if(i==4)
{
i=0;
flag=1;
}
ESCI_A.SR.R = 0x20000000;
}
void delay(int ms)
{
int ii,jj;
if (ms<1) ms=1;
for(ii=0;ii<ms;ii++)
for(jj=0;jj<5500;jj++){;}
}
void main(void)
{
vuint32_t ad=0;
char txt[16];
SIU.PCR[191].R = 0x0303;
SIU.PCR[190].R = 0x0303;
SIU.PCR[189].R = 0x0303;
SIU.GPDO[191].R = 1;
SIU.GPDO[190].R = 1;
SIU.GPDO[189].R = 1;
initSysclk();
initESCIA();
INTC_InitINTCInterrupts();
INTC_InstallINTCInterruptHandler(SCIA_CR1_ISR,146,11);
INTC.CPR.B.PRI = 0;
initADC0();
SCIA_putstr(“LongQiu,ADC go!\n”);
while (1)
{
ad=ReadResult();
sprintf(txt," ADC-AN0:%05d\n ",Result);
SCIA_putstr(txt);
sprintf(txt,“ADC-AN0:%d.%03dV\n”,ResultInMv/1000,ResultInMv%1000);
SCIA_putstr(txt);
if(flag == 1)
{
if(E[0] == 0x31)
{
ESCI_A.CR2.R = 0x2000;
ESCI_A.CR1.R = 0x0023002C;
SIU.PCR[89].R = 0x400;
SIU.PCR[90].R = 0x400;
}
else
{
ESCI_A.CR2.R = 0x2000;
ESCI_A.CR1.R = 0x01A1002C;
SIU.PCR[89].R = 0x400;
SIU.PCR[90].R = 0x400;
}
if(E[1] == 0x31) SIU.GPDO[191].R=0;
else SIU.GPDO[191].R=1;
if(E[2] == 0x32) SIU.GPDO[190].R=0;
else SIU.GPDO[190].R=1;
if(E[3] == 0x33) SIU.GPDO[189].R=0;
else SIU.GPDO[189].R=1;
flag=0;
}
delay(500);
}
}