如题,请指教:
//---------------------------------------------------
// CPU: LPC1754
// #define XTAL (12000000UL) /* Oscillator frequency */
// SystemFrequency = 72Mhz
//---------------------------------------------------
U16 gAdBuf[ 1024 ]; // 全局变量, Ad 值 buf.
/******************************************************************************************************/
// 下面的程序运行时,大约10来个循环会有一两个通道 AD 值明显错误,怀疑是时序改变了。
/******************************************************************************************************/
//---------------------------------------------------
// 描述:读取 1024 个通道的 AD 值。
// 参数:无
// 返回:无
// 受影响的全局变量:gAdBuf
//---------------------------------------------------
void ScanAll( void )
{
U32 j,k;
NVIC_DisableIRQ( USB_IRQn ); // 关 USB 中断,经查看 ISER0 和 ISER1 寄存器值正确。
for( k = 0; k < 10000; k++ ); // 害怕写寄存器后,不能马上关闭中断,在此加长延时。
for( i = 0; i < 1024; i++ )
{
OpenChannel( i ); // 打开通路.
//=================================================================================
for( k = 0; k < 350; k++ ); // 必须保证每次扫描,本句代码运行时间一致!!!!!!!
//=================================================================================
ADCstart( );
while( ADCisEnd( ) == 0 );
Adcstop( );
gAdBuf = ReadAdcValue( );
}
NVIC_EnableIRQ( USB_IRQn );
}
int main ( void )
{
//...............
NVIC_EnableIRQ( USB_IRQn ); // 整个程序只用到 USB 中断. 经查看 ISER0 和 ISER1 寄存器值正确。
//...............
while( __TRUE )
{
ScanAll( );
}
}
/******************************************************************************************************/
// 如果从不用中断,测试结果完全正常,代码如下。
/******************************************************************************************************/
//---------------------------------------------------
// 描述:读取 1024 个通道的 AD 值。
// 参数:无
// 返回:无
// 受影响的全局变量:gAdBuf
//---------------------------------------------------
void ScanAll( void )
{
U32 j,k;
for( i = 0; i < 1024; i++ )
{
OpenChannel( i ); // 打开通路.
for( k = 0; k < 350; k++ ); // 必须保证每次扫描,本句代码运行时间一致.
ADCstart( );
while( ADCisEnd( ) == 0 );
Adcstop( );
gAdBuf = ReadAdcValue( );
}
}
int main ( void )
{
//...............
// NVIC_EnableIRQ( USB_IRQn ); // 整个程序不用任何中断.
//...............
while( __TRUE )
{
ScanAll( );
}
}
//--------------------------------------------------------------------------------------- |