..\HARDWARE\bsp_exti.c(86): error: #142: expression must have pointer-to-object type
时间: 2024-10-19 13:11:57 浏览: 51
这个错误信息来自嵌入式开发环境,通常与硬件中断相关的EXTI (External Interrupt)处理程序的C代码文件"bsp_exti.c"。错误编号#142表示在第86行遇到了一个编译错误,原因可能是试图对非指针类型的表达式进行了操作,而EXTI中断服务 Routine (ISR) 需要一个指向函数的指针。
在ARM Cortex-M系列微控制器中,EXTI中断经常会通过`EXTI_Callback`这样的函数指针结构来注册中断处理函数。如果代码中某个地方没有正确地将中断回调函数设置为指针形式,就会触发这种错误。检查86行的上下文,看看是否有如下情形:
```c
// 错误示例
void myFunction(void); // 没有指定类型为pointer
bsp_exti_Init(line86, myFunction); // 应该是myFunction();
// 正确示例
void (*myFunction)(void); // 指定为function pointer类型
bsp_exti_Init(line86, &myFunction); // 使用&符号获取函数地址
```
相关问题
..\src\app_gpio.c(835): error: #20: identifier "CHARGE_DETECT_INPUT_EXTI_LINE" is undefined if (EXTI_GetITStatus(CHARGE_DETECT_INPUT_EXTI_LINE) != RESET) ..\src\app_gpio.c(877): error: #20: identifier "CHARGE_DETECT_INPUT_PIN" is undefined GPIO_InitStructure.Pin = CHARGE_DETECT_INPUT_PIN; ..\src\app_gpio.c(880): error: #20: identifier "CHARGE_DETECT_INPUT_PORT" is undefined GPIO_InitPeripheral(CHARGE_DETECT_INPUT_PORT, &GPIO_InitStructure); ..\src\app_gpio.c(960): error: #20: identifier "PREDIS_PIN" is undefined GPIO_InitStructure.Pin = PREDIS_PIN | PRECHG_PIN; ..\src\app_gpio.c(960): error: #20: identifier "PRECHG_PIN" is undefined GPIO_InitStructure.Pin = PREDIS_PIN | PRECHG_PIN; ..\src\app_gpio.c(963): error: #20: identifier "PREDIS_PRECHG_PORT" is undefined GPIO_InitPeripheral(PREDIS_PRECHG_PORT, &GPIO_InitStructure);
这是一些编译错误,看起来是在应用程序的gpio.c文件中出现的。错误信息说找不到一些标识符,如CHARGE_DETECT_INPUT_EXTI_LINE、CHARGE_DETECT_INPUT_PIN、CHARGE_DETECT_INPUT_PORT、PREDIS_PIN、PRECHG_PIN和PREDIS_PRECHG_PORT。这些标识符可能没有被正确地定义或声明。你需要检查一下gpio.c文件,看看这些标识符在哪里定义或声明,或者是否有任何拼写错误。如果你无法解决这些错误,你可以尝试在相关开发论坛或社区上寻求帮助。
..\HARDWARE1\EXTI\exti.c(31): error: #137: expression must be a modifiable lvalue
这个错误信息提示来自硬件外设中断控制器EXTI(External Interrupt)部分的C源文件`exti.c`,行31处。"expression must be a modifiable lvalue"通常表示编译器在尝试对一个表达式赋值时遇到了问题,该表达式不是一个可以修改的变量或者说不是存储位置(lvalue)。在处理中断相关的代码时,可能是你在试图设置某个中断标志位,但是使用的不是一个可以修改的内存地址。
例如,如果你尝试这样做:
```c
EXTI_InitStructure EXTI_InitStructure = {0};
EXTI_InitStructure.EXTI_Line = LINE_Pin;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 错误在这里,可能期待的是一个指针或EXTIHandlers类型的变量
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 或者是一个已经声明过的中断标志位
EXTI_Init(&EXTI_InitStructure);
```
解决这个问题,你需要确保你正在操作的对象是可以被修改的,比如一个全局的标志变量或者是中断服务函数中正确声明的结构体成员。检查并修复这一行代码,使其指向一个正确的内存地址,并且有修改权限。
阅读全文