This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

清华大学TM4C123微处理器原理与实践例程-模数转换器实验程序解析



//模数转换器实验程序解析
//头文件
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/fpu.h"
#include "driverlib/sysctl.h"
#include "driverlib/rom.h"
#include "driverlib/pin_map.h"
#include "grlib/grlib.h"
#include "drivers/cfal96x64x16.h"
#include "driverlib/gpio.h"
#include "driverlib/adc.h"
#include "inc/hw_gpio.h"

int main(void)
{
  tContext sContext;
  tRectangle sRect;
  ui32 ulADC0_Value;
  ui8 ulADC0_v[8];
  ui32 i,j;
  const char chars[16]={"0123456789ABCDEF"};
    
  //使能FPU
  FPUEnable();  
  FPULazyStackingEnable();

  //设置系统时钟为50MHz (400/2/4=50)
  ROM_SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | 
                     SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN);

  //初始化ADC0/PE3
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); 
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
  ROM_GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);
  //设置ADC参考电压为外部3V
  ROM_ADCReferenceSet(ADC0_BASE, ADC_REF_EXT_3V);    
  //配置ADC采集序列
  ROM_ADCSequenceConfigure(ADC0_BASE, 0, 
                   ADC_TRIGGER_PROCESSOR, 0);  
  ROM_ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0 | 
                   ADC_CTL_END | ADC_CTL_IE);
  //使能ADC采集序列
  ROM_ADCSequenceEnable(ADC0_BASE, 0);  
  ROM_ADCIntClear(ADC0_BASE, 0);     
  ROM_ADCIntEnable(ADC0_BASE, 0);     
    
  //初始化显示模块
  CFAL96x64x16Init();
  GrContextInit(&sContext, &g_sCFAL96x64x16);  
 while(1)
 {   
   //触发采集
   ADCProcessorTrigger(ADC0_BASE, 0);  
   //等待采集结束
   while(!ADCIntStatus(ADC0_BASE, 0, false)) ;
   //获取采集结果
   ADCSequenceDataGet(ADC0_BASE, 0, &ulADC0_Value);
   //将采集结果从32位无符号数转化为char
   i=28;
   for(j=0;j<8;j++)
   {
     ulADC0_v[j]=chars[(ulADC0_Value>>i)&0xf];
     i-=4;
   }
   //延时
   SysCtlDelay(SysCtlClockGet() / 12);

  //屏幕的上面24行填充蓝色覆盖上次的显示结果
  sRect.i16XMin = 0;
  sRect.i16YMin = 0;
  sRect.i16XMax = GrContextDpyWidthGet(&sContext) - 1;
  sRect.i16YMax = 23;
  GrContextForegroundSet(&sContext, ClrDarkKhaki);
  GrRectFill(&sContext, &sRect);

  //在颜色块的边缘放置白框
  GrContextForegroundSet(&sContext, ClrWhite);
  GrRectDraw(&sContext, &sRect);

  //显示工程名称和采集结果
  GrContextFontSet(&sContext, g_psFontCm12);
  GrStringDrawCentered(&sContext, ulADC0_v, 8,
              GrContextDpyWidthGet(&sContext) / 2, 10, 0);
  GrStringDrawCentered(&sContext, "ADC Results", -1,
              GrContextDpyWidthGet(&sContext) / 2,
              ((GrContextDpyHeightGet(&sContext) - 24) / 2) + 24, 0);

 //更新显示
 GrFlush(&sContext);
   }
}