单片机学习小组
直播中

刘洋

11年用户 1208经验值
擅长:可编程逻辑 嵌入式技术
私信 关注

ML51 IAR Compile printf出错是什么原因?怎么解决?

刚刚用IAR搭起来ML51的环境,编译sample code时,发现每次编译到printf,就报如下错误:
Error[Pe167]: argument of type "char __code *" is incompatible with parameter of type "char const *"

代码就是Nuvoton提供的参考代码,例如:

#include "ML51_IAR.h"

/******************************************************************************
The main C function.  Program execution starts
here after stack initialization.
******************************************************************************/
void main (void)
{
    MFP_P31_UART0_TXD;                //Setting P31 multi function pin as TXD
    P31_PUSHPULL_MODE;                //Output mode for TXD

    UART_Open(24000000,UART0_Timer3,115200);
    ENABLE_UART0_PRINTF;
    ADC_INPUT_VBG;                    //Find in "Function_define.h" - "ADC INIT"


  while(1)
    {
      clr_ADCCON0_ADCF;
      set_ADCCON0_ADCS;                                  // Each time ADC start trig signal
      while(ADCCON0&0x10 == 0);
      printf ("\n Value = 0x%bx",ADCRH);
      printf ("\n Value = 0x%bx",ADCRL);
//      Timer2_Delay(24000000,128,200,1000);
      _nop_();
    }
}

哪位老大给指点一下,多谢!


回帖(1)

张强

2024-1-12 17:24:05
********************************/void main (void){int n=5;EA = 1;P06_QUASI_MODE;P17_QUASI_MODE;P32_INPUT_MODE;P13_INPUT_MODE;P15_INPUT_MODE;P33_INPUT_MODE;Init_UART1_Pinshare();/*UART initialize for printf output */UART_Open(24000000,115200);while(n--){printf("Hello World n");/* printf   ("GOODBYE WORLDn"); */}}

这个错误是因为 printf 函数的参数类型不匹配导致的。在 IAR 编译器中,需要使用 __code 关键字来区分程序内存和数据内存。所以我们需要改动 printf 函数的参数类型如下:

void printf(char __code *fmt,...);

这样就能解决 printf 的编译错误了。 修改后的代码如下:

#include
/******************************************************************************

The main C function.

Program execution starts here after stack initialization.

******************************************************************************/

void main (void)
{
    int n=5;
    EA = 1;
    P06_QUASI_MODE;
    P17_QUASI_MODE;
    P32_INPUT_MODE;
    P13_INPUT_MODE;
    P15_INPUT_MODE;
    P33_INPUT_MODE;
    Init_UART1_Pinshare();/*UART initialize for printf output */
    UART_Open(24000000,115200);
    while(n--){
        printf("Hello World n");
        /* printf ("GOODBYE WORLDn"); */
    }
}

修改之后就可以正常编译了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分