|
先上程序
#define GLOBAL_CLK 1
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
unsigned char SendBuffer[255];
char *SendBuffer1 = "Hello world!" ;
void Delay(int time)//看门狗延时,1ms级
{
U32 val = (PCLK>>3)/1000-1; //计数缓冲器的值,当FCLK=304MHZ时,val=18999
rTCFG0 &= ~(0xff<<8); //定时器输入时钟频率=PCLK/(预分频值+1)/分频值,19MHZ
rTCFG0 |= 3<<8; //定时器2,3,4的预分频值=3
rTCFG1 &= ~(0xf<<12); //定时器3选通输入
rTCFG1 |= 0<<12; //分频值=2
rTCNTB3 = val; //定时器3计数缓冲值=val
rTCMPB3 = val>>1; //定时器3比较缓冲值=val/2
rTCON &= ~(0xf<<16); //定时器3的控制寄存器
rTCON |= 0xb<<16; //自动加载,关闭变相,手动更新计数值和比较值,启动定时器
rTCON &= ~(2<<16); //取消手动更新
while(time--) { //延时次数
while(rTCNTO3>=val>>1);//一直等待计数到小于val/10
while(rTCNTO3<val>>1);//一直等待计数=0,然后重载计数缓冲值
};
}
void __irq Dma0Done(void)
{
unsigned char i;
ClearPending(BIT_DMA0);
Delay(1000);
for(i=0;i<=250;i++) SendBuffer[i]=i;
rDISRC0=(U32)SendBuffer;
rDCON0 |=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(250);
rDMASKTRIG0=(0<<2)|(1<<1)|(0<<0);
}
void DMA_M2M(void)
{
rINTMSK &=~(1<<17); //open the dma0 interrupt
rGPBCON |=((1<<19)|(1<<21)); //GPB9,10 used for nXDACK0,nXDREQ0
rDISRC0=(U32)SendBuffer1; //source data address
rDISRCC0 |=((0<<1)|(0<<0)); //address increment , the source is in the AHB
rDIDST0=(U32)UTXH0; //destination is UTXH0
rDIDSTC0 |=((0<<2)|(1<<1)|(1<<0)); //address not change , APB , enable interrupt
rDCON0 |=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(250);
rDMASKTRIG0=(0<<2)|(1<<1)|(0<<0); //start dma transmitDR_Base=cpar;
}
void Main(void)
{
char mdiv=127,pdiv=2,sdiv=1,hdivn=13,pdivn=11;
ChangeMPllValue(mdiv,pdiv,sdiv);
ChangeClockDivider(hdivn,pdivn);
rGPHCON &= 0xffff0f;
rGPHCON |= 0x0000a0;
rGPHUP = 0x7ff;
rULCON0 = 0x03;
rUCON0 |=((1<<0)|(1<<3)|(2<<10));
//rUCON0 = 0x0005;
rUBRDIV0 = 72;
DMA_M2M();
while(1);
}
程序中的中断语句
void __irq Dma0Done(void)
{
unsigned char i;
ClearPending(BIT_DMA0);
Delay(1000);
for(i=0;i<=250;i++) SendBuffer[i]=i;
rDISRC0=(U32)SendBuffer;
rDCON0 |=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<24)|(1<<23)|(1<<22)|(0<<20)|(250);
rDMASKTRIG0=(0<<2)|(1<<1)|(0<<0);
}
一直卡在for语句 for语句中的i值一直位1加不上去,能不能帮小弟查一下什么问题,之前用DMA实现内存搬运也是这个问题,赋值自动归0不能加上去,现在换串口DMA也是这样,搞了1天都没解决 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|