为什么 #define 行中出现",,预期声明"错误?使用 C



我正在用LoRa-02用C为stm32编写代码,遇到了一个奇怪的错误。

错误:

需要声明说明符或"…"在"("标记之前

代码的一部分:

在此处输入图像描述

txt:

#define PERIPH_BASE (0x40000000UL) /*!< Peripheral base address in the alias region */

/*!< Peripheral memory map */

#define APBPERIPH_BASE PERIPH_BASE

#define AHBPERIPH_BASE (PERIPH_BASE + 0x00020000UL)

#define IOPPERIPH_BASE (PERIPH_BASE + 0x10000000UL)

我正在使用SX1278的stms库。我不明白这个定义有什么错。声明序列似乎做得很正确,也许是嵌套定义的东西,或者是一些垃圾,我不知道。此外,当我将这段代码复制粘贴到新项目中时,错误会消失。

对不起,我的伦敦很糟糕,thx寻求帮助:v

之前的代码:

EDIt 1:错误前的一段代码,只有其他定义:

typedef struct
{
__IO uint16_t EP0R;            /*!< USB Endpoint 0 register,                Address offset: 0x00 */
__IO uint16_t RESERVED0;       /*!< Reserved */
__IO uint16_t EP1R;            /*!< USB Endpoint 1 register,                Address offset: 0x04 */
__IO uint16_t RESERVED1;       /*!< Reserved */
__IO uint16_t EP2R;            /*!< USB Endpoint 2 register,                Address offset: 0x08 */
__IO uint16_t RESERVED2;       /*!< Reserved */
__IO uint16_t EP3R;            /*!< USB Endpoint 3 register,                Address offset: 0x0C */
__IO uint16_t RESERVED3;       /*!< Reserved */
__IO uint16_t EP4R;            /*!< USB Endpoint 4 register,                Address offset: 0x10 */
__IO uint16_t RESERVED4;       /*!< Reserved */
__IO uint16_t EP5R;            /*!< USB Endpoint 5 register,                Address offset: 0x14 */
__IO uint16_t RESERVED5;       /*!< Reserved */
__IO uint16_t EP6R;            /*!< USB Endpoint 6 register,                Address offset: 0x18 */
__IO uint16_t RESERVED6;       /*!< Reserved */
__IO uint16_t EP7R;            /*!< USB Endpoint 7 register,                Address offset: 0x1C */
__IO uint16_t RESERVED7[17];   /*!< Reserved */
__IO uint16_t CNTR;            /*!< Control register,                       Address offset: 0x40 */
__IO uint16_t RESERVED8;       /*!< Reserved */
__IO uint16_t ISTR;            /*!< Interrupt status register,              Address offset: 0x44 */
__IO uint16_t RESERVED9;       /*!< Reserved */
__IO uint16_t FNR;             /*!< Frame number register,                  Address offset: 0x48 */
__IO uint16_t RESERVEDA;       /*!< Reserved */
__IO uint16_t DADDR;           /*!< Device address register,                Address offset: 0x4C */
__IO uint16_t RESERVEDB;       /*!< Reserved */
__IO uint16_t BTABLE;          /*!< Buffer Table address register,          Address offset: 0x50 */
__IO uint16_t RESERVEDC;       /*!< Reserved */
__IO uint16_t LPMCSR;          /*!< LPM Control and Status register,        Address offset: 0x54 */
__IO uint16_t RESERVEDD;       /*!< Reserved */
__IO uint16_t BCDR;            /*!< Battery Charging detector register,     Address offset: 0x58 */
__IO uint16_t RESERVEDE;       /*!< Reserved */
} USB_TypeDef;
/**
* @}
*/
/** @addtogroup Peripheral_memory_map
* @{
*/
#define FLASH_BASE             (0x08000000UL) /*!< FLASH base address in the alias region */
#define DATA_EEPROM_BASE       (0x08080000UL) /*!< DATA_EEPROM base address in the alias region */
#define DATA_EEPROM_BANK2_BASE (0x08080C00UL) /*!< DATA EEPROM BANK2 base address in the alias region */
#define DATA_EEPROM_BANK1_END  (0x08080BFFUL) /*!< Program end DATA EEPROM BANK1 address */
#define DATA_EEPROM_BANK2_END  (0x080817FFUL) /*!< Program end DATA EEPROM BANK2 address */
#define SRAM_BASE              (0x20000000UL) /*!< SRAM base address in the alias region */
#define SRAM_SIZE_MAX          (0x00005000UL) /*!< maximum SRAM size (up to 20KBytes) */

#define PERIPH_BASE (0x40000000UL) /*!< Peripheral base address in the alias region */

编辑2:

为了清楚起见,我的代码(main.c(只是几个#include和一个无休止的循环。

包含头文件的代码的一部分:

#if defined(STM32L010xB)
#include "stm32l010xb.h"
#elif defined(STM32L010x8)
#include "stm32l010x8.h"
#elif defined(STM32L010x6)
#include "stm32l010x6.h"
#elif defined(STM32L010x4)
#include "stm32l010x4.h"
#elif defined(STM32L011xx)
#include "stm32l011xx.h"
#elif defined(STM32L021xx)
#include "stm32l021xx.h"
#elif defined(STM32L031xx)
#include "stm32l031xx.h"
#elif defined(STM32L041xx)
#include "stm32l041xx.h"
#elif defined(STM32L051xx)
#include "stm32l051xx.h"
#elif defined(STM32L052xx)
#include "stm32l052xx.h"
#elif defined(STM32L053xx)
#include "stm32l053xx.h"
#elif defined(STM32L062xx)
#include "stm32l062xx.h"
#elif defined(STM32L063xx)
#include "stm32l063xx.h"
#elif defined(STM32L061xx)
#include "stm32l061xx.h"
#elif defined(STM32L071xx)
#include "stm32l071xx.h"
#elif defined(STM32L072xx)
#include "stm32l072xx.h"  //here
#elif defined(STM32L073xx)
#include "stm32l073xx.h"
#elif defined(STM32L082xx)
#include "stm32l082xx.h"
#elif defined(STM32L083xx)
#include "stm32l083xx.h"
#elif defined(STM32L081xx)
#include "stm32l081xx.h"
#else
#error "Please select first the target STM32L0xx device used in your application (in stm32l0xx.h file)"
#endif

以及使用PERIPH_BASE的代码的一部分。这是一个hal-rcc头文件:

/* Disable Backup domain write protection state change timeout */
#define RCC_DBP_TIMEOUT_VALUE      (100U)       /* 100 ms */
/* LSE state change timeout */
#define RCC_LSE_TIMEOUT_VALUE      LSE_STARTUP_TIMEOUT
#define CLOCKSWITCH_TIMEOUT_VALUE  (5000U)  /* 5 s    */
#define HSE_TIMEOUT_VALUE          HSE_STARTUP_TIMEOUT
#define MSI_TIMEOUT_VALUE          (2U)      /* 2 ms (minimum Tick + 1) */
#define HSI_TIMEOUT_VALUE          (2U)      /* 2 ms (minimum Tick + 1) */
#define LSI_TIMEOUT_VALUE          (2U)      /* 2 ms (minimum Tick + 1) */
#define PLL_TIMEOUT_VALUE          (2U)      /* 2 ms (minimum Tick + 1) */
#if defined(RCC_HSI48_SUPPORT)
#define HSI48_TIMEOUT_VALUE        (2U)      /* 2 ms (minimum Tick + 1) */
#endif /* RCC_HSI48_SUPPORT */
/**
* @}
*/

/** @defgroup RCC_BitAddress_AliasRegion BitAddress AliasRegion
* @brief RCC registers bit address in the alias region
* @{
*/
#define RCC_OFFSET                (RCC_BASE - PERIPH_BASE)
/* --- CR Register ---*/
/* Alias word address of HSION bit */
#define RCC_CR_OFFSET             (RCC_OFFSET + 0x00U)
/* --- CFGR Register ---*/
/* Alias word address of I2SSRC bit */
#define RCC_CFGR_OFFSET           (RCC_OFFSET + 0x08U)
/* --- CSR Register ---*/
#define RCC_CSR_OFFSET            (RCC_OFFSET + 0x74U)
/* CR register byte 3 (Bits[23:16]) base address */
#define RCC_CR_BYTE2_ADDRESS      (0x40023802U)
/* CIER register byte 0 (Bits[0:8]) base address */
#define CIER_BYTE0_ADDRESS        ((uint32_t)(RCC_BASE + 0x10U + 0x00U))
/**

错误描述的图像:

在此处输入图像描述

和来自控制台的文本:

Building file: ../BSP/MLM32L07X01/mlm32l07x01.c
In file included from C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/CMSIS/device/stm32l0xx.h:153:0,
from C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/HAL_Driver/Inc/stm32l0xx_ll_rcc.h:29,
from ../HAL_Driver/Src/stm32l0xx_ll_utils.c:20:
C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/CMSIS/device/stm32l072xx.h:625:21: error: expected declaration specifiers or '...' before '(' token
#define PERIPH_BASE (0x40000000UL) /*!< Peripheral base address in the alias region */
^
C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/CMSIS/device/stm32l072xx.h:629:31: note: in expansion of macro 'PERIPH_BASE'
#define APBPERIPH_BASE        PERIPH_BASE
^~~~~~~~~~~
C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/CMSIS/device/stm32l072xx.h:641:32: note: in expansion of macro 'APBPERIPH_BASE'
#define USART2_BASE           (APBPERIPH_BASE + 0x00004400UL)
^~~~~~~~~~~~~~
C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/CMSIS/device/stm32l072xx.h:710:48: note: in expansion of macro 'USART2_BASE'
#define USART2              ((USART_TypeDef *) USART2_BASE)
^~~~~~~~~~~
C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/inc/mlm32l0xx_hw_conf.h:120:42: note: in expansion of macro 'USART2'
#define USARTx                           USART2
^~~~~~
C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/HAL_Driver/Inc/stm32l0xx_ll_rcc.h:1586:62: note: in expansion of macro 'USARTx'
__STATIC_INLINE uint32_t LL_RCC_GetUSARTClockSource(uint32_t USARTx)
^~~~~~
HAL_Driver/Src/subdir.mk:210: recipe for target 'HAL_Driver/Src/stm32l0xx_ll_utils.o' failed
make: *** [HAL_Driver/Src/stm32l0xx_ll_utils.o] Error 1
Invoking: MCU GCC Compiler
make: *** Waiting for unfinished jobs....
C:UsersWojtekworkspaceRA_B-L072Z-LRWAN1Debug
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -mfloat-abi=soft -DSTM32 -DSTM32L0 -DSTM32L072CZYx -DB_L072Z_LRWAN1 -DDEBUG -DSTM32L072xx -DUSE_HAL_DRIVER -DUSE_B_L072Z_LRWAN1 -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/inc" -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/CMSIS/core" -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/CMSIS/device" -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/HAL_Driver/Inc" -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/HAL_Driver/Inc/Legacy" -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/BSP/B-L072Z-LRWAN1" -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/BSP/MLM32L07X01" -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/BSP/MLM32L07X01/Phy" -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/Lora/Phy" -I"C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/Lora/Utilities" -O0 -g3 -Wall -fmessage-length=0 -ffunction-sections -c -MMD -MP -MF"BSP/MLM32L07X01/mlm32l07x01.d" -MT"BSP/MLM32L07X01/mlm32l07x01.o" -o "BSP/MLM32L07X01/mlm32l07x01.o" "../BSP/MLM32L07X01/mlm32l07x01.c"
Finished building: ../HAL_Driver/Src/stm32l0xx_ll_usb.c

Finished building: ../BSP/MLM32L07X01/Phy/sx1276.c

Finished building: ../BSP/MLM32L07X01/mlm32l07x01.c

14:07:34 Build Finished (took 15s.652ms)

编辑3:

可能导致问题的功能:

stm32l0xx_ll_rcc.c:

uint32_t LL_RCC_GetUSARTClockFreq(uint32_t USARTxSource)
{
uint32_t usart_frequency = LL_RCC_PERIPH_FREQUENCY_NO;
/* Check parameter */
assert_param(IS_LL_RCC_USART_CLKSOURCE(USARTxSource));
#if defined(RCC_CCIPR_USART1SEL)
if (USARTxSource == LL_RCC_USART1_CLKSOURCE)
{
/* USART1CLK clock frequency */
switch (LL_RCC_GetUSARTClockSource(USARTxSource))
{
case LL_RCC_USART1_CLKSOURCE_SYSCLK: /* USART1 Clock is System Clock */
usart_frequency = RCC_GetSystemClockFreq();
break;
case LL_RCC_USART1_CLKSOURCE_HSI:    /* USART1 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() != 0U)
{
if (LL_RCC_IsActiveFlag_HSIDIV() != 0U)
{
usart_frequency = (HSI_VALUE >> 2U);
}
else
{
usart_frequency = HSI_VALUE;
}
}
break;
case LL_RCC_USART1_CLKSOURCE_LSE:    /* USART1 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() != 0U)
{
usart_frequency = LSE_VALUE;
}
break;
case LL_RCC_USART1_CLKSOURCE_PCLK2:  /* USART1 Clock is PCLK2 */
default:
usart_frequency = RCC_GetPCLK2ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
}
}
#endif /* RCC_CCIPR_USART1SEL  */
#if defined(RCC_CCIPR_USART2SEL)
if (USARTxSource == LL_RCC_USART2_CLKSOURCE)
{
/* USART2CLK clock frequency */
switch (LL_RCC_GetUSARTClockSource(USARTxSource))
{
case LL_RCC_USART2_CLKSOURCE_SYSCLK: /* USART2 Clock is System Clock */
usart_frequency = RCC_GetSystemClockFreq();
break;
case LL_RCC_USART2_CLKSOURCE_HSI:    /* USART2 Clock is HSI Osc. */
if (LL_RCC_HSI_IsReady() != 0U)
{
if (LL_RCC_IsActiveFlag_HSIDIV() != 0U)
{
usart_frequency = (HSI_VALUE >> 2U);
}
else
{
usart_frequency = HSI_VALUE;
}
}
break;
case LL_RCC_USART2_CLKSOURCE_LSE:    /* USART2 Clock is LSE Osc. */
if (LL_RCC_LSE_IsReady() != 0U)
{
usart_frequency = LSE_VALUE;
}
break;
case LL_RCC_USART2_CLKSOURCE_PCLK1:  /* USART2 Clock is PCLK1 */
default:
usart_frequency = RCC_GetPCLK1ClockFreq(RCC_GetHCLKClockFreq(RCC_GetSystemClockFreq()));
break;
}
}
#endif /* RCC_CCIPR_USART2SEL */
return usart_frequency;
}

stm32l0xx_ll_rcc.h:

/**
* @brief  Get USARTx clock source
* @rmtoll CCIPR        USARTxSEL     LL_RCC_GetUSARTClockSource
* @param  USARTx This parameter can be one of the following values:
*         @arg @ref LL_RCC_USART1_CLKSOURCE (*)
*         @arg @ref LL_RCC_USART2_CLKSOURCE
* @retval Returned value can be one of the following values:
*         @arg @ref LL_RCC_USART1_CLKSOURCE_PCLK2 (*)
*         @arg @ref LL_RCC_USART1_CLKSOURCE_SYSCLK (*)
*         @arg @ref LL_RCC_USART1_CLKSOURCE_HSI (*)
*         @arg @ref LL_RCC_USART1_CLKSOURCE_LSE (*)
*         @arg @ref LL_RCC_USART2_CLKSOURCE_PCLK1
*         @arg @ref LL_RCC_USART2_CLKSOURCE_SYSCLK
*         @arg @ref LL_RCC_USART2_CLKSOURCE_HSI
*         @arg @ref LL_RCC_USART2_CLKSOURCE_LSE
*
*         (*) value not defined in all devices.
*/
__STATIC_INLINE uint32_t LL_RCC_GetUSARTClockSource(uint32_t USARTx)
{
return (uint32_t)(READ_BIT(RCC->CCIPR, USARTx) | (USARTx << 16U));
}

编译器输出的这个片段揭示了问题(或至少一个问题(的性质:

C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/inc/mlm32l0xx_hw_conf.h:120:42: note: in expansion of macro 'USART2'
#define USARTx                           USART2
^~~~~~
C:/Users/Wojtek/workspace/RA_B-L072Z-LRWAN1/HAL_Driver/Inc/stm32l0xx_ll_rcc.h:1586:62: note: in expansion of macro 'USARTx'
__STATIC_INLINE uint32_t LL_RCC_GetUSARTClockSource(uint32_t USARTx)

在函数LL_RCC_GetUSARTClockSource的声明中,您试图为参数指定一个已定义为宏标识符的名称(USARTx(。结果是,参数/宏名称将替换为宏的展开文本,该文本最终将使用PERIPH_BASE宏。这在当时是无效的。

相关内容

  • 没有找到相关文章

最新更新