当前位置: 首页 > news >正文

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JS中this的指向问题、JS的执行机制、offset、client、scroll
  • 面试题:遍历三颗相连的满二叉树
  • OpenCV(第二关--读取图片和摄像头)实例+代码
  • 探索贪心算法:解决优化问题的高效策略
  • selenium(二)基于java、元素操控、Frame切换、元素等待
  • 【Go语言基础】调度器模型GPM与垃圾回收器GC
  • GNU/Linux - RSYSLOG
  • 基于大数据分析景区消费行为影响因素研究【消费等级预测、携程,去哪网数据抓取】
  • 去雾去雨算法
  • 力扣top300:1.两数之和
  • 37-RPC HTTP区别是什么
  • 用于目标说话人提取的统一视听线索
  • CSS3 3D 转换
  • GPT-6曝光!阉割版「草莓」秋季兑现
  • qtcreator的vim模式下commit快捷键ctrl+g,ctrl+c没有反应的问题
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【RocksDB】TransactionDB源码分析
  • CentOS6 编译安装 redis-3.2.3
  • ES6 ...操作符
  • HTTP中的ETag在移动客户端的应用
  • iOS编译提示和导航提示
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • October CMS - 快速入门 9 Images And Galleries
  • PHP 7 修改了什么呢 -- 2
  • SpingCloudBus整合RabbitMQ
  • 闭包--闭包作用之保存(一)
  • 关于Java中分层中遇到的一些问题
  • 好的网址,关于.net 4.0 ,vs 2010
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端面试题总结
  • 我从编程教室毕业
  • 移动端解决方案学习记录
  • 终端用户监控:真实用户监控还是模拟监控?
  • FaaS 的简单实践
  • 仓管云——企业云erp功能有哪些?
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • #pragma预处理命令
  • (13)Hive调优——动态分区导致的小文件问题
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Java入门)学生管理系统
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (十)T检验-第一部分
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)母版页和相对路径
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .dwp和.webpart的区别
  • .NET Core引入性能分析引导优化