TI中文支持网
TI专业的中文技术问题搜集分享网站

msp430 精准延时函数 编译出错

已定义以下宏定义:

#define CPU_F        ((double)8000000)
#define delay_us(x)   __delay_cycles(long)(CPU_F*(double)x/1000000.0)
#define delay_ms(x)   __delay_cycles(long)(CPU_F*(double)x/1000.0)

函数内部调用:delay_ms(1);

编译报错:Error[Pe029]: expected an expression C:\Users\87520\Desktop\SI4463_RX\main.c 72

Error[Pe109]: expression preceding parentheses of apparent call must have (pointer-to-) function type C:\Users\87520\Desktop\SI4463_RX\main.c 72 

请问这是为什么?

Susan Yang:

您现在使用的是IAR? 具体的芯片型号和时钟呢?

我现在没有安装IAR,您可以看一下E2E上的一些说明

e2e.ti.com/…/236641

e2e.ti.com/…/303024

www.amobbs.com/thread-756021-1-1.html

user4973021:

回复 Susan Yang:

前面几个答案和我遇到的问题不是一样的,我用的是MSP430F149,时钟8M,是IAR软件

灰小子:

回复 user4973021:

单纯这三句代码,是没有问题的。

建议上传下全部的代码或工程

user4973021:

回复 灰小子:

#include <msp430x14x.h>
#include "bsp.h"
#include "bsp.c"
#include "si4463.h"
#include "si4463.c"

#define CPU_F((double)8000000)
#define delay_us(x)__delay_cycles(long)(CPU_F*(double)x/1000000.0)
#define delay_ms(x)__delay_cycles(long)(CPU_F*(double)x/1000.0)

//定义常量
#define TX 1//发送模式
#define RX 0//接收模式

#define ACK_LENGTH10//应答信号长度
#define SEND_LENGTH10//发送数据包的长度

INT16U RecvCnt = 0;//计数发送的数据包

//需要发送的数据
INT8U AckBuffer[ACK_LENGTH] = {10,11,12,13,14,15,16,17,18,19};

void MCU_Init(void){GPIO_Initial();USART_Initial();SPI_Initial();_EINT();//打开总中断
}
/*===========================================================================
* 函数 :RF_Initial() => 初始化RF芯片*
* 输入 :mode, =0,接收模式, else,发送模式*
* 说明 :SI44XX的操作,已经被建成C库,见SI446X.c文件, 提供SPI和CSN操作, *即可调用其内部所有函数用户无需再关心SI44XX的寄存器操作问题。*
============================================================================*/
void RF_Initial(INT8U mode)
{SI446X_RESET();// SI446X 模块复位SI446X_CONFIG_INIT();// 寄存器初始化,寄存器来自WDS配置的头文件SI446X_SET_POWER(0x7F); // 将输出功率配置为最大SI446X_START_RX(0, 0, PACKET_LENGTH, 8, 8, 8);// 进入接收模式
}

/*==========================================================================
* 函数:System_Initial() =>初始化系统所有外设*
===========================================================================*/
void System_Initial(void){MCU_Init();//初始化所有CPU硬件RF_Initial(RX);//初始化无线芯片,发送模式
}

/*===========================================================================
* 函数 :RF_RecvHandler() => 无线数据接收处理*
============================================================================*/
void RF_RecvHandler(void)
{INT8U error=0, i=0, length=0, recv_buffer[65]={ 0 };SI446X_INT_STATUS(recv_buffer);// 检测是否收到一个数据包// 收到一个数据包if (recv_buffer[3] & (1<<4)){length = SI446X_READ_PACKET(recv_buffer);// 判断数据是否有误,接收到的信号应该为0-9for (i=0; i<10; i++){if (recv_buffer[i] != i){ error=1; break; } // 数据出错}
if ((length==10) && (error==0))// 数据正确{PutString("Receive ok\r\n");delay_ms(10);/*******************************************我在这里调用了延时函数***************************************************/
// 返回应答信号,应答数据为10-19SI446X_SEND_PACKET(AckBuffer, ACK_LENGTH, 0, 0);do{SI446X_INT_STATUS(recv_buffer);}while (!(recv_buffer[3] & (1<<5)));//等待发射完成(中断产生)RecvCnt++; }//回到接收模式,继续等待下一包数据SI446X_START_RX(0, 0, PACKET_LENGTH,8, 8, 8);}
}

/*===========================================================================
* 函数 : main() => 主函数,程序入口*
* 说明 :每1s发送一包数据,每包数据长度为10个字节,数据内容为0-9*接收方反馈(应答)的数据长度为10个字节,数据内容为10-19*
============================================================================*/
void main( void )
{// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;System_Initial();while(1){RF_RecvHandler(); }
}

灰小子:

回复 user4973021:

第72行是哪一行?调用delay_ms(10);那一行吗?

这个代码#include 的几个头文件以及对应的c文件内容是怎么样的?

user4973021:

回复 灰小子:

对,72行就是调用delay_ms(10)那一行,#include 的几个头文件以及对应的c文件内容挺多的,都没用延时函数,我只用了这一次延时,所以在主函数定义了

user4973021:

回复 灰小子:

#include <msp430x14x.h>

#define CPU_F((double)8000000)
#define delay_us(x)__delay_cycles(long)(CPU_F*(double)x/1000000.0)
#define delay_ms(x)__delay_cycles(long)(CPU_F*(double)x/1000.0)

int main( void )
{// Stop watchdog timer to prevent time out resetWDTCTL = WDTPW + WDTHOLD;delay_ms(10);return 0;
}

我单拿出来这个延时程序也不行
Error[Pe029]: expected an expression C:\Users\87520\Desktop\test\main.c 9
Error[Pe109]: expression preceding parentheses of apparent call must have (pointer-to-) function type C:\Users\87520\Desktop\test\main.c 9

Susan Yang:

回复 user4973021:

我用下面的代码试了一下,没有错误。您可以参考一下

#include <msp430.h>/*** main.c*//* msDelay - delay milisecunds */
void msDelay(unsigned int ms) {while (ms--) __delay_cycles(8000);} // 8MHz on MSP430F149int main(void)
{WDTCTL = WDTPW | WDTHOLD;	// stop watchdog timermsDelay(10);return 0;
}

赞(0)
未经允许不得转载:TI中文支持网 » msp430 精准延时函数 编译出错
分享到: 更多 (0)