📄 main1.c.bak
字号:
#include "config.h"
#include "extint.h"
#include "type.h"
volatile uint8 rcv_buf[40]; // UART0数据接收缓冲区
volatile uint8 rcv_new; // 接收新数据标志
volatile uint32 rcv_num;
uint8 UART0Buffer[20];
uint32 sendbit[20];
uint32 viewtemp;
volatile uint32 powerdown;
void SendDataTest(void);
void CapDataTest(void);
//void EINT2_Handler(void);
//void Uart0_Handler(void);
void DAC_Test(void);
uint32 ADC_Test(void);
void __irq IRQ_UART0(void)
{
uint32 i,uartiir;
uartiir=U0IIR&0x0f;
if (uartiir==0x04)
{
rcv_new = 1; // 设置接收到新的数据标志
for (i=0;i<14;i++)
rcv_buf[rcv_num+i]=U0RBR; // 读取FIFO的数据,并清除中断
rcv_num=rcv_num+14;
}
if (uartiir==0x0c)
{
rcv_new=1;
i=U0LSR;
IOPIN=IOPIN^0x00800000;
}
VICVectAddr = 0x00; // 中断处理结束
}
void __irq IRQ_EINT2(void)
{
IOSET=0x00800000;
EXTINT=0x04; // 清除EINT0中断标志
VICVectAddr = 0x00; // 通知VIC向量中断结束
}
void VIC_Init(void)
{
IRQEnable(); // 使能IRQ中断
VICIntSelect=0x00000000; // 设置所有的通道为IRQ中断
VICVectCntl0=0x20|06; // UART0分配到IRQ slot0,即最高优先级
VICVectAddr0=(uint32)IRQ_UART0; // 设置UART0向量地址
VICVectCntl1=0x20|16; // 分配EINT2中断到向量中断2
VICVectAddr1=(uint32)IRQ_EINT2; // 设置EINT2中断服务程序地址
EXTINT=0x04; // 清除EINT3中断标志
VICIntEnable=(1<<06)|(1<<16); // 使能UART0/EINT2中断
}
void UARTInit(uint32 baudrate)
{
uint32 Fdiv;
U0LCR=0x83; /* 8 bits, no Parity, 1 Stop bit */
Fdiv=(Fpclk/16)/baudrate ; /*baud rate */
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03; /* DLAB = 0 */
//U0LCR=0x43; /* DLAB = 0 */
//U0FCR=0x07; /* Enable and reset TX and RX FIFO. */
U0FCR=0xc3; /* Enable and reset TX and RX FIFO. */
//U0IER = 0x01; // 允许RBR中断,即接收中断
U0IER = 0x05; // 允许RBR中断,即接收中断
rcv_num=0;
}
void UARTSend(uint8 *BufferPtr, uint32 Length )
{
while (Length!=0)
{
while ((U0LSR&0x20)==0x20)
{
U0THR=*BufferPtr;
BufferPtr++;
Length--;
}
}
}
void EINT2_Init(void)
{
EXTMODE=EINT2_EDGE; // INT2 edge trigger
EXTPOLAR=0; // INT2 is falling edge by default
}
__inline void EnableIRQ(void)
{
int tmp;
__asm
{
MRS tmp, CPSR
BIC tmp, tmp, #0x80
MSR CPSR_c, tmp
}
}
void Re_Power_Init(void)
{
#ifdef __DEBUG_RAM
MEMMAP = 0x2; //remap
#endif
#ifdef __DEBUG_FLASH
MEMMAP = 0x1; //remap
#endif
#ifdef __IN_CHIP
MEMMAP = 0x1; //remap
#endif
/* 设置系统各部分时钟 */
/* Set system timers for each component */
PLLCON = 1;
#if (Fpclk / (Fcclk / 4)) == 1
VPBDIV = 0;
#endif
#if (Fpclk / (Fcclk / 4)) == 2
VPBDIV = 2;
#endif
#if (Fpclk / (Fcclk / 4)) == 4
VPBDIV = 1;
#endif
#if (Fcco / Fcclk) == 2
PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5);
#endif
#if (Fcco / Fcclk) == 4
PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5);
#endif
#if (Fcco / Fcclk) == 8
PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5);
#endif
#if (Fcco / Fcclk) == 16
PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5);
#endif
PLLFEED = 0xaa;
PLLFEED = 0x55;
while((PLLSTAT & (1 << 10)) == 0);
PLLCON = 3;
PLLFEED = 0xaa;
PLLFEED = 0x55;
/* 设置存储器加速模块 */
/* Set memory accelerater module*/
MAMCR = 0;
#if Fcclk < 20000000
MAMTIM = 1;
#else
#if Fcclk < 40000000
MAMTIM = 2;
#else
MAMTIM = 3;
#endif
#endif
MAMCR = 2;
}
void ADC_Init(void)
{
uint32 loop;
AD0CR = 1 | // SEL=8,选择通道3
((Fpclk / 4000000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
(0 << 16) | // BURST=0,软件控制转换操作
(0 << 17) | // CLKS=0, 使用11clock转换
(1 << 21) | // PDN=1,正常工作模式
(0 << 22) | // TEST1:0=00,正常工作模式
(1 << 24) | // START=1,直接启动ADC转换
(0 << 27); // 直接启动ADC转换时,此位无效
loop=1000;
while (loop-->0)
{
}
loop= AD0DR; // 读取ADC结果,并清除DONE标志位
}
uint32 ADC_Test(void)
{
uint32 ADC_Data;
AD0CR |= 1 << 24; // 再次启动转换
//IOSET=0x00200000;
while ((AD0DR & 0x80000000) == 0)
{
} // 等待转换结束
//IOCLR=0x00200000;
ADC_Data = AD0DR; // 读取ADC结果
ADC_Data = (ADC_Data >> 6) & 0x3ff;
ADC_Data = ADC_Data * 3300;
return( ADC_Data / 1024);
}
void PWM_Init(void)
{
PWMTCR=0x00000002; /* Counter Reset */
PWMPR=27; /* count frequency:Fpclk */
PWMMCR=0x00; //不使用中断
PWMMR0=1000; /* set PWM cycle */
PWMMR5=350;
PWMLER=0x20;
PWMPCR=0x2000;
PWMTCR=0x00000009; /* counter enable, PWM enable */
}
void SPI_Init()
{
S0PCR=0x20;
S0PCCR=0x10;
SSPCR0=0x000f;
SSPCR1=0x02;
SSPCPSR=0x0a;
}
int main (void)
{
uint32 test,loop;
IODIR=0x00B00C04;
//IO1DIR=0x03FF0000;
IO1DIR=0x00000000;
//CAP0.0 P0.30
//CAP0.3 P0.29
//AD0.1 P0.28
//DAC P0.25
//MAT0.2 P0.16
//还没使能EINT1 =P0.3
//PWM5 P0.21
//SPI0 P0.4--P0.6
//SPI1 P0.17--P0.19
//EINT2 P0.15
PINSEL0=0x80001505; //RxD0 TxD0 SPI0 EINT2
//PINSEL0=0x00000005; //RxD0 TxD0
//PINSEL1=0x390E0402;
PINSEL1=0x390E04aa; //SPI1
PINSEL2=0x00000004;
UART0Buffer[0]=0x55;
UART0Buffer[1]=0x00;
UART0Buffer[2]=0x55;
UART0Buffer[3]=0x00;
UART0Buffer[4]=0x55;
UART0Buffer[5]=0x00;
UART0Buffer[6]=0x55;
UART0Buffer[7]=0x00;
UART0Buffer[8]=0x55;
UART0Buffer[9]=0x00;
UART0Buffer[10]=0x55;
UART0Buffer[11]=0x00;
UART0Buffer[12]=0x55;
UART0Buffer[13]=0x00;
UART0Buffer[14]=0x55;
UART0Buffer[15]=0x00;
UART0Buffer[16]=0x55;
UART0Buffer[17]=0x00;
UART0Buffer[18]=0x55;
UART0Buffer[19]=0x00;
sendbit[0]=691;
sendbit[1]=3180;
sendbit[2]=8156;
sendbit[3]=691;
sendbit[4]=2074;
sendbit[5]=2074;
sendbit[6]=691;
sendbit[7]=691;
sendbit[8]=691;
sendbit[9]=207400;
sendbit[10]=691;
T0TCR=0x00000001;
//T0MCR=0x00000003;
//T0EMR=0x31;
VIC_Init();
UARTInit(115200);
//ADC_Init();
EINT2_Init();
PWM_Init();
//SPI_Init();
IOSET=0x00800000;
//PCON = 0x06;
while(1)
{
if (rcv_new == 1)
{
rcv_new =0;
rcv_num=0;
IOPIN=IOPIN^0x00800000;
UARTSend(UART0Buffer,20);
}
}
while(1)
{
test=30;
while(test>0)
//while(test-->0)
{
//IOPIN=IOPIN^0x00800000;
IOSET=0x00100000;
SSPDR=0x55;
SSPDR=0xaa;
SSPDR=0x55;
SSPDR=0xaa;
SSPDR=0x55;
SSPDR=0xaa;
SSPDR=0x55;
SSPDR=0x55;
SSPDR=0xaa;
SSPDR=0xaa;
IOCLR=0x00100000;
if ((S0PSR&0x80)==0x80)
test=S0PDR;
//S0PSR&=0x7f;
S0PDR=0x55;
while ((S0PSR&0x80)==0x00)
//S0PSR&=0x7f;
test=S0PDR;
S0PDR=test;
/*
if ((IO1PIN&0x00010000)>0)
IOSET=0x00800000;
else
IOCLR=0x00800000;
*/
//IO1PIN=IO1PIN^0x03FF0000;
//UARTSend(UART0Buffer,4);
//CapDataTest();
//test=ADC_Test();
/*
UART0Buffer[0]=test>>24;
UART0Buffer[1]=test>>16;
UART0Buffer[2]=test>>8;
UART0Buffer[3]=test&0xff;
*/
UARTSend(UART0Buffer,4);
//DAC_Test();
loop=1000000;
while (loop-->0)
{
IOPIN=IOPIN^0x00000C84;
}
SendDataTest();
}
AD0CR = 0<<21; //关闭AD
//PCONP = 0x00; //关闭定时器、RTC、UART等功能部件
EXTWAKE=0X0001;
//VICIntEnable=1<<14;
//PCON = 0x06;
/*
powerdown=1;
while(powerdown==1)
{
}
*/
//VICIntEnClr=1<<14;
}
return 0;
}
void SendDataTest(void)
{
uint32 loop,num,flag;
T0TC=0;
//T0MCR=0x00000003;
//T0MR0=165888;
//T0IR=0x01;
//T0EMR=0x0031;
T0MCR=0x000000c0;
T0MR2=165888;
T0IR=0x04;
T0EMR=0x0304;
flag=0;
loop=1000000;
num=0;
while (loop-->0)
{
if ((T0IR&0x04)>0)
{
flag^=0x1;
if (flag==0x01)
{
T0MR2=691;
if (num==10)
{
T0EMR=0x0104;
}
}
else
{
T0MR2=sendbit[num];
num++;
}
T0IR=0x04;
}
if (num==10)
{
if (T0MR2>100000) //换其他条件可控制匹配提前结束
T0MR2=100000;
}
}
}
void CapDataTest(void)
{
uint32 loop,num,delta,flag;
uint32 numrecord[8];
T0TC=0;
T0MCR=0x00000000;
T0IR=0x91;
T0CCR=0x0e07; //双沿
//T0CCR=0x0a05; //上升沿
//T0CCR=0x0c06; //下降沿
loop=1000000;
flag=0;
while (loop-->0)
{
IOPIN=IOPIN^0x00200000;
if ((T0IR&0x90)>0)
{
T0IR|=0x90;
delta=T0CR3-num;
num=T0CR3;
numrecord[flag]=delta;
flag++;
}
if (flag>1)
{
flag=0;
UART0Buffer[0]=numrecord[1]>>8;
UART0Buffer[1]=numrecord[1]&0xff;
UARTSend(UART0Buffer,2);
}
}
}
void DAC_Test(void)
{
uint32 loop,test;
loop=1023;
while (loop-->0)
{
test=0x200;
IOSET=0x00200000;
DACR=(test<<6)|0x00010000;
test=100;
while (test-->0)
{
}
IOCLR=0x00200000;
test=0x000;
DACR=0x00010000;
test=100;
while (test-->0)
{
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -