我可以将uint32_t的四个字节强制转换为uint8_t指针吗



一些背景:

我使用STM32接收和传输一个24位的长信号,该信号可以确定电池是过度放电还是过度充电,并通过AFE监测温度。

实际问题:

我需要在其中一个STM库中使用的函数采用一个8位指针的参数:HAL_SPI_Transmit(&hspi1, (uint8_t *)&buf_ptr, 1, 100);,以便与24位AFE接口。我的目标是编写一个32位信号,可以对我需要的数据进行编码,只需调用函数3次,并用8位指针引用32位信号。但我想知道解决我的问题最简单的方法是什么

我的第一个希望是,我可以用一个8位指针访问信息的第一个字节,然后每次将地址增加一个:

void MAX_Interface::MOSI_BufTransmit()
{
uint8_t* buf_ptr = (uint8_t) &OBuf;
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_RESET);
for (int i = 0; i < 3; i++)
{
HAL_SPI_Transmit(&hspi1, (uint8_t *)&buf_ptr, 1, 100);
buf_ptr++;
}
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_SET);
}

我的第二个想法是,也许我可以每次将输出缓冲区位移8位,然后将其转换为一个字节:

void MAX_Interface::MOSI_BufTransmit()
{
uint8_t* buf_ptr
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_RESET);
for (int i = 0; i < 3; i++)
{
buf_ptr =(uint8_t*) OBuf>>8*i;
HAL_SPI_Transmit(&hspi1, (uint8_t *)&buf_ptr, 1, 100);
}
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_SET);
}

我觉得这些可能是最优雅的解决方案,但都不起作用。

有人更了解这个话题吗?

访问32位整数的单个字节是可以的。

但是,由于将错误的内存地址传递给HAL_SPI_Transmit(),这两种方法都无法工作。您传递的是buf_ptr本身的地址,而不是buf_ptr所指向的OBuf的地址。

此外,在第二种方法的情况下,您甚至没有将buf_ptr指定为指向一个有效的内存地址!您正在读取OBuf各个字节的,并将它们强制转换为指针,而不是获取每个字节的地址

试试这个:

void MAX_Interface::MOSI_BufTransmit()
{
uint8_t* buf_ptr = (uint8_t*) &OBuf;
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_RESET);
for (int i = 0; i < 3; ++i)
{
HAL_SPI_Transmit(&hspi1, buf_ptr+i, 1, 100); // or: &buf_ptr[i]
}
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_SET);
}

也就是说,HAL_SPI_Transmit()的第三个参数是字节计数,所以你可以试着简单地要求HAL_SPI_Transmit()一次性发送所有3个字节,而不是每次调用HAL_SPI_Transmit()3次发送1个字节,例如:

void MAX_Interface::MOSI_BufTransmit()
{
uint8_t* buf_ptr = (uint8_t*) &OBuf;
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1, buf_ptr, 3, 100);
HAL_GPIO_WritePin(GPIOB, CS_Pin, GPIO_PIN_SET);
}

相关内容

  • 没有找到相关文章

最新更新