STM32G474的HAL_ADC_Start_DMA()传递指针问题

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值