[转帖]S3C44b0x芯片的模数转换模块的练习与调用程序 |
本程序为samsung的S3C44b0x芯片的模数转换模块的练习与调用程序 本程序的特点: 1. 只需设置所需的转换频率Hz,以及开启与否即可,所有寄存器的配置由程序完成; 2. 所有寄存器配置,只配置和功能相关的寄存器,以及寄存器的相关位,而不影响其他部分。 因此,本程序可以全部或部分的复制到读者的程序中,而不会影响作者程序其他部分的功能; 程序说明: 1. 本程序在ADS1.2和SDT2.51中,使用简易JTAG调试通过; 2. 本贴内容只包含程序的主要部分,其余部分和网络上流传的程序相同,包括inc,44blinb,44binit等; 4. 本程序是在网络上广为流传的相关例程的基础上进行修改而来。 //44BTEST : adc.c /* adc.c, samsung的S3C44b0x芯片的adc测试与练习程序*/ /* 只需设置所需的中断频率Hz,以及开启与否(1,0)即可,所有寄存器的配置由程序完成 */ /* 作者:hawkzone , 版权归作者所有:2004~ */ /* 欢迎大家检查、使用、完善,并传播 */ /* 发表于:www.devarm.com(www.devarm.com) , 20040710*/ #include "myinc.h" int ReadAdc(int ch); void __irq ADC_Int(void); void Test_Adc(void) { int a0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0; while(1) { a0=ReadAdc(0); /* 进行0通道ADC */ a1=ReadAdc(1); a2=ReadAdc(2); a3=ReadAdc(3); a4=ReadAdc(4); a5=ReadAdc(5); a6=ReadAdc(6); a7=ReadAdc(7); Uart_Printf("0:%04d 1:%04d 2:%04d 3:%04d 4:%04d 5:%04d 6:%04d 7:%04d ",a0,a1,a2,a3,a4,a5,a6,a7); Delay(50000); //5s } } /************************************************ * Start and read one channel ADC * ************************************************/ int ReadAdc(int ch) { int i; static int prevCh=-1; /* 静态变量,第一次进入该程序是,ADC通道一定不为-1,因此必须等待信号建立 */ /* 以后进入该程序时,该语句赋值被忽略,preCh的值为上一次转换的通道号 */ |
共2条
1/1 1 跳转至页
[转帖]S3C44b0x芯片的模数转换模块的练习与调用程序

关键词: 转帖 S3C44b0x 芯片 模数 转换 模块 练

if(prevCh!=ch) /* 若当前的转换通道不是上一次转换的通道,等待信号建立 */
{
rADCCON=0x0|(ch<<2); //setup channel.
for(i=0;i<150;i++); //min. 15us
}
rADCCON=0x1|(ch<<2); //Start A/D conversion
while(rADCCON &0x1); //To avoid The first FLAG error case.
//(The START bit is cleared in one ADC clock.)
while(!(rADCCON & 0x40));
for(i=0;i<rADCPSR;i++); //To avoid The second FLAG error case
prevCh=ch; /* 将此时的通道号,作为相对下一次转换的上一次转换通道号 */
return rADCDAT; /* 返回ADC结果 */
}
/************************************************
* Start and read one channel ADC code end *
************************************************/
/************************************************
* ADC initiation *
************************************************/
void ADC_Init(U32 con_rate,U8 start)
{
//rINTCON=0x5;
//rINTMOD=0x0; //All=IRQ mode
pISR_ADC=(unsigned)ADC_Int;
rINTMSK = rINTMSK & (~(BIT_GLOBAL|BIT_ADC)); //start INT,使能中断
if( start ==1) /* 若启动ADC,则进行寄存器配置 */
{
Uart_Printf("The ADC_IN are adjusted to the following values.
");
rADCPSR = MCLK/(2*con_rate*16)-1; /* 根据主频、转换速率计算预定标值 */
Uart_Printf("ADC conv. freq.=%d(Hz)
",(int)(MCLK/(2.*(rADCPSR+1.))/16.) );
rADCCON=0x00; //Enable ADC
Delay(100); //delay for 10ms for ADC reference voltage stabilization.
}
else /* 若不启动ADC则禁止 */
rADCCON=0x20; //Disable ADC
}
/************************************************
* ADC initiation code end *
************************************************/
/************************************************
* ADC conversion interrupt *
************************************************/
void __irq ADC_Int(void)
{
rI_ISPC=BIT_ADC; //clear pending bit
Uart_Printf("
44B0X ADC interrupt test OK !");
}
/************************************************
* ADC conversion interrupt code end *
************************************************/
void Main(void)
{
rSYSCFG=CACHECFG; // Using 8KB Cache//
Port_Init();
Uart_Init(0,57600);
Delay(10);
Uart_Select(0); //Select UART0
Led_Display(0x01);
Uart_Printf("
FS44B0X");
// Uart_Printf("
");
// Uart_Printf("
FS44B0X ADC interrupt test!");
ADC_Init(10000,START); /* 设定转换速率,并启动 */
Test_Adc(); /* 测试及读取ADC结果 */
/* 在ADC_Init函数中,用户只需设置号转换速率,即可启动ADC,无需配置具体的寄存器,这由程序完成 */
/* 初始化完成后,用户可以直接使用ReadADC函数来进行某一通道的ADC,也可以使用类似于Test_Adc函数 */
/* 的形式,建立自己的调用函数 */
}
{
rADCCON=0x0|(ch<<2); //setup channel.
for(i=0;i<150;i++); //min. 15us
}
rADCCON=0x1|(ch<<2); //Start A/D conversion
while(rADCCON &0x1); //To avoid The first FLAG error case.
//(The START bit is cleared in one ADC clock.)
while(!(rADCCON & 0x40));
for(i=0;i<rADCPSR;i++); //To avoid The second FLAG error case
prevCh=ch; /* 将此时的通道号,作为相对下一次转换的上一次转换通道号 */
return rADCDAT; /* 返回ADC结果 */
}
/************************************************
* Start and read one channel ADC code end *
************************************************/
/************************************************
* ADC initiation *
************************************************/
void ADC_Init(U32 con_rate,U8 start)
{
//rINTCON=0x5;
//rINTMOD=0x0; //All=IRQ mode
pISR_ADC=(unsigned)ADC_Int;
rINTMSK = rINTMSK & (~(BIT_GLOBAL|BIT_ADC)); //start INT,使能中断
if( start ==1) /* 若启动ADC,则进行寄存器配置 */
{
Uart_Printf("The ADC_IN are adjusted to the following values.
");
rADCPSR = MCLK/(2*con_rate*16)-1; /* 根据主频、转换速率计算预定标值 */
Uart_Printf("ADC conv. freq.=%d(Hz)
",(int)(MCLK/(2.*(rADCPSR+1.))/16.) );
rADCCON=0x00; //Enable ADC
Delay(100); //delay for 10ms for ADC reference voltage stabilization.
}
else /* 若不启动ADC则禁止 */
rADCCON=0x20; //Disable ADC
}
/************************************************
* ADC initiation code end *
************************************************/
/************************************************
* ADC conversion interrupt *
************************************************/
void __irq ADC_Int(void)
{
rI_ISPC=BIT_ADC; //clear pending bit
Uart_Printf("
44B0X ADC interrupt test OK !");
}
/************************************************
* ADC conversion interrupt code end *
************************************************/
void Main(void)
{
rSYSCFG=CACHECFG; // Using 8KB Cache//
Port_Init();
Uart_Init(0,57600);
Delay(10);
Uart_Select(0); //Select UART0
Led_Display(0x01);
Uart_Printf("
FS44B0X");
// Uart_Printf("
");
// Uart_Printf("
FS44B0X ADC interrupt test!");
ADC_Init(10000,START); /* 设定转换速率,并启动 */
Test_Adc(); /* 测试及读取ADC结果 */
/* 在ADC_Init函数中,用户只需设置号转换速率,即可启动ADC,无需配置具体的寄存器,这由程序完成 */
/* 初始化完成后,用户可以直接使用ReadADC函数来进行某一通道的ADC,也可以使用类似于Test_Adc函数 */
/* 的形式,建立自己的调用函数 */
}
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 |