当前位置: 首页> 教育> 高考 > STM32G474的HAL_ADC_Start_DMA()传递指针问题

STM32G474的HAL_ADC_Start_DMA()传递指针问题

时间:2025/7/14 11:20:19来源:https://blog.csdn.net/weixin_42550185/article/details/141642050 浏览次数:0次

1、HAL_ADC_Start_DMA()传递指针问题
函数传递参数中若用到指针,则要注意指针的类型和源数据数据类型要保持一致,否则,会导致内存溢出。
STM32G474的ADC值是12位,HAL库用的是32位指针传输数据,因此,在定义保存ADC值的数组或变量,必须为32位。
否则在调用HAL_ADC_Start_DMA()时,会导致内存崩溃。分析如下:
HAL_ADC_Start_DMA(ADC_HandleTypeDef *hadc, uint32_t *pData, uint32_t Length)
这里的pData是指向32为存储单元,如果我们传入的地址是指向16位的存储单元,在向“*pData”写入数据时,
“16位存储单元”会发生溢出。
uint32_t ADC1_RESULT[2];没有问题
uint16_t ADC1_RESULT[2];可能会导致内存溢出
HAL_ADC_Start_DMA(&hadc1,(uint32_t*)ADC1_RESULT,2);

2、测试程序 

typedef struct 
{ uint8_t Byte1;
    uint8_t Byte2;
    uint8_t Byte3;
    uint8_t Byte4;
}Uint8_Data_TYPE;

typedef struct 
{ uint16_t Data1;
    uint16_t Data2;
}Uint16_Data_TYPE;

typedef union
{ Uint8_Data_TYPE  U8Data;   //U8Data.Byte1和U32Data的最高8位值相等;
    Uint16_Data_TYPE U16Data;  //U16Data.Data1和U32Data的高16位值相等;
  uint32_t         U32Data;
}U32_Data_TYPE;

U32_Data_TYPE MyData;

void Read_DAta(uint32_t *pData)
{
    *pData=0x12345678;
}

void PrintMyData(void)
{
    MyData.U32Data=0x00000000;
    printf("MyData.U32Data=0x%X\r\n",MyData.U32Data);
    Read_DAta( (uint32_t*)&MyData.U8Data.Byte1 );
    //MyData.U8Data.Byte1是一个字节型数据
    //如果将它的地址强制转换32位指针,使用这个指针修改数据,可能让内存崩溃

    printf("MyData.U32Data=0x%X\r\n",MyData.U32Data);
    printf("MyData.U8Data.Byte1=0x%X\r\n",MyData.U8Data.Byte1);
    printf("MyData.U8Data.Byte2=0x%X\r\n",MyData.U8Data.Byte2);
    printf("MyData.U8Data.Byte3=0x%X\r\n",MyData.U8Data.Byte3);
    printf("MyData.U8Data.Byte4=0x%X\r\n",MyData.U8Data.Byte4);
}

关键字:STM32G474的HAL_ADC_Start_DMA()传递指针问题

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: