请教下这个报错是怎么回事啊
编译报错user\main.c(42): error C141: syntax error near ']', expected 'sizeof'
代码如下
#include "main.h"
void main(void)
{
u8 current=10;
u16 p;
u8 f_scan=scan_start;//扫频值初始化
io_init();
pwm_init();
OLED_Init();//初始化OLED
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
display_0();//开机界面
delay_ms(1000);
OLED_Clear();//清屏
while(1)
{
pwm_out(pwm_f_d16[],2);
// OLED_DrawBMP(0,0,128,64,BMP1);
display_mode4();//直径16雾化片固定显示界面
current++;
f_scan++;
p=current*6;
if(current>254)current=10;
if(f_scan>scan_end)f_scan=scan_start;
OLED_ShowNum(25,6,p,4,16);//显示功率值
OLED_ShowNum(98,6,current,3,16);//显示电流值
OLED_ShowNum(25,4,f_scan,3,16);//显示扫频终值
}
}
#include "main.h"
/*******************本地变量定义**********************/
u16 PWM1_Duty;
u16 PWM_PERIOD;
u16 pwm_f_d16[]={240,218,200,185,171,160};//D16雾化片 100-150khz步进10KHZ
u16 pwm_f_d13={200,185,171,160,150,141};//D13雾化片 120-170khz步进10KHZ
u16 pwm_f_d10={185,171,160,150,141,133};//D10雾化片 130-180khz步进10KHZ
u16 pwm_f_d8={133,126,120,114,109,104};//D8雾化片 180-230khz步进10KHZ
/*************************PWM寄存器初始化********************************/
void pwm_init()
{
PWM1_Duty=120;//占空比初始值50%
PWM_PERIOD=240;//频率初始值100KHZ
P_SW2|=0x80;
PWM1_ENO =0x04;
PWM1_PS=0x00;//高级 PWM 通道输出脚选择位在P1口
CLKSEL=0x00; //选择内部 IRC ( 默认 )
CLKDIV=0x00;//不分频
PWM1_CCER1=0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWM1_CCMR2=0x68; //通道模式配置PWM模式1 输出方向CCMRX是哪个通道就写哪个数字
PWM1_CCER1=0x10; //配置通道输出使能和极性
PWM1_ARRH =(u8)(PWM_PERIOD >> 8); //设置周期时间
PWM1_ARRL =(u8)PWM_PERIOD;
PWM1_CCR2H =(u8)(PWM1_Duty >> 8); //设置占空比时间 CCRXH是哪个通道就写哪个数字
PWM1_CCR2L =(u8)(PWM1_Duty);
PWM1_BKR=0x80; //使能主输出
PWM1_CR1=0x01; //开始计时
}
/**************PWM输出任意频率和占空比函数********************/
void pwm_out(u16 pwm_f[],u16 duty_set)
{
u16 i;
u16 period;
u16 duty;
for(i=0;i<6;i++)
{
period=pwm_f;
PWM1_ARRH =(u8)(period >> 8); //更新周期时间
PWM1_ARRL =(u8)period;
duty=duty_set*period;
PWM1_CCR2H =(u8)(duty >> 8); //更新占空比时间 CCRXH是哪个通道就写哪个数字 比如PWM1P就写1,PWM2P就写2
PWM1_CCR2L =(u8)(duty);
delay_ms(100);
}
}
头文件
#ifndef __PWM_H
#define __PWM_H
#define PWM1_1 0x00 //P:P1.0N:P1.1
#define PWM1_2 0x01 //P:P2.0N:P2.1
#define PWM1_3 0x02 //P:P6.0N:P6.1
#define PWM2_1 0x00 //P:P1.2/P5.4N:P1.3
#define PWM2_2 0x04 //P:P2.2N:P2.3
#define PWM2_3 0x08 //P:P6.2N:P6.3
#define PWM3_1 0x00 //P:P1.4N:P1.5
#define PWM3_2 0x10 //P:P2.4N:P2.5
#define PWM3_3 0x20 //P:P6.4N:P6.5
#define PWM4_1 0x00 //P:P1.6N:P1.7
#define PWM4_2 0x40 //P:P2.6N:P2.7
#define PWM4_3 0x80 //P:P6.6N:P6.7
#define PWM4_4 0xC0 //P:P3.4N:P3.3
#define ENO1P 0x01
#define ENO1N 0x02
#define ENO2P 0x04
#define ENO2N 0x08
#define ENO3P 0x10
#define ENO3N 0x20
#define ENO4P 0x40
#define ENO4N 0x80
//#define PWM_PERIOD1000 //设置周期值
unsigned int pwm_f_d16[];
void pwm_init();
void UpdatePWM();
void pwm_init2();
void pwm_out(unsigned int pwm_f[],unsigned intduty_set);
#endif
您遇到的编译错误是由于函数调用参数传递不规范导致的语法问题。具体分析如下:
一、错误定位分析
在代码第42行:
pwmout(pwmfd16[],2);
错误提示C141表明编译器在']'符号处发现语法异常,期望看到sizeof操作符或其他有效表达式。其核心问题是数组参数传递不规范:
1. pwmfd16[]的用法不符合C语言规范
空的中括号[]在函数参数中只能用于函数原型声明(如:void func(int arr[]))
函数调用时必须传递具体数组元素或指针
2. 参数类型不匹配
pwmout函数原型可能需要明确的数组地址或特定元素
未闭合的中括号导致编译器无法解析参数类型
二、修正建议
根据代码上下文,建议以下两种修改方案:
方案一:传递数组首地址
pwmout(pwmfd16, 2);// 直接传递数组名作为指针
方案二:指定具体索引
pwmout(pwmfd16, 2); // 假设需要传递第一个元素
三、潜在关联问题排查
建议进一步检查以下相关定义:
1. 数组定义验证(应存在于头文件或模块中):
/ 示例正确声明 /
u16 pwmfd16 = { / 初始化值 / };
2. 函数原型确认(应包含在main.h):
void pwmout(u16 param1, u8 param2);// 或 void pwmout(u16 arr, u8 len)
四、代码优化建议
1. 变量初始化规范:
建议将current和fscan初始值统一为0或明确初始状态:
u8 current = 0;// 推荐使用0初始值
u16 p = 0;
u8 fscan = scanstart & 0xFF; // 确保值域有效性
2. 数值边界保护:
建议增加范围检查宏定义:
define CURRENTMAX 254
define CURRENTMIN 10
current = (current > CURRENTMAX) ? CURRENTMIN : current+1;
3. 显示刷新优化:
可封装显示更新函数,避免重复代码:
void updatedisplay(u16 p, u8 current, u8 fscan) {
OLEDShowNum(25,6,p,4,16);
OLEDShowNum(98,6,current,3,16);
OLEDShowNum(25,4,fscan,3,16);
}
五、补充说明
1. 类型定义验证:
请确认main.h中正确定义了数据类型:
typedef unsigned char u8;
typedef unsigned short u16;
2. PWM相关配置:
建议检查pwminit()实现,确保:
时钟配置正确
预分频器设置合理
自动重载值(ARR)已配置
输出模式使能
如果需要进一步定位问题,建议提供:
1. pwmout函数实现代码
2. pwmfd16数组的完整声明
3. 编译器版本及芯片型号信息(可模糊处理具体型号)
以上修改方案已考虑代码安全性、可维护性及执行效率,建议结合具体硬件特性进行参数优化。
[本文内容由国芯人工智能辅助生成,仅供参考] 语法不对pwm_out(pwm_f_d16[],2);
非常感谢,很专业,问题已解决。
页:
[1]