为什么,预期的声明;#定义行中出现错误?使用C

为什么,预期的声明;#定义行中出现错误?使用C,c,stm32,declaration,C,Stm32,Declaration,我正在用LoRa-02为stm32编写C代码,我遇到了一个奇怪的错误 错误: 需要声明说明符或“(”标记之前的“…” 代码的一部分: txt: 以及使用PERIPH_BASE的代码的一部分。它是hal rcc头文件: /* Disable Backup domain write protection state change timeout */ #define RCC_DBP_TIMEOUT_VALUE (100U) /* 100 ms */ /* LSE state

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

错误:

需要声明说明符或“(”标记之前的“…”

代码的一部分:

txt:

以及使用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:\Users\Wojtek\workspace\RA_B-L072Z-LRWAN1\Debug
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)
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));
}
/**
*@brief获取USARTx时钟源
*@rmtoll CCIPR USARTxSEL LL_RCC_GetUSARTlockSource
*@param USARTx此参数可以是以下值之一:
*@arg@ref LL\u RCC\u USART1\u CLKSOURCE(*)
*@arg@ref LL\u RCC\u USART2\u CLKSOURCE
*@retval返回的值可以是以下值之一:
*@arg@ref LL_RCC_USART1_CLKSOURCE_PCLK2(*)
*@arg@ref LL\u RCC\u USART1\u CLKSOURCE\u SYSCLK(*)
*@arg@ref LL\u RCC\u USART1\u CLKSOURCE\u HSI(*)
*@arg@ref LL_RCC_USART1_CLKSOURCE_LSE(*)
*@arg@ref LL\u RCC\u USART2\u CLKSOURCE\u PCLK1
*@arg@ref LL\u RCC\u USART2\u CLKSOURCE\u SYSCLK
*@arg@ref LL\u RCC\u USART2\u CLKSOURCE\u HSI
*@arg@ref LL_RCC_USART2_CLKSOURCE_LSE
*
*(*)值未在所有设备中定义。
*/
__静态内嵌uint32\u t LL\u RCC\u GetUSARTClockSource(uint32\u t USARTx)
{

return(uint32_t)(READ_BIT(RCC->CCIPR,USARTx)|(USARTx此编译器输出片段揭示了问题的性质(或至少一个问题):


在函数声明
LL\u RCC\u GetUSARTClockSource
中,您试图为参数指定一个名称(
USARTx
)这已经被定义为宏标识符。结果是,参数/宏名称被替换为宏的扩展文本,该扩展文本最终使用您的
PERIPH_BASE
macro。这在当时是无效的。

问题出在这段代码之前。请发布一个包含宏如何使用的扩展文本。“当我将这段代码复制粘贴到新项目中时,错误就消失了。"可能会有一些非打印字符进入文本文件,你看不到,但编译器可以。不要发布代码的图片,尤其是当你已经将代码发布为文本时,上一张图片中行末的
2
是什么?哇哦,非常感谢。我找到了LL_RCC_GetUSARTClockSource函数代码编辑中的ion 3。如何修复错误?@Beornwolf666,通过将函数参数的名称更改为未声明为宏名称的名称来修复错误。许多项目采用一种约定,即使用所有大写字母命名宏,其他标识符至少使用一些小写字母,以避免像您这样的冲突。
/* 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:\Users\Wojtek\workspace\RA_B-L072Z-LRWAN1\Debug
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)
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;
}
/**
  * @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)