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/MSP430F5529:函数sprintf不能生成所需的输出。

Guru**** 2540720 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/576941/ccs-msp430f5529-function-sprintf-doesn-t-produce-desired-output

部件号:MSP430F5529

工具/软件:Code Composer Studio

您好,

请我正在将CCS v7与GNU 6.2 v.1.16 一起使用。 我在代码中使用sprintf,但它不会向LCD生成所需的输出。

模拟器显示我应该显示的值,但显示屏上没有显示任何内容。 请帮助我解决此问题。

请参阅我正在运行的代码:

/**
部分:包含的文件
*/

#include <stdio.h>
#include
"driverlib.h"
#include "lc_driver.h"

/**
部分:宏声明
*/

#define RA 993 //以欧姆为单位的RA测量值
#define RB 1.003万 // RB的测量值(单位:欧姆

)/**
部分:全局变量定义
*/

uint16_t captured_value;
uint16_t previous_capture;
uint16_t period_raw;
uint16_t period_old;
uint16_t period_new;
双delta周期;
双delta电容;								//电容变化或测量电容
持续双K = 1.44 /(RA)+(2 *(RB));			//确定电容
持续双KP = 1.0E-6的常量;								//一个计时器周期的值(以秒为单位

)/**
*部分:函数原型
*/

void captor_config (void);
void caption_isr (void);

/**
部分:主应用
程序*/

int main (void)
{//
	停止监视计时器
WDT_A_HOLD (WDT_A_BASE);
GPIO _setAsOutputPin (GPIO端口P1,GPIO _PIN0);

//将WFP 5.2 设置为XT2IN
GPIO _setAsPeripheralModuleFunctionInputPin (GPIO_PORT_P5, GPIO _PIN2 + GPIO _PIN4);
//将WFP 5.3 设置为XT2OUT
GPIO _setAsPeripheralModuleFunctionOutputPin (GPIO_PORT_P5, GPIO _PIN3 + GPIO _PIN5);
//以Hz为单位设置XT1和XT2的频率
UCS_setExternalClockSource (3.2768万,4000000);
//初始化晶体
UCS_turnOnXT2 (UCS_XT2_DRIVE_4MHz_8MHZ);
UCS_turnOnLFXT1 (UCS_XT1_DRIVE_0,UCS_XCAP_3);
//使用晶体设置时钟
//以4MHz的频率初始化主时钟
UCS_initClockSignal (UCS_MCLK,UCS_XT2CLK_SELECT,UCS_CLock_diver_1);
//初始化频率为1MHz的子主时钟
UCS_initClockSignal (UCS_SMCLK,UCS_XT2CLK_SELECT,UCS_CLock_diver_4);
//初始化频率为32.768kHz的辅助时钟
UCS_initClockSignal (UCS_ACLK,UCS_XT1CLK_SELECT,UCS_CLock_diver_1);

//为LCD配置GPIO
P2DIR || BIIT2 + BIT3;
P3DIR |= BIT7;
P7DIR || BIT4;
P8DIR || BIT1 + BIT2;

//初始化LCD
LCD_Init();
LCD_PutCmd (_LCD_Clear);
LCD_PutCmd (_LCD_Curor_Off);
LCD_PutString (1,1,"测量周期");
LCD_PutString (2,1,"-默认值-");
DELAY毫秒(5000);
LCD_PutCmd (_LCD_Clear);

//为捕获模式配置timerA
CAPT_CONFIG();

//允许555计时器稳定?
DELAY毫秒(5000);

//测量旧期间
period_old = period_raw;

//用于将电容值存储为字符串的数组
CHAR测量电容[16];

//要输出的字符数
UINT8_t data_count;

	while (1)
	{
		// measure new period
		period_new = period_raw;

		// calculate change in period
		delta_period =((float)(period_new - period_old))* kp;

		// calculate change in fon_delt=K
		* deltate_period;

//格式电容值
//首先将电容值转换为nF
delta电容= delta电容* 1.0E9;
IF (delta电容< 1000.0)
{
//以1000nF为单位显示电容值
data_count = sprintf (测量电容,"C =%.1f",delta电容);
LCD_PutString (1,1," ");
LCD_PutString (1,1,测量电容);
LCD_PutString(1, 10,"nF";
}
否则,如果(delta电容< 1万.0)
{
//以10uF范围显示电容
data_count = sprintf (测量电容,"C =%.1f",(delta电容/ 1000.0));
LCD_PutString (1,1," ");
LCD_PutString (1,1,测量电容);
LCD_PutString(1, 10,"UF");
}
否则,如果(delta电容< 10万.0)
{
//以100uF范围显示电容
}

// 1秒延迟
DELAY _ms(1000);

	}


/**
部分:功能定义
*/

void capture_config(void)
{//
	将WFP设置1.2 为输入
	GPIO端口P1(GPIO_PORT_P1, GPIO_PIN2);
	//将WFP 1.2 设置为捕获输入
	

	
	
	
	分配器gPIO_setAsalModuleFunctionInputPin(GPIO_PORT_Pp1,时钟时间器=_CONSTROPH_CLAM_PARAME_PARAMERA_PARAMERA_PARAME_POSTER_1_PARAMERASE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PARAMERADE_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_TIME_PORADE_PORADE_PORADE_PORADE_PORADE_PORADE_POST_PORADE_PORADE_POST_PORAME_PORADE
	
	
	continuous_param.startTimer = false;
	Timer_a_initContinuousMode(timer_A0_base,&continuous_param);

	//初始化timerA捕获模式
	Timer_a_clearCaptureCompareInterrupt (timer_A0_base, timer_a_CAPTURMPare_register_0);
	
	Timer_a_initcapcapture_mode_mode_timer_conve_capture_param.captureRegister =
	capture_param.captureInterruptEnable
	
	capture_param.captureInputSelect capture_param.captureMode
	Capture_param.synchronizeCaptureSource = timer_a_capture_synchronous;
	capture_param.captureOutputMode = timer_a_OUTPUTMODE_OUTBITVALUE;
	Timer_a_initCaptureMode (timer_A0_base,&capture_param);

	Timer_a_startCounter(timer_A0_base, Timer_a_continuous模式);

	//启用中断
	__bis_sr_register(GIE);




	
	
	
	
	
	
	
		
		
	} void capture_isr(void){静态uint8_t interrupt number =0;interrupt number++;//获取捕获值//captured_value = Timer_a_getCaptureCompareCount(timer_A0_base, timer_a_captur_1= 0;interp_interp_interp_capout_capp_capp_capp1
	
	=
		中断数= gp_interp_interp_interp_capp_capp_capp_capp_capp_capsf_capsf_capp_capp1;interr1_interrf_interrf_interrf_capp_interrf_capp=中断值=<interrbure_capp_capp_capp_capp_
		
		//gPIO_setOutputLowOnPin(GPIO_PORT_P1, gPIO_PIN0);
	}//
	启用中断
	__bis_sr_register(GIE);
}/**


部分:中断服务例程
*/

__attribute__(interrupt (TIMER0_A1_vector)) void timer_A0_r1(void)
{
	交换器(___IASR2;__ICAST_I0/
	
									IR2; IASR2/IASR2/:
			
									
			
			中断4:
									
			
									
			中断4;IASR2/中断4;IASR2/中断4:中断4:中断4;IGR2/中断4;IASR3/中断/中断4:IASR3/中断/中断4:IASG/中断/中断4:中断/中断/中断4:I0
									// CCR4 IFG
			break;
		Case 10:						// CCR5 IFG
			break;
		Case 12:						// CCR6 IFG
			break;
		Case 14:						// TAOIFG
			break;
		default:						// Never executed
			break;
	}

以前我在系统中有此代码

data_count = sprintf (测量电容,"C =%.1f",(delta电容/ 1000.0));
LCD_PutString (1,1,"");
LCD_PutString (1,1,测量电容);
LCD_PutString (1,(data_count + 2),"UF");

这是我在操作几分钟后在LCD上得到的输出:

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

    我不知道函数LCD_PutString()是如何工作的,但是你可以在第113行和/或121行处设置一个断点,然后在表达式视图中检查变量DATA_COUNT吗? 这将显示sprintf()是否确实格式化了数据。

    此外,控制台I/O操作通常需要大量堆内存才能正常运行。 以下参考适用于我们的TI编译器,但GCC可能有类似的要求。

    processors.wiki.ti.com/.../Tips_for_using_printf

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

    您好Rafael:

    请我在第113行和第121行运行了一个断点的模拟,我注意到data_count和要显示的数据的值相当不好。 请在下面查找显示两种不同情况的图片。

    我已按照您在上面发布的链接进行操作,但遗憾的是,有关更改堆栈和堆大小的所有描述都是针对TI编译器的。 GNU编译器的菜单是不同的,因此我不知道如何进行这些修改。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    使用带有CCS版本6 (不同处理器)的TI编译器时出现类似问题。 这是因为sprintf例程使用了850个(十进制)堆栈单词,即使是最简单的字符串也是如此。 我们将堆栈大小设置为1000,问题已解决。