c - 在结构中使用寄存器

标签 c pointers struct embedded

我正在尝试设置一个包含寄存器、引脚号和 adc 值的结构。我想使用名为 setLEDs 的函数更改寄存器的值。但是,我收到错误提示

expression must have integral type
expression must have pointer type

这是我的结构。 LED_X 和端口在上面定义。

typedef struct
{
    const uint32_t pin;
    volatile uint32_t * const reg;
    uint32_t adcValue;
} LED_LUT;

#define LED_LUT_DEF {{LED_0, (volatile uint32_t*)GPIO_PORTC_DATA_R, 0}, \
                     {LED_1, (volatile uint32_t*)GPIO_PORTC_DATA_R, 0}, \
                     {LED_2, (volatile uint32_t*)GPIO_PORTC_DATA_R, 0}, \
                     {LED_3, (volatile uint32_t*)GPIO_PORTC_DATA_R, 0}, \
                     {LED_4, (volatile uint32_t*)GPIO_PORTF_DATA_R, 0}, \
                     {LED_5, (volatile uint32_t*)GPIO_PORTF_DATA_R, 0}, \
                     {LED_6, (volatile uint32_t*)GPIO_PORTF_DATA_R, 0}, \
                     {LED_7, (volatile uint32_t*)GPIO_PORTF_DATA_R, 0},}

这是接收编译错误的函数:

void setLEDs(LED_LUT ledLUT[NUM_OF_LEDS])
{
    int i;
    for (i=0; i < NUM_OF_LEDS; ++i)
    {
        //If above threshold, set the pin, else clear it
        if (ledLUT[i].adcValue > ADC_THRESHOLD)
        {
            ledLUT[i]->reg |= (uint32_t*)ledLUT[i].pin;//error here
        }
        else
        {
            ledLUT[i]->reg &= (uint32_t*)~ledLUT[i].pin;//error here
        }

    }
}

ledLUT 在 main 中初始化为:

LED_LUT ledLUT[8] = LED_LUT_DEF;

我认为这可能只是一个语法错误,但我不确定我做错了什么。我尝试了多种类型转换/取消引用的不同组合,但没有找到正确的解决方案。

最佳答案

ledLUT[i]->reg |= (uint32_t*)ledLUT[i].pin

应该是

*(ledLUT[i].reg) |= (uint32_t)ledLUT[i].pin

ledLUT[i]->reg &= (uint32_t*)~ledLUT[i].pin

应该是

*(ledLUT[i].reg) &= (uint32_t)~ledLUT[i].pin

因为 ledLUT 是结构数组,而不是指针数组。

关于c - 在结构中使用寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26600585/

相关文章:

c - 段错误核心转储 gcc 代码块

C 编程代码(帮助)

c - 如何使用指针在 c 中编写自己的 strchr?

C 枚举警告

c++ - 从 C 程序访问 C++ 函数时,收到错误消息 "Access violation reading location"

python - 在 Python 中访问 void 指针(使用 SWIG 或其他东西)

我可以使用 &array[0][0][0] 传递声明为 double ***array 的 3D 数组吗?

c++ - C++ 中 "rich type"结构的开销

pointers - Golang 通过引用结构成员值传递变量

python - 从 python 调用 C++ dll