You get the same error for similar printf stdio.h functions (e.g. vprintf, sprintf, vsprintf, puts etc...)?ASlink-Warning-Undefined Global '_putchar' referenced by module 'hello' make: *** [hello] Error 1
The solution is easy; just define the putchar() function to describe which buffer (e.g. UART0 or UART1) the characters should go to. Here is my example code of "Hello World" and blinking some LED on the DS89C450 evaluation kit:
Then it works! Download your firmware to the evKit and then you can see the "Hello World" displaying on your terminal! If nothing comes up then check if the LED are blinking. If LED are not blinking then the firmware is not running.. something is probably really wrong. I set 14400 as baudrate because the evKit uses the same baudrate for the in-system programming. I just don't want the hassles of changing the baudrate of my terminal all the time. If you need the register file sdcc_reg420.h of the above example code, you can get it in the following link:#include <stdio.h> #include "sdcc_reg420.h" void delay(void) { unsigned int i, j; for(j=0; j<12; j++) { for(i=0; i<3000; i++) { } } } void serialInit() { TMOD = 0x21; // Timer 1: 8-bit autoreload from TH1 TH1 = 220; // 14400 baud rate CKMOD = 0x38; // Use system clock for timer inputs T2CON = 0x00; // Serial 0 runs off timer 1 overflow TCON = 0x50; // Enable timers 0 and 1 SCON0 = 0x50; // Enable serial port 0 SBUF0 = ' '; } void putchar (char c) { while (!TI_0) /* assumes UART is initialized */ ; TI_0 = 0; SBUF0 = c; } void main(void) { serialInit(); // Initialize serial port 0 printf("\rHello World!!\n"); while(1) { P1 = 0x01; delay(); P1 = 0x02; delay(); P1 = 0x04; delay(); P1 = 0x08; delay(); } }
http://www.maximintegrated.com/app-notes/index.mvp/id/3477
Only this document was written some time ago and now sdcc will warn it uses some deprecated macros. But the file still works fine and updating the keywords are trivial task.
No comments:
Post a Comment