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.
工具/软件:Code Composer Studio
尊敬的所有人:
因此、我已经准备好了两个示例代码、这里是:
#include "driverlib.h" uint16_t results[4]; // SD24转换和温度结果 //结果[0]=原始 SD24结果 //结果[1]=以 K 为单位的温度 //结果[2]= C 中的温度 // results[3]= F uint8_t Flag_1中的 temp = 0; 针对 ADC unsigned int Flag_2 = 0的//Flag 1; //针对计时 器#define TIMER_PERIOD 10 的标志2 unsigned int TIMER_PERIOD_PERIOD = 0; void main (void){ //停止 WDT WDT_HOLD (WDT_BASE); //内部参考 SD24_init (SD24_BASE、SD24_REF_INTERNAL); //Ch0单模式内部温度传感器 SD24_initConvertterAdvancedParam param ={0}; param.converter = SD24_converter_0; param.conversionMode = SD24_single_mode; param.groupEnable = SD24_not _grouped; param.inputChannel = SD24_INPUT_CH_TEMRATURE; param.dataFormat = SD24_data_format_2COMPLEMENT; param.interruptDelay = SD24_Four_SAMPLE_INTERRUPT; param.oversample.Ratio = SD24_oversample_256; param.gain = SD24_gain_1; SD24_initConverterAdvanced (SD24_BASE、¶m); SD24_enableInterrupt (SD24_BASE、SD24_converter_0、SD24_converter_interrupt); //对于1.2V 基准电压稳定、延迟~200us _delay_cycles (3200); //将 P2.1设置为输出引脚以驱动 LED GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN1); // Timer_A 设置 Timer_A_initUpModeParam upModeConfig = { Timer_A_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 Timer_A_CLOCKSOURCE_divider _1、 // SMCLK/8 = 256kHz Timer_Period、 // 250ms Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用溢出 ISR Timer_A_CCIE_CCR0_INTERRUPT_ENABLE、//启用 CCR0中断 Timer_A_do 清除 //清除计数器 }; while (1){ //开始转换 SD24_startConverterConversion (SD24_BASE、SD24_converter_0); //输入带中断的 LPM0 //_bis_SR_register (LPM0_bits | GIE); //用于调试器 __no_operation(); 如果(Flag_1 ==1)//中断例程完成 { Flag_2 = 1; GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1);//打开 LED //将计时器配置为使用 ACLK 并在计时器到达 CCR0时中断 Timer_A_initUpMode (timer_A0_BASE、&upModeConfig); Timer_A_startCounter (timer_A0_BASE、timer_A_up_mode); //计算不同刻度的温度 results[1]=(无符号长整型) results[0]* 1200)/70711; results[2]= results[1]- 273; 结果[3]=(结果[2]* 9/5)+ 32; FLAG_2 = 0; _DELAY_CYCLES (1000); __no_operation(); Timer_Period_Period = 0; GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN1);//关闭 LED FLAG_1 = 0; //Flag_2 = 0; } _bis_SR_register (LPM0_bits | GIE); //GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN1); //计算不同刻度的温度 //results[1]=(无符号长整型) results[0]* 1200)/70711; //results[2]= results[1]- 273; //results[3]=(results[2]* 9/5)+ 32; __no_operation(); //在此设置断点 } }//------------------ //中断函数 ///------------------------------------------------------- //ADC #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__) #pragma vector=SD24_vector __interrupt void SD24_ISR (void){ #elif defined (__GNU__) void __attribute__((interrupt (SD24_vector)))) SD24_ISR (void))不支持! #endif 开关(__evo_in_range (SD24IV、SD24IV_SD24MEM3)) { 案例 SD24IV_NONE:break; 案例 SD24IV_SD24OVIFG:中断; 案例 SD24IV_SD24MEM0: //保存 CH0结果(清除 IFG) 结果[0]= SD24_getHighWordResults (SD24_BASE、SD24_converter_0); 中断; 案例 SD24IV_SD24MEM1:中断; 案例 SD24IV_SD24MEM2:中断; 案例 SD24IV_SD24MEM3:中断; 默认值:break; } FLAG_1 = 1; //__ BIC_SR_REGISTER_ON_EXIT (LPM0_Bits); //从 LPM0唤醒}//Timer_A--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}}--> #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector=TIMER0_A0_vector __interrupt #elif defined (__GNU__) __attribute__(interrupt (TIMER0_A0_vector))) #endif ISR (void TA0_void) // TIMER0_A0_Vector 仅包含 CCR0中断 //无需检查/清除中断标志,切换 LED 以显示达到的 ISR //GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN4); 如果(Flag_2 = 1) { Timer_Period_Period = Timer_Period_Period +1; } }
目的是对将无符号长整型转换为开尔文、凯尔西斯和华氏的计算操作进行计时、并反复计时(以实现一致性)。
Flag_1会检查新的 ADC 数据是否可用。
Flag_2是停止 TIMER_PERIOD_PERIOD 计数器。
因此、所花费的时间应为= 61.04 (ns)* 10 (timer_period)* timer_period_period。
我很确定、这是处理此问题的错误方法、因此我们希望获得任何帮助、我将断点放在哪里以读取 TIMER_PERIOD_PERIOD 值?
谢谢你。
此致、
Neal
我建议采取更直接的方法:
在连续模式下运行 timer_A0、因为这将简化算术。
然后、用如下所示的内容括住您想要计时的序列:
> uint16_t start、stop、ticks;
>开始= Timer_A_getCounterValue (timer_A0_BASE);//之前的 TA0R
[您想定时的东西]
>停止= Timer_A_getCounterValue (timer_A0_BASE);// TA0R
>节拍数=停止-开始;//执行时间、以定时器节拍为单位(1.024MHz)
如果计数器寄存器同时溢出到0 (并非不可能)、则无符号减法将处理此问题。
如果您想要的时间超过6556/1.024=64毫秒(我不认为会)、定时器将循环、您将获得奇数结果。 如果发生这种情况、增加时钟分频器、例如 TIMER_A_CLOCKSOURCE_DEVIDER_2。
[编辑:如果您想知道:在这种情况下、您不需要计时器 ISR。]
尊敬的 Bruce:
感谢一位吨级的伴侣、它的工作方式就像一种魅力。 如果我错了、请纠正我的问题、但计时器计数器不使用 CPU 内核、而是它自己的补充功能吗?
这是最终代码:
#include "driverlib.h" uint16_t results[4]; // SD24转换和温度结果 //结果[0]=原始 SD24结果 //结果[1]=以 K 为单位的温度 //结果[2]= C 中的温度 // results[3]= F uint8_t Flag_1中的 temp = 0; //针对 ADC uint16_t start、stop、ticks 的 Flag 1; void main (void){ //停止 WDT WDT_HOLD (WDT_BASE); //内部参考 SD24_init (SD24_BASE、SD24_REF_INTERNAL); //Ch0单模式内部温度传感器 SD24_initConvertterAdvancedParam param ={0}; param.converter = SD24_converter_0; param.conversionMode = SD24_single_mode; param.groupEnable = SD24_not _grouped; param.inputChannel = SD24_INPUT_CH_TEMRATURE; param.dataFormat = SD24_data_format_2COMPLEMENT; param.interruptDelay = SD24_Four_SAMPLE_INTERRUPT; param.oversample.Ratio = SD24_oversample_256; param.gain = SD24_gain_1; SD24_initConverterAdvanced (SD24_BASE、¶m); SD24_enableInterrupt (SD24_BASE、SD24_converter_0、SD24_converter_interrupt); //对于1.2V 基准电压稳定、延迟~200us _delay_cycles (3200); //将 P2.1设置为输出引脚以驱动 LED GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN1); // Timer_A 设置 Timer_A_initContinuousModeParam continuousModeConfig = { Timer_A_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 Timer_A_CLOCKSOURCE_divider _1、 // SMCLK/8 = 256kHz //timer_period、 // 250ms Timer_A_TAIE_INTERRUPT_DISABLE、 //禁用溢出 ISR Timer_A_CCIE_CCR0_INTERRUPT_DISABLE、//启用 CCR0中断 Timer_A_do 清除 //清除计数器 }; Timer_A_initContinuousMode (timer_A0_BASE、&continuousModeConfig); while (1) { //开始转换 SD24_startConverterConversion (SD24_BASE、SD24_converter_0); //用于调试器 __no_operation(); 如果(Flag_1 ==1)//中断例程完成 { GPIO_setOutputLowOnPin (GPIO_PORT_P2、GPIO_PIN1);//打开 LED // START = Timer_A_getCounterValue (timer_A0_BASE);//填充之前的 TA0R //计算不同刻度的温度 results[1]=(无符号长整型) results[0]* 1200)/70711; results[2]= results[1]- 273; 结果[3]=(结果[2]* 9/5)+ 32; STOP = Timer_A_getCounterValue (timer_A0_BASE);//在填充之后为 TA0R 节拍数=停止-开始;//执行计时器节拍数(1.024MHz) _DELAY_CYCLES (1000); __no_operation(); GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN1);//关闭 LED flag_1 = 0; } _bis_SR_register (LPM0_bits | GIE); __no_operation(); //在此设置断点 } }//------------------ //中断函数 ///------------------------------------------------------- //ADC #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__) #pragma vector=SD24_vector __interrupt void SD24_ISR (void){ #elif defined (__GNU__) void __attribute__((interrupt (SD24_vector)))) SD24_ISR (void))不支持! #endif 开关(__evo_in_range (SD24IV、SD24IV_SD24MEM3)) { 案例 SD24IV_NONE:break; 案例 SD24IV_SD24OVIFG:中断; 案例 SD24IV_SD24MEM0: //保存 CH0结果(清除 IFG) 结果[0]= SD24_getHighWordResults (SD24_BASE、SD24_converter_0); 中断; 案例 SD24IV_SD24MEM1:中断; 案例 SD24IV_SD24MEM2:中断; 案例 SD24IV_SD24MEM3:中断; 默认值:break; } flag_1 = 1; _BIC_SR_REGISTER_ON_EXIT (LPM0_BITS); //从 LPM0唤醒 }
此致、
Neal
计时器不是 CPU 的一部分、但 SMCLK 和 MCLK 来自相同的基准时钟、因此它们处于同步状态。 如果它们具有相同的分频值(您的分频值)、SMCLK 等于 CPU 时钟(MCLK)。
我忘记了在启动时如何设置时钟。 MCLK/SMCLK 分频器为/1 (不是/16、正如我记忆中的那样)、所以定时器计数1/16.384MHz、并且它的范围为4ms。 [参考用户指南(SLAU335)秒 4.2.1.1]