主题中讨论的其他器件:Energia
工具/软件:TI-RTOS
大家好、
我有一个不带 TI-RTOS 的 driverlib 项目、该项目能够正常工作、以8KHz 由 TimerA0启动的多通道 ADC14测量。 但是、当我尝试将该项目集成到 Energia (基于 TI-RTOS)中时、中断只会以1000Hz 的频率触发。 起初、我以为 Energia 对时钟速度设置了额外的8分频、但我在 CS 或 TimerA 部分找不到它。 如果我设置 CCR1以减少计数、那么我根本不会获得中断。 我有四个要转换的通道、请注意、如果我将中断更改为在第一次转换之后触发、而不是在最后一次转换之后触发、中断的触发速度是中断的四倍、因此转换过程就像花费了很长的时间(1/4000秒)一样。 我正在寻找有关如何进行调试的提示:
- 是否有测量 SMCLK 速度的好方法?
- 是否有方法测量 MCLK?
- 是否有办法找出是什么使中断无法触发? 也许还有另一个具有更高优先级的中断。
- 什么会导致 ADC14如此缓慢?
我有三个文件:.ino、.c 和.h: 它们在下面提供:
//.ino 文件。
extern "C"{
#include
};
//大多数 launchpad 都有一个红色 LED
#define LED RED_LED
//有关更多 LED 定义,请参阅 pins_energia.h
//#define LED GREEND_LED
//按下 RESET:
void setup(){
Serial.begin(115200);
//将数字引脚初始化为输出时,设置例程运行一次。
//pinMode (LED、输出);
adc14_();
//delay (500);
//map_ADC14_enableConversion ();
startSampling();
}//
循环例程不停地运行:
void loop(){
静态 int i=0;
serial.print (i++);
serial.println ("Hello!");
//digitalWrite (LED、HIGH);//打开 LED (HIGH 是电压电平)
//delay (1000); //等待第二
次 digitalWrite (LED、low);//通过使电压低
延迟(1000)关闭 LED; //等待一秒钟
}
和头文件:
/* * adc14_.h * *创建日期:2017年5月12日 * 作者:Frohro */ #ifndef COPY2_ADC14_H_ #define COPY2_ADC14_H_ /* DriverLib 包括*/ #include #include /*标准包括*/ #include #include #define SMCLK_FREQ 24000000 #define SAMPLE_FREQ 8000 // Timer_A 连续模式配置参数 const Timer_A_UpModeConfig upModeConfig =//这可以正常 工作{ Timer_A_CLOCKSOURCE_SMCLK、 // SM 时钟源 Timer_A_CLOCKSOURCE_divider _1、 // SMCLK/1 = 24MHz (SMCLK_FREQ/SAMPLE_FREQ)、 Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用计时器 ISR Timer_A_CCIE_CCR0_INTERRUPT_DISABLE、//禁用 CCR0 Timer_A_do 清除 //清除计数 器}; // Timer_A 比较配置参数*/ const Timer_A_CompareModeConfig compareConfig = { Timer_A_CAPTURECOMPARE 寄存器_1、 //使用 CCR1 Timer_A_CAPTURECMOLE_INTERRUPT_DISABLE、//禁用 CCR 中断 Timer_A_OUTPUTMODE_SET_RESET、 //切换输出但是 (SMCLK_FREQ/SAMPLE_FREQ) //应为8kHz 采样率 }; //静态 易失性 uint_fast16_t resultsBuffer[uint8_MAX]; 静态易失性 uint8_t resPos; int adc14_(void); void ADC14_IRQHandler (void); void startSampling (void); #endif /*_ADC14_(void)* ADC14_
最后是 C 文件:
/*
--------------------------------
* MSP432 DriverLib - v4_00_00_11
*----------------------
*
*-版权所有-、BSD、BSD
*版权所有(c) 2017、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在
*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经
事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、
不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
*--/copyrights-*/*
MSP432 ADC14 -不重复的多通道采样
*
说明:在此代码示例中,
用户 A DriverLib API 演示了能够扫描多个* ADC 通道的功能。 转换
*内存寄存器 ADC_MEM0 - ADC_MEM3被配置为分别读取
A6、A12、A10、A8的转换*结果。 转换被启用、然后使用
一个软件切换来*切换采样。 重复模式未启用、仅采样
*发生一次(用户应暂停调试器以观察
*结果)。 在采集完最终样本后、
* ADC_MEM3的中断被触发、结果存储在 resultsBuffer 缓冲区中。
*
* MSP432P401
* ----------
* /|\| |
* || |
* -|RST P4.7 |<-- A6 (模拟输入、测量值、实际值)
* | P4.1 |<-- A12 (模拟输入、测量值、虚数)
* | P4.3 |<-- A10 (模拟输入、基准实数)
* | P4.5 |<-- A8 (模拟输入、基准虚数)
* | |
* | |
*
4.1、4.3、4.5、4.7是最终所需的引脚。
*
*作者:Timothy Logan
*这是 Rob Frohne 修改的、以在8kHz 采样率下执行多个 ADC。
秘书长的报告 /#include
#define NUMBER_TIMER_CAPTURES 20
#define SAMPLE_LENGTH 128
/*
静态易失性 uint_fast16_t timerAcaptureValues[NUMBER_TIMER_CAPTURES];
静态易失性 uint32_t timerAcapturePointer = 0;
*/
uint16_t refRe[SAMPLE_LENG];
uint16_t refIim[SAMPLE_LENGTH];
uint16_t
measure];uint16_t measure]
extern volatile bodyool ADC;
bool sendMeasurement = false;
int numberFrquenciestoMeasure、frequencyIndex;
float refSum、measSum;
volatile botonool ADC = false;
//void TA0_N_IRQHandler (void);
int adc14_(void)
{
/*停止 WDT */
WDT_A_HOLDTimer();
Hwi_Params 参数;
//寄存器中断
Hwi_Params_init (params);
Hwi_create (INT_ADC14、ADC14_IRQHandler、¶ms、0);
//Hwi_create (INT_TA0_N、TA0_N_IRQHandler、¶ms、0);
//Interrupt_enableSlepOnIsrExit();
RESPos = 0;
//设置为 Vcore1
PCM_setCoreVoltageLevel (PCM_VCORE1);
//设置为使用 DCDC
//PCM_setPowerState (PCM_AM_DCDC_VCORE1);
//初始化时钟系统
/*由于我们需要 Energia 时钟设置、这些注释被注释掉。 。
*相应调整计时器的数据结构。 时间
*转换之间的时间可能是这些转换的四倍
*参数、但这似乎是实现一切的最简单方法
*立即一起玩。 *
//FlashCtl_setWaitState (FLASH_BANK0、2);
//FlashCtl_setWaitState (FLASH_BANK1、2);
PCM_setPowerState (PCM_AM_DCDC_VCORE1);
cs_setDCOCenteredFrequency (CS_DCO_FREQUENCY);
cs_setDCOFrequency (24000000);
CS_initClockSignal (CS_MCLK、CS_DCOCLK_SELECT、CS_Clock_divider);
CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_Clock_divider _1);
/*初始化 ADC (MCLK/1/1)*/
ADC14_enableModule();
ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_1、
0);
//配置调试引脚作为调试输出...
GPIO_setAsOutputPin (GPIO_PORT_P5、GPIO_PIN5);
GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
//Configuring GPIO for Analog In
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、
GPIO_PIN1 | GPIO_PIN3 | GPIO_PIN5 | GPIO_PIN7、GPIO_TICE_MODULE_FUNCTION);
//配置 ADC 存储器(ADC_MEM0 - ADC_MEM3 (A6、A12、A10、A8)、不重复)
//具有内部2.5V 基准
ADC14_configureMultiSequenceMode (ADC_MEM0、ADC_MEM3、TRUE);//无重复模式。
ADC14_configureConversionMemory (ADC_MEM0、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A6、ADC_NONDIFFERENTIAL_INPUTES);
ADC14_configureConversionMemory (ADC_MEM1、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A12、ADC_NONDIFFERENTIAL 输入);
ADC14_configureConversionMemory (ADC_MEM2、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A10、ADC_NONDIFFERENTIAL 输入);
ADC14_configureConversionMemory (ADC_MEM3、
ADC_VREFPOS_INTBUF_VREFNEG_VSS、
ADC_INPUT_A8、ADC_NONDIFFERENTIAL 输入);
/*配置 Timer_A*/
Timer_A_configureUpMode (timer_A0_BASE、&upModeConfig);
/*在 CCR1中配置 Timer_A0 */
Timer_A_initCompare (timer_A0_BASE、&compareConfig);
/*将样本触发器配置为来自 Timer_A0并进行设置
*在触发后自动迭代*/
ADC14_setSampleHoldTrigger (ADC_TRIGGER_SOURCE1、false);
/*当通道3上的转换完成时启用中断*/
ADC14_enableInterrupt (ADC_INT3);
//ADC14_enableConversion();//不需要,因为我们在.ino 中启用它。
/*启用中断*/
INTERRUPT_enableInterrupt (INT_ADC14);
interrupt_enableMaster();
/*启动计时器*/
Timer_A_startCounter (timer_A0_BASE、timer_A_up_mode);
/*正在休眠*/*
while (1)
{
PCM_gotoLPM0 ();
}*/
返回1;
}
void ADC14_IRQHandler (void)
{
uint64_t status;
静态 int i = 0;
//GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
status = ADC14_getEnabableInterruptStatus();
ADC14_clearInterruptFlag (status);
GPIO_toggleOutputOnPin (GPIO_PORT_P5、GPIO_PIN5);
ADC14_disableConversion();
if (status & ADC_INT3)
{
//ADC14_disableConversion();
印度尼西亚 ADC = false;
ADC14_getMultiSequenceResult (resultsBuffer);
measRe[i]= resultsBuffer[0];
measIM[i]= resultsBuffer[1];
refRe[i]= resultsBuffer[2];
refIm [i]= resultsBuffer[3];
//i=(i+1)%SAMPLE_LENGTH;
如果(i!=sample_length)
{
i++;
//ADC14_enableConversion();
}
其他
{
I=0;
印度尼西亚 ADC = true;
//ADC14_enableConversion();
}
}
ADC14_enableConversion();
}/*void
TA0_N_IRQHandler (void)
{
uint32_t jj;
Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、
Timer_A_CAPTURECOMPARE 寄存器1);
timerAcaptureValues[timerAcapturePointer++]=
Timer_A_getCaptureCompareCount (timer_A0_BASE、
Timer_A_CAPTURECOMPARE 寄存器1);
if (timerAcapturePointer >= number_timer_captures)
{
while (1)
{
GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0);
for (jj=0;jjj<10000;jjj++);
}
}
}*/
void startSampling(void){
ADC14_enableConversion();//我需要这么做是一个谜
//而不是仅仅调用 ADC14_enableConversion()
//从.ino 文件!
}
感谢您的提示!
Rob