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.

[参考译文] CCS/TM4C1294NCPDT:无法使用开关使用外部触发器触发 ADC。

Guru**** 2473260 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/680226/ccs-tm4c1294ncpdt-not-able-to-trigger-the-adc-using-the-external-trigger-using-a-switch

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

你(们)好。

我正在尝试使用外部触发器创建单输入 ADC。 我使用按钮 USR_sw1作为外部触发器。 我在 while 循环 " while (!ADCIntStatus (ADC0_BASE、3、false)"处卡住

并且无法获取采样值。 请帮助我了解到底发生了什么错误。

//
//
//// single_ended.c -演示如何为
//配置 ADC 的示例 单端操作。
//
//版权所有(c) 2010-2016 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//
以源代码和二进制形式重新分发和使用,无论是否
进行//修改,只要
满足以下条件//:
//
重新分发源代码必须保留上述版权
//声明、此条件列表和以下免责声明。
//
//二进制形式的再发行必须复制上述版权
//声明、此条件列表和//

分发随附的//文档和/或其他材料中的以下免责声明。
////
未经

事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。
////
本软件由版权所有者和贡献者提供
//“按原样”,不

承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权
//所有者或贡献者都不对任何直接、间接、偶然、
//特殊、模范、 或相应的损害(包括但不
限于采购替代产品或服务;丧失使用、
//数据或利润; 或业务中断)、无论

出于何种原因使用
本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。
//
//这是 Tiva 固件开发包版本2.1.3.156的一部分。
////
*****************

#include 
#include 
#include "inc/hw_memmap.h"
#include "driverlib/adc.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "utils/ustidio.h"


#include "driverlib/uarts.h"#include "driverlib/uarts.h"



//
//! \addtogroup ADC_examples_list
//! 

单端 ADC (single_ended)

//! //! 此示例展示了如何将 ADC0设置为单端输入并采用 //! AIN0/PE3上的单个采样。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - ADC0外设 //! - GPIO 端口 E 外设(用于 AIN0引脚) //! - AIN0 - PE3 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 操作 //! ADC。 //! - UART0外设 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! -无。 //// ***************** // // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** /*void InitConsole(void){ // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); // //启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART0); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //初始化控制台 I/O 的 UART // UARTStdioConfig (0、115200、16000000); } */ //********* // //为单端输入和单个采样配置 ADC0。 一旦//样本就绪、将设置一个中断标志。 使用轮询方法 //数据将被读取,然后通过 UART0显示在控制台上。 //// ***************** volatile uint32_t adcResult[1]; volatile uint32_t ui32ADCConversionComplete; void InitPortEF (void); void ADC0SS3_handler (void) { // adcResult = pui32ADC0Value; //ADCIntClear (ADC0_BASE、3); // ADC0 DataBase、ADC0 pui32ADC0Value); uint32_t pui32ADC0Value1[1]; uint32_t ui32ADCIntStatus; ui32ADCIntStatus = ADCIntStatus (ADC0_BASE、3、 TRUE); //读取 ADC 值。 ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value1); //设置全局标志 ui32ADCConversionComplete = 1; //清除 ADC 中断标志。 ADCIntClear (ADC0_BASE、3); ADCIntDisable (ADC0_BASE、3); } void InitPortEF (void){ //启用端口 E //SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); //启用端口 F SysCtlPeripheralEnable (void){//启用端口 E //SysCtl_PeripalPorte (SYSCTL_PEDIBLE_3* );// 将 GPIO3*引脚设置为输入引脚3;//将 SysCtl_GPIO_引脚设置为输入;// GPIO3;//设置为输入引脚3 使用将 Launchpad GPIO_PIN_4左侧的开关配置为输入 内部上拉。 // GPIOPinTypeGPIOInput (GPIO_PORTJ_BASE、GPIO_PIN_0); GPIOPadConfigSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_FORMENT_2mA、 GPIO_PIN_TYPE_STD_WPU); GPIOIntTypeSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_FALLING_EDGE); //使 PF4成为 ADC GPIOADCTRIGGEREnable ( GPIO_PORTJ_BASE、GPIO_PIN_0)的触发器; } int main ( TARGET){#RAC129_TRIGGER|(如果已定义) \ 定义(TARGET_IS_TM4C129_RA1)|| \ defined (target_is_TM4C129_RA2) uint32_t ui32SysClock; #endif // //////此数组用于存储从 ADC FIFO 读取的数据。 它 //必须与正在使用的序列发生器的 FIFO 一样大。 此示例 //使用 FIFO 深度为1的序列3。 如果另一个序列 //与更深的 FIFO 一起使用,则必须更改数组大小。 // InitPortEF (); uint32_t pui32ADC0Value[1]; uint32_t value=0; // 使用 PLL 将时钟设置为在20MHz (200MHz/10)下运行。 当 //使用 ADC 时、必须使用 PLL 或提供一个16MHz 时钟 //源。 // TODO:必须更改 SYSCTL_XTAL_值以匹配 电路板上//晶体的值。 // #if defined (target_IS_TM4C129_RA0)|| \ 定义(TARGET_IS_TM4C129_RA1)|| 已 定义\(target_is_TM4C129_RA2) ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、20000000); #SysCtlClockSet (SYSC_UST_PLL/ SYSC_SET )| SYSC_UST_UP (SYSC_SC_SC_SC_SC_UST_SYSC_SC_UST_SYSCL)| SYSC/ SYSC_SC_SC_SC_UST_SYSC_SC_SCL | SYSC_SET (SYSC_SC_UST_SYSC_SC_SC/ SYSC_SC_ 这只是 针对这个示例程序的//、而 ADC 运行不需要。 // //InitConsole(); // 在控制台上显示设置。 // /*UARTprintf ("ADC ->\n"); UARTprintf ("类型:单端\n"); UARTprintf ("示例:一个\n"); UARTprintf ("更新速率:250ms\n"); UARTprintf ("输入引脚:AIN0/PE3\n\n"); */ // //必须启用 ADC0外设才能使用。 // SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); // 对于此示例,ADC0与端口 E7上的 AIN0一起使用。 //您的器件上使用的实际端口和引脚可能不同,请参阅 //数据表以了解更多信息。 GPIO 端口 E 需要启用 //以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); // 为这些引脚选择模拟 ADC 功能。 //请查阅数据表以查看每个引脚分配的函数。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3); // 使用处理器信号触发器启用采样序列3。 当 处理器发送信号以启动 //转换时、序列3 //将执行单个采样。 每个 ADC 模块有4个可编程序列、序列0 //至序列3。 此示例任意使用序列3。 // ADCSequenceConfigure (ADC0_BASE、3、ADC_TRIGGER_EXTERNAL、0); //ADCSequenceConfigure (ADC0_BASE、 3、ADC_TRIGGER_Always、0); // GPIOADCTriggerEnable (GPIO_PORTJ_BASE、GPIO_PIN_0); // //配置序列3上的步骤0。 在 //单端模式(默认)下对通道0 (ADC_CTL_CH0)进行采样、并将中断标志 //(ADC_CTL_IE)配置为在采样完成时设置。 告诉 ADC 逻辑 //这是序列3上的最后一次转换(ADC_CTL_END)。 序列 // 3只有一个可编程步骤。 序列1和2有4个步长、 //序列0有8个可编程步长。 由于我们只使用 序列3进行单次//转换、因此我们将仅配置步骤0。 有关 ADC 序列和步骤的更多//信息、请参考数据表。 // ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END); // 由于采样序列3现在已配置、因此必须将其启用。 // ADCSequenceEnable (ADC0_BASE、3); // 清除中断状态标志。 这样做是为了确保 //中断标志在我们采样前被清除。 // ADCIntClear (ADC0_BASE、3); // NVIC_EnableIRQ (ADC0SS3_IRQn); // 永久采样 AIN0。 显示控制台上的值。 // while (1) { //GPIOADCTriggerEnable (GPIO_PORTJ_BASE、GPIO_PIN_0); //触发 ADC 转换。 SysCtlDelay (7000000); //ADCExternalTrigger (ADC0_BASE、3); 值= GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_0); //如果按下 PF4、则触发 ADC 转换 if ((value & GPIO_PIN_0)=0){ //等待转换完成。 // ADCProcessorTrigger (ADC0_BASE、3); IntMasterEnable (); //IntEnable (INT_ADC0SS3); //ADCIntEnable (ADC0_BASE、 3); IntEnable (INT_ADC0SS3); // while (!ui32ADCConversionComplete); while (!ADCIntStatus (ADC0_BASE、3、false) ){ // ui32ADCConversionComplete = 0; } // //清除 ADC 中断标志。 // ADCIntClear (ADC0_BASE、3); // 读取 ADC 值。 // ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value); } // //在控制台上显示 AIN0 (PE3)数字值。 // // UARTprintf ("AIN0 =%4D\r"、pui32ADC0Value[0]); // 此函数提供了生成恒定长度 //延迟的方法。 函数延迟(以周期为单位)= 3 *参数。 延迟 //任意250ms。 // #if defined (target_IS_TM4C129_RA0)|| \ 定义(TARGET_IS_TM4C129_RA1)|| \ 定义(target_is_TM4C129_RA2) SysCtlDelay (ui32SysClock / 12); #else SysCtlDelay (SysCtlClockGet ()/ 12); #endif }

启动文件如下所示:

//
//
//// startup_ccs.c -与 TI 的 Code Composer Studio 一起使用的启动代码。
//
//版权所有(c) 2013-2016 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//
//德州仪器(TI)提供此软件仅供
和//仅供 TI 的微控制器产品使用。 软件归
// TI 和/或其供应商所有,并受适用的版权
//法律保护。 您不能将此软件与"病毒"开源
//软件组合在一起以形成更大的程序。
//
//此软件按“原样”提供,且存在所有故障。
//对于

本软件,不作任何明示、暗示或法定的保证,包括但不限于对适销性和适用性的暗示保证//特定用途。 在任何
//情况下、TI 不对任何
原因造成的特殊、意外或必然//损害负责。
//
//这是 EK-TM4C1294XL 固件包版本2.1.3.156的一部分。
////
*****************

#include 
#include "inc/hw_NVIC.h"
#include "inc/hw_types.h"

//*********
//
//转发默认故障处理程序的声明。
////
*****************
void ResetISR (void);
static void NmiSR (void);
static void FaultISR (void);
static void IntDefaultHandler (void);

//*********
//
//
启动//处理器时要调用的复位处理程序的外部声明
//
*********
extern void _c_int00 (void);
extern void ADC0SS3_handler (void);

//*********
//
//标记栈顶的链接器变量。
////
*****************
extern uint32_t __stack_top;

//*********
//
//矢量表。 请注意、必须在这个上放置适当的结构、
以//确保它在物理地址0x0000.0000处结束、或者
在//程序的开头(如果位于0以外的起始地址)结束。
////
*****************
#pragma DATA_SECTION (g_pfnVectors、".intvecs")
void (* const g_pfnVectors [])(void)=
{
(void (*)(void)((uint32_t)&_stack_top)、
//初始堆栈指针
ResetISR、 //重置处理程序
NmiSR、 // NMI 处理程序
FaultISR、 //硬故障处理程序
IntDefaultHandler、 // MPU 故障处理程序
IntDefaultHandler、 //总线故障处理程序
IntDefaultHandler、 //用法故障处理程序
0、 //保留
0、 //保留
0、 //保留
0、 //保留
IntDefaultHandler、 // SVCall 处理程序
IntDefaultHandler、 //调试监视器处理程序
0、 //保留
IntDefaultHandler、 // PendSV 处理程序
IntDefaultHandler、 // SysTick 处理程序
IntDefaultHandler、 // GPIO 端口 A
IntDefaultHandler、 // GPIO 端口 B
IntDefaultHandler、 // GPIO 端口 C
IntDefaultHandler、 // GPIO 端口 D
IntDefaultHandler、 // GPIO 端口 E
IntDefaultHandler、 // UART0 Rx 和 Tx
IntDefaultHandler、 // UART1 Rx 和 Tx
IntDefaultHandler、 // SSI0 Rx 和 Tx
IntDefaultHandler、 // I2C0主机和从机
IntDefaultHandler、 // PWM 故障
IntDefaultHandler、 // PWM 发生器0
IntDefaultHandler、 // PWM 发生器1
IntDefaultHandler、 // PWM 发生器2.
IntDefaultHandler、 //正交编码器0
IntDefaultHandler、 // ADC 序列0
IntDefaultHandler、 // ADC 序列1
IntDefaultHandler、 // ADC 序列2.
ADC0SS3_handler、 // ADC 序列3.
IntDefaultHandler、 //看门狗计时器
IntDefaultHandler、 // Timer 0子计时器 A
IntDefaultHandler、 // Timer 0子计时器 B
IntDefaultHandler、 //计时器1子计时器 A
IntDefaultHandler、 //计时器1子计时器 B
IntDefaultHandler、 //计时器2子计时器 A
IntDefaultHandler、 //计时器2子计时器 B
IntDefaultHandler、 //模拟比较器0
IntDefaultHandler、 //模拟比较器1
IntDefaultHandler、 //模拟比较器2.
IntDefaultHandler、 //系统控制(PLL、OSC、BO)
IntDefaultHandler、 //闪存控制
IntDefaultHandler、 // GPIO 端口 F
IntDefaultHandler、 // GPIO 端口 G
IntDefaultHandler、 // GPIO 端口 H
IntDefaultHandler、 // UART2 Rx 和 Tx
IntDefaultHandler、 // SSI1 Rx 和 Tx
IntDefaultHandler、 //计时器3子计时器 A
IntDefaultHandler、 //计时器3子计时器 B
IntDefaultHandler、 // I2C1主设备和从设备
IntDefaultHandler、 // CAN0
IntDefaultHandler、 // CAN1
IntDefaultHandler、 //以太网
IntDefaultHandler、 //休眠
IntDefaultHandler、 // USB0
IntDefaultHandler、 // PWM 发生器3.
IntDefaultHandler、 // uDMA 软件传输
IntDefaultHandler、 // uDMA 错误
IntDefaultHandler、 // ADC1序列0
IntDefaultHandler、 // ADC1序列1
IntDefaultHandler、 // ADC1序列2.
IntDefaultHandler、 // ADC1序列3.
IntDefaultHandler、 //外部总线接口0
IntDefaultHandler、 // GPIO 端口 J
IntDefaultHandler、 // GPIO 端口 K
IntDefaultHandler、 // GPIO 端口 L
IntDefaultHandler、 // SSI2 Rx 和 Tx
IntDefaultHandler、 // SSI3 Rx 和 Tx
IntDefaultHandler、 // UART3 Rx 和 Tx
IntDefaultHandler、 // UART4 Rx 和 Tx
IntDefaultHandler、 // UART5 Rx 和 Tx
IntDefaultHandler、 // UART6 Rx 和 Tx
IntDefaultHandler、 // UART7 Rx 和 Tx
IntDefaultHandler、 // I2C2主设备和从设备
IntDefaultHandler、 // I2C3主设备和从设备
IntDefaultHandler、 //计时器4子计时器 A
IntDefaultHandler、 //计时器4子计时器 B
IntDefaultHandler、 //计时器5子计时器 A
IntDefaultHandler、 //计时器5子计时器 B
IntDefaultHandler、 // FPU
0、 //保留
0、 //保留
IntDefaultHandler、 // I2C4主设备和从设备
IntDefaultHandler、 // I2C5主设备和从设备
IntDefaultHandler、 // GPIO 端口 M
IntDefaultHandler、 // GPIO 端口 N
0、 //保留
IntDefaultHandler、 //改动
IntDefaultHandler、 // GPIO 端口 P (摘要或 P0)
IntDefaultHandler、 // GPIO 端口 P1
IntDefaultHandler、 // GPIO 端口 P2
IntDefaultHandler、 // GPIO 端口 P3
IntDefaultHandler、 // GPIO 端口 P4
IntDefaultHandler、 // GPIO 端口 P5
IntDefaultHandler、 // GPIO 端口 P6
IntDefaultHandler、 // GPIO 端口 P7
IntDefaultHandler、 // GPIO 端口 Q (摘要或 Q0)
IntDefaultHandler、 // GPIO 端口 Q1
IntDefaultHandler、 // GPIO 端口 Q2
IntDefaultHandler、 // GPIO 端口 Q3
IntDefaultHandler、 // GPIO 端口 Q4
IntDefaultHandler、 // GPIO 端口 Q5
IntDefaultHandler、 // GPIO 端口 Q6
IntDefaultHandler、 // GPIO 端口 Q7
IntDefaultHandler、 // GPIO 端口 R
IntDefaultHandler、 // GPIO 端口 S
IntDefaultHandler、 // SHA/MD5 0
IntDefaultHandler、 // AES 0
IntDefaultHandler、 // DES3DES 0
IntDefaultHandler、 // LCD 控制器0
IntDefaultHandler、 //计时器6子计时器 A
IntDefaultHandler、 //计时器6子计时器 B
IntDefaultHandler、 //计时器7子计时器 A
IntDefaultHandler、 // Timer 7子计时器 B
IntDefaultHandler、 // I2C6主从设备
IntDefaultHandler、 // I2C7主设备和从设备
IntDefaultHandler、 // HIM 扫描矩阵键盘0
IntDefaultHandler、 //单线0
IntDefaultHandler、 // HIM PS/2 0
IntDefaultHandler、 // HIM LED 序列发生器0
IntDefaultHandler、 // HIM 消费者 IR 0
IntDefaultHandler、 // I2C8主设备和从设备
IntDefaultHandler、 // I2C9主设备和从设备
IntDefaultHandler // GPIO 端口 T
};

//*********
//
//这是在处理器首次开始执行
时调用的代码//在复位事件之后。 只执行绝对必要的设置,
//之后调用应用程序提供的 entry()例程。 任何花式
//操作(例如根据复位原因寄存

器做出决策、和//复位该寄存器中的位)都只能由//应用程序控制。
////
*****************
void
ResetISR (void)
{
//
//跳转到 CCS C 初始化例程。 这将启用
//浮点单元,因此不需要在此处执行此操作。
//
_asm (".global _c_int00\n"
" _c_int00");
}

//*********
//
//这是当处理器接收到 NMI 时被调用的代码。 这个
//只需进入一个无限循环,保留系统状态供
调试器检查//。
////
*****************
静态空
NmiSR (void)
{
//
//输入无限循环。
//
while (1)
{
}
}

//*********
//
//这是处理器收到故障
//中断时调用的代码。 这只是进入一个无限循环、保持系统状态
//供调试器检查。
////
*****************
静态空
FaultISR (空)
{
//
//输入无限循环。
//
while (1)
{
}
}

//*********
//
//这是当处理器收到意外
的//中断时调用的代码。 这只是进入一个无限循环、保持系统状态
//供调试器检查。
////
*****************
静态空
IntDefaultHandler (void)
{
//
//进入无限循环。
//
while (1)
{
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Snehal、您好!

    您似乎正在使用基于以下文章的代码: https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/430355/1543938#1543938

    我很高兴您使用了该参考示例、我熟悉它并在以前运行过它、对此没有任何问题。 我注意到您的实施有几个不同之处、因此这可能是您的问题所在。

    1) 1)您应该在 InitPortEF 之前调用 SYsCtlClockSet、以便首先配置系统时钟。

    2) 2)您的主循环中包含以下代码、但您所描述的示例不需要这些代码。 INT_ADC0SS3的 IntEnable 用于触发 ADC、以便根据带有 GPIO 引脚的 ADC 中断开始处理。 当引脚被切换时、ADC 会在该点自动运行、而 GPIO 只是用来触发该操作。 您所描述的是希望使用 GPIO 触发器从 ADC 采样。 这是两种不同的情况、虽然您可能在最近的帖子中看到这是一个问题、但您的示例中不需要 IntEnable、也不需要 ADC ISR、因为根据您描述的目标、您的情况会更简单。

    //等待转换完成。
    // ADCProcessorTrigger (ADC0_BASE、3);
    IntMasterEnable();
    //IntEnable (INT_ADC0SS3);
    //ADCIntEnable (ADC0_BASE、3);
    IntEnable (INT_ADC0SS3); 

    我会将上述代码全部注释掉。

    尝试这些更改并查看结果。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    我是否可以完全同意您的海报指示-在大多数情况下-"少就是多!"

    负担过重-有多项任务-以及不必要的复杂性-经常且可预测-会导致海报 的"Krash & Burn!"   (我们仍然可以... "闻到烟味。")

    中断的使用-始终是挑战-需要很详细的信息-并且应该尝试-只有基本操作已经被测试和确认之后。

    当然,这种简化 (以及由此产生的成功) 已被归类为“亲吻”,这比任何(替代)描述——我们(低)的人——都可能尝试的更令人难忘!   (失败的尝试)    和我们的-肯定-立即被遗忘... 不是“吻”— “特别是这样” ,“ 吻”(单独)带来的持久好处!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Ralph,

    非常感谢您提供的输入。 是的、您是对的、我基于 以下文章引用了代码: https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/430355/1543938#1543938

     尽管现在我已经更改了代码 A 位,但我已经在主循环中配置了开关,并删除了我最初使用的 InitPortEF 函数。 正如您在第2点提到的,我已经注释掉了 IntEnable (INT_ADC0SS3);和 IntMasterEnable();。 由于我对这个话题很天真,我很少有误解,你的意见帮助我解决了这些问题。

    现在、代码工作正常。

    下面是当前正常工作的代码。

    // 
    //
    // single_ended.c -演示如何为配置 ADC 的示例
    //                 单端操作。
    //
    //版权所有(c) 2010-2017 Texas Instruments Incorporated。  保留所有权利。
    //软件许可协议
    //
    //  以源代码和二进制形式重新分发和使用,有无
    //  如果满足以下条件,则允许进行修改
    //  满足:
    //
    //  重新分发源代码必须保留上述版权
    //  注意、此条件列表和以下免责声明。
    //
    //  二进制形式的重新分发必须复制上述版权
    //  注意、中的条件列表和以下免责声明
    //  随提供的文档和/或其他材料
    //  分布。
    //
    //  德州仪器公司的名称和的名称都不是
    //  其贡献者可用于认可或推广衍生产品
    //  未经特定的事先书面许可,从该软件下载。
    //
    //本软件由版权所有者和作者提供
    //“原样”以及任何明示或暗示的保证,包括但不包括
    //限于对适销性和适用性的暗示保证
    //一个特定的目的是免责的。 在任何情况下、版权均不得
    //所有者或贡献者应对任何直接、间接、偶然、
    //特殊、典型或必然的损害(包括但不包括)
    //仅限于采购替代货物或服务;
    //数据或利润;或业务中断)
    //责任理论,无论是合同责任、严格责任还是侵权行为
    //(包括疏忽或其他)以任何方式因使用而产生
    //此软件,即使已被告知可能会发生此类损坏。
    //
    //这是 Tiva 固件开发包的修订版2.1.4.178的一部分。
    //
    //

    #include
    #include
    #include "inc/hw_memmap.h"
    #include "driverlib/adc.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "utils/uartstdio.h"

    #include
    #include
    #include "inc/hw_memmap.h"
    #include "driverlib/adc.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "utils/uartstdio.h"
    #include "driverlib/rom.h"
    #include "driverlib/interrupt.h"

    #include "inc/hw_ints.h"

    //
    //
    //! 添加到组 ADC_Examples_list
    //!

    单端 ADC (single_ended)


    //!
    //! 此示例展示了如何将 ADC0设置为单端输入并采用
    //! AIN0/PE3上的单个采样。
    //!
    //! 此示例使用以下外设和 I/O 信号。  您必须执行的操作
    //! 查看这些内容并根据您自己的董事会的需要进行更改:
    //! - ADC0外设
    //! - GPIO 端口 E 外设(用于 AIN0引脚)
    //! AIN0 - PE3
    //!
    //! 以下 UART 信号仅配置为显示控制台
    //! 消息。  操作时不需要这些
    //! ADC。
    //! UART0外设
    //! - GPIO 端口 A 外设(用于 UART0引脚)
    //! - UART0RX - PA0
    //! - UART0TX - PA1
    //!
    //! 此示例使用以下中断处理程序。  来使用该示例
    //! 在您自己的应用程序中、您必须将这些中断处理程序添加到
    //! 矢量表。
    //! -无。
    //
    //
    //volatile uint32_t adcResult[1];

    //volatile unit32_t pui32ADC0Value1[1];

    void ADC0SS3_handler (void)

      //unit32_t adcResult = 0;

       //adcResult= ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value1);
    //
       ADCIntClear (ADC0_BASE、3);




    //
    //
    //此函数将 UART0设置为用于控制台显示信息
    //因为示例正在运行。
    //
    //
    无效
    InitConsole (空)

       //
       //启用用于 UART0引脚的 GPIO 端口 A。
       // TODO:将其更改为您正在使用的 GPIO 端口。
       //
       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

       //
       //为端口 A0和 A1上的 UART0功能配置引脚复用。
       //如果您的器件不支持引脚复用、则无需执行此步骤。
       // TODO:更改此选项以选择您正在使用的端口/引脚。
       //
       GPIOPinConfigure (GPIO_PA0_U0RX);
       GPIOPinConfigure (GPIO_PA1_U0TX);

       //
       //启用 UART0以便我们可以配置时钟。
       //
       SysCtlPeripheralEnable (SYSCTL_Periph_UART0);

       //
       //使用内部16MHz 振荡器作为 UART 时钟源。
       //
       UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);

       //
       //为这些引脚选择替代(UART)功能。
       // TODO:更改此选项以选择您正在使用的端口/引脚。
       //
       GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

       //
       //初始化控制台 I/O 的 UART
       //
       UARTStdioConfig (0、115200、16000000);


    //
    //
    //为单端输入和单个采样配置 ADC0。  一次
    //样本就绪,将设置中断标志。  使用轮询方法、
    //数据将被读取,然后通过 UART0显示在控制台上。
    //
    //
    内部
    main (空)

    #if defined (target_IS_TM4C129_RA0)||                                        \
       已定义(TARGET_IS_TM4C129_RA1)||                                        \
       已定义(TARGET_IS_TM4C129_RA2)
       uint32_t ui32SysClock;
    #endif

       //
       //该数组用于存储从 ADC FIFO 读取的数据。 它
       //必须与正在使用的序列发生器的 FIFO 一样大。  此示例
       //使用 FIFO 深度为1的序列3。  如果是另一个序列
       //与更深的 FIFO 一起使用,则必须更改数组大小。
       //
       uint32_t pui32ADC0Value[1];
       uint32_t 值= 0;

       //
       //使用 PLL 将时钟设置为以20MHz (200MHz/10)运行。  时间
       //使用 ADC,您必须使用 PLL 或提供16 MHz 时钟
       //源。
       // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
       板上的//晶体。
       //
    #if defined (target_IS_TM4C129_RA0)||                                        \
       已定义(TARGET_IS_TM4C129_RA1)||                                        \
       已定义(TARGET_IS_TM4C129_RA2)
       ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
                                          SYSCTL_OSC_MAIN |
                                          SYSCTL_USE_PLL |
                                          SYSCTL_CFG_VCO_480)、20000000);
    其他
       SysCtlClockSet (SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN |
                      SYSCTL_XTAL_16MHz);
    #endif

       //
       //设置用于显示消息的串行控制台。  这是
       //仅用于此示例程序,ADC 操作不需要。
       //
       InitConsole();

       //
       //在控制台上显示设置。
       //
       UARTprintf ("ADC ->\n");
       UARTprintf (" 类型:单端\n");
       UARTprintf (" 示例:一个\n");
       UARTprintf (" 更新速率:250ms\n");
       UARTprintf (" 输入引脚:AIN0/PE3\n\n");

       /*
        *
        *开关触发器的设置
        *
        *



           //启用端口 J
           SysCtlPeripheralEnable (SYSCTL_Periph_GPIOJ);
           //延迟以使时钟保持稳定
           SysCtlDelay(3);

           /*
           使用将 Launchpad 左侧的开关 GPIO_PIN_0配置为输入
           内部上拉。
         *
         GPIOPinTypeGPIOInput (GPIO_PORTJ_BASE、GPIO_PIN_0);
         GPIOPadConfigSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPU);
         GPIOIntTypeSet (GPIO_PORTJ_BASE、GPIO_PIN_0、GPIO_FALLING_EDGE);
         GPIOADCTriggerEnable (GPIO_PORTJ_BASE、GPIO_PIN_0);
           //使 PF4成为 ADC 的触发器
          // GPIOADCTriggerEnable (GPIO_PORTJ_BASE、GPIO_PIN_0);


       //
       //必须启用 ADC0外设才能使用。
       //
       SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

       //
       //对于此示例、ADC0与端口 E7上的 AIN0一起使用。
       //您使用的实际端口和引脚可能有所不同,请参阅
       //数据表以了解更多信息。  需要启用 GPIO 端口 E
       //因此可以使用这些引脚。
       // TODO:将其更改为您正在使用的 GPIO 端口。
       //
       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

       //
       //为这些引脚选择模拟 ADC 功能。
       //请查阅数据表以查看每个引脚分配的函数。
       // TODO:更改此选项以选择您正在使用的端口/引脚。
       //
       GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);

       //
       //使用处理器信号触发器启用采样序列3。  序列3
       //将在处理器发送信号启动时执行单次采样
       //转换。  每个 ADC 模块有4个可编程序列、序列0
       //至序列3。  此示例任意使用序列3。
       //
       ADCSequenceConfigure (ADC0_BASE,3,ADC_TRIGGER_EXTERNAL,0);

       //
       //在序列3上配置步骤0。  对中的通道0 (ADC_CTL_CH0)进行采样
       //单端模式(默认)并配置中断标志
       //(ADC_CTL_IE)将在采样完成时置1。  告诉 ADC 逻辑
       //这是序列3上的最后一次转换(ADC_CTL_END)。  序列
       // 3只有一个可编程步骤。  序列1和2有4个步骤、和
       //序列0有8个可编程步骤。  因为我们只做一个
       //使用序列3进行转换,我们将仅配置步骤0。  了解详情
       //有关 ADC 序列和步骤的信息、请参考数据表。
       //
       ADCSequenceStepConfigure (ADC0_BASE、3、0、ADC_CTL_CH0 | ADC_CTL_IE |
                                ADC_CTL_END);

       //
       //由于采样序列3现在已配置,因此必须将其启用。
       //
       ADCSequenceEnable (ADC0_BASE、3);

       //
       //清除中断状态标志。  这样做是为了确保
       //中断标志在我们进行采样之前被清除。
       //

       ADCIntClear (ADC0_BASE、3);


       //永久采样 AIN0。  显示控制台上的值。
       //
      while (1)
       {
           //
           //触发 ADC 转换。
           //
          //ADCProcessorTrigger (ADC0_BASE、3);

         //值= GPIOPinRead (GPIO_PORTJ_BASE、GPIO_PIN_0);

       //如果按下 PF4、则触发 ADC 转换
         // if (((value & GPIO_PIN_0)=0){

           //
           //等待转换完成。
           //
           while (!ADCIntStatus (ADC0_BASE、3、false))
           {
           }

           //

           //清除 ADC 中断标志。
           //
           ADCIntClear (ADC0_BASE、3);

           //
           //读取 ADC 值。
           //
           ADCSequenceDataGet (ADC0_BASE、3、pui32ADC0Value);

           //
           //在控制台上显示 AIN0 (PE3)数字值。
           //
           UARTprintf ("AIN0 =%4D\r\n、pui32ADC0Value[0]);

           //
           //此函数提供了生成恒定长度的方法
           //延迟。  函数延迟(以周期为单位)= 3 *参数。  延迟
           //任意地250ms。
           //
    #if defined (target_IS_TM4C129_RA0)||                                        \
       已定义(TARGET_IS_TM4C129_RA1)||                                        \
       已定义(TARGET_IS_TM4C129_RA2)
           SysCtlDelay (ui32SysClock / 12);
    其他
           SysCtlDelay (SysCtlClockGet ()/12);
    #endif
          //}
       }






    再次感谢您的意见!!


    此致、
    Snehal