how to use printf() in codewarrior11.1? (DEVKIT-ZVL128)

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

how to use printf() in codewarrior11.1? (DEVKIT-ZVL128)

1,812 次查看
Jen1
Contributor I

how to use printf() in codewarrior11.1? (DEVKIT-ZVL128)

0 项奖励
回复
4 回复数

1,713 次查看
lama
NXP TechSupport
NXP TechSupport

... and what about
https://community.nxp.com/t5/S12-MagniV-Microcontrollers/S12ZVL-SCI-Driver/m-p/510065

sprintf can be added as an additonal function to prepare string from formated input values.

Best regards,

Ladislav

0 项奖励
回复

1,797 次查看
lama
NXP TechSupport
NXP TechSupport

Hi,

CW does not support this function neither to ports not to console.

As an example, I have used a function sprintf for formated output and then used my UART function to send a text to the PC via serial channel. This was written for S12ZVC.

 

//==============================================================================
void SCI1_Init(UBYTE sci_num);
void SCI1_SendText(UBYTE sci_num, SBYTE *str);
//==============================================================================

typedef struct
{
UWORD SCIBD; /*00*//*01*/
UBYTE SCICR1; /*02*/
UBYTE SCICR2; /*03*/
UBYTE SCISR1; /*04*/
UBYTE SCISR2;
UBYTE SCIDRH;
UBYTE SCIDRL;
}tSCI_REGS;

//==============================================================================
// define base address of SCI regiters
UBYTE *sci_periph[] = { ( UBYTE * ) &SCI0BDH, ( UBYTE * ) &SCI1BDH };
//==============================================================================

/*******************************************************************************
Function Name : SCI_Init
Date : Sep-9-2014
Parameters : SCI channel
Modifies : NONE
Returns : NONE
Notes : SCI init at 9600bps @ 16MHz BUSCLK
TXD0 is on PJ1, RxD1 is on PJ0
Issues : NONE
*******************************************************************************/
void SCI_Init(UBYTE sci_num)
{

tSCI_REGS *sci;

sci = ( tSCI_REGS* ) ( sci_periph[sci_num] ); // get base addres of the SCI channel

// Calculation is valid for maskset N95G
// Old masksets must use formula BR = BUSCLK / (16*Baud rate)
//----- BR = BUSCLK / Baud rate = 16,000,000 / 9600 = 1667 = 0x683 -
//------------------------------------------------------
sci->SCIBD = 0x683; // prescaller value (depends on module clock frequency)
// prescaller = 0x683 9600Bd (16MHz bus clock is set)
//------------------------------------------------------
sci->SCICR1 = 0x44; // Loops sciswai rsrc m wake ilt pe pt
// 0-LOOPS=Rsrc=0 => 1 Single-wire mode with Rx input connected to TXD
// 1-SCI dis. in wait mode
// 0-if Rsrc=1-RxTx intern. connected if loops=1
// 0-start+8 data+1 stop bit
// 0-IDLE mark wake up
// 1-idle char. bit count begins after stop bit
// 0-parity fction disabled
// 0-odd parity
//------------------------------------------------------
sci->SCICR2 = 0x08; // tie tcie rie ilie te re rwu sbk
// 0-Tx empty intr disabled
// 0-Tx complete intr disabled
// 0-Rx full + OverRun interrupts
// 0-idle line intr disabled
// 1-transmitter enabled
// 0-receiver disabled
// 0-receiver normal operation
// 0-no break characters
//------------------------------------------------------
}


/*******************************************************************************
Function Name : SCI0_sendText
Date : Sep-9-2014
Parameters : SCI channel; pointer to a string to be sent
Modifies : NONE
Returns : NONE
Notes : send \0 terminated text out through SCI in polling mode
Issues : NONE
*******************************************************************************/
void SCI_SendText(UBYTE sci_num, SBYTE *str)
{
UBYTE i;
tSCI_REGS *sci;

sci = ( tSCI_REGS* ) ( sci_periph[sci_num] ); // get base addres of the SCI channel

i=0;
while(str[i]!='\0') // good to add a test for incorrect string..for example longer than x chars will be terminated
{
while(!(sci->SCISR1 & SCI0SR1_TC_MASK)){}; // write data to SCI (clear TC)
sci->SCIDRL = str[i];
i++;
}
}
//******************************************************************************

Of course this routine is written for more channels. It can be simplified.

.. and simple usage, without interrupt...

char txt[255];


( void ) sprintf( txt,"CAN0 rcvd: ST_ID= 0x%03LX data=", ( ULONG ) canRxMsg[0].id); // create text to send
SCI_SendText(0, txt ); // send txt via SCI 0
for(k=0; k<canRxMsg[0].len;k++)
{
( void ) sprintf( txt,"0x%02x,", canRxMsg[0].data[k]);
SCI_SendText(0, txt );
}
( void ) sprintf( txt, "\n\n\n\r" );
SCI_SendText(0, txt );

Best regards,

Ladislav

0 项奖励
回复

1,777 次查看
Jen1
Contributor I

Hi

Add a few files, Looking forward to your reply.

A few more questions:

Q1: 

typedef struct
{
UWORD SCIBD; /*00*//*01*/
UBYTE SCICR1; /*02*/
UBYTE SCICR2; /*03*/
UBYTE SCISR1; /*04*/
UBYTE SCISR2;
UBYTE SCIDRH;
UBYTE SCIDRL;
}tSCI_REGS;

These register names are different from my files, In addition, I have not clearly defined UWORD, UBYTE and SBYTE. Could you please give me a complete example of how to use it?  Thank you very much  

0 项奖励
回复

1,784 次查看
Jen1
Contributor I

Hi

Thank you very much for your answer, I think it should be helpful.

Q1: Does CodeWarrior11.1 not support console output?

Q2: I am using MC9S12ZVLA128 of S12ZVL Family now. The code you gave applies to S12ZVC family. Does your example support S12ZVL family?  

Q3: I used the latest io_map.h file, which is a little different from the field definition in the code you gave, could you please help me make adjustments?

 

 

 

0 项奖励
回复