我试图设置一个包含寄存器,引脚号和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;
我认为这可能只是语法错误,但我不确定我做错了什么。我尝试了许多不同的类型转换/解除引用组合,但没有找到正确的解决方案。
答案 0 :(得分:2)
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是一个结构数组,而不是一个指针数组。