工具/软件: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)
{
}
}