⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 LM3S系列ADC例程内置的温度传感器
💻 C
字号:
#include  "systemInit.h"
#include  "uartGetPut.h"
#include  <systick.h>
#include  <adc.h>
#include  <stdio.h>


#define  ADCSequEnable          ADCSequenceEnable
#define  ADCSequDisable         ADCSequenceDisable
#define  ADCSequConfig          ADCSequenceConfigure
#define  ADCSequStepConfig      ADCSequenceStepConfigure
#define  ADCSequDataGet         ADCSequenceDataGet


tBoolean ADC_EndFlag = false;                               //  定义ADC转换结束的标志


//  系统节拍定时器初始化
void SysTickInit(void)
{
    SysTickPeriodSet(TheSysClock);                          //  设置SysTick计数器的周期值
    SysTickIntEnable();                                     //  使能SysTick中断
    IntMasterEnable();                                      //  使能处理器中断
    SysTickEnable();                                        //  使能SysTick计数器
}


//  ADC初始化
void adcInit(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_ADC);                    //  使能ADC模块
    SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS);             //  设置ADC采样速率
    ADCSequDisable(ADC_BASE, 3);                            //  配置前先禁止采样序列

    //  采样序列配置:ADC基址,采样序列编号,触发事件,采样优先级
    ADCSequConfig(ADC_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);

    //  采样步进设置:ADC基址,采样序列编号,步值,通道设置
    ADCSequStepConfig(ADC_BASE, 3, 0, ADC_CTL_TS |
                                      ADC_CTL_END |
                                      ADC_CTL_IE);

    ADCIntEnable(ADC_BASE, 3);                              //  使能ADC中断
    IntEnable(INT_ADC3);                                    //  使能ADC采样序列中断
    IntMasterEnable();                                      //  使能处理器中断

    ADCSequEnable(ADC_BASE, 3);                             //  使能采样序列
}


//  ADC采样
unsigned long adcSample(void)
{
    unsigned long ulValue;

    ADCProcessorTrigger(ADC_BASE, 3);                       //  处理器触发采样序列
    while (!ADC_EndFlag);                                   //  等待采样结束
    ADC_EndFlag = false;                                    //  清除ADC采样结束标志
    ADCSequDataGet(ADC_BASE, 3, &ulValue);                  //  读取ADC转换结果

    return(ulValue);
}


//  显示芯片温度值
void tmpDisplay(unsigned long ulValue)
{
    unsigned long ulTmp;
    char cBuf[40];

    ulTmp = 151040UL - 225 * ulValue;

    sprintf(cBuf, "%ld.", ulTmp / 1024);
    uartPuts(cBuf);

    sprintf(cBuf, "%ld", (ulTmp % 1024) / 102);
    uartPuts(cBuf);

    uartPuts("℃\r\n");
}


int main(void)
{
    unsigned long ulValue;

    jtagWait();                                             //  防止JTAG失效,重要!
    clockInit();                                            //  时钟初始化:PLL,12.5MHz
    uartInit();                                             //  UART初始化
    adcInit();                                              //  ADC初始化
    SysTickInit();                                          //  系统节拍定时器初始化

    for (;;)
    {
        SysCtlSleep();                                      //  睡眠,减少耗电以降低温度
        ulValue = adcSample();                              //  唤醒后ADC温度采样
        tmpDisplay(ulValue);                                //  通过UART显示芯片温度值
    }
}


//  SysTick计数器的中断服务函数
void SysTick_ISR(void)
{
    //  仅用于唤醒CPU,而不需要做其他事情
}


//  ADC采样序列3的中断
void ADC_Sequence_3_ISR(void)
{
    unsigned long ulStatus;

    ulStatus = ADCIntStatus(ADC_BASE, 3, true);             //  读取中断状态
    ADCIntClear(ADC_BASE, 3);                               //  清除中断状态,重要

    if (ulStatus != 0)                                      //  如果中断状态有效
    {
        ADC_EndFlag = true;                                 //  置位ADC采样结束标志
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -