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);
}