OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4222|回复: 8

最近在做项目准备用F4 ADC+DMA 多通道采集电压 一直采集不到正确电压 求论坛高手求解 好人一生平安

[复制链接]

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-4-17
在线时间
29 小时
发表于 2017-1-4 22:24:52 | 显示全部楼层 |阅读模式
10金钱

F4 ADC DMA.zip

5.19 MB, 下载次数: 90

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

18

主题

190

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1068
金钱
1068
注册时间
2012-6-18
在线时间
158 小时
发表于 2017-1-6 19:19:11 | 显示全部楼层
看了你的程序,错误来源于ADC 和dma初始化上,adc 句柄设置中中断软件方式没有设置。dma 设置上你好好看看原子的历程。另外对于规则通道的dma 我的建议不要用一维数组,用二维数组比较好。既然地址增加二维数组直接保存更加方便。[mw_shl_code=cpp,true]/* DMA外设初始化配置 */
    DMA_ADC_Handler.Instance                                                                         = DMA2_Stream0;  //数据流选择
    DMA_ADC_Handler.Init.Channel                                                         = DMA_CHANNEL_0; //通道选择  
          DMA_ADC_Handler.Init.Direction                                                 = DMA_PERIPH_TO_MEMORY;//外设到存储器
                DMA_ADC_Handler.Init.PeriphInc                                                = DMA_PINC_DISABLE;  //外设地址不增加
          DMA_ADC_Handler.Init.MemInc                                                         = DMA_MINC_ENABLE;   //存储器地址增加
    DMA_ADC_Handler.Init.PeriphDataAlignment         = DMA_PDATAALIGN_HALFWORD;//字节模式
    DMA_ADC_Handler.Init.MemDataAlignment                 = DMA_PDATAALIGN_HALFWORD;//数据半字节
    DMA_ADC_Handler.Init.Mode                                                                 = DMA_NORMAL;
                DMA_ADC_Handler.Init.Priority                                                 = DMA_PRIORITY_HIGH;
                DMA_ADC_Handler.Init.FIFOMode                                                 = DMA_FIFOMODE_DISABLE;
   
                HAL_DMA_Init(&DMA_ADC_Handler);
          
                /* 连接DMA */
    __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,DMA_ADC_Handler);
//以上是dma 句柄设置

//adc 部分
void MX_ADC1_Init(void)
{
     ADC_ChannelConfTypeDef sConfig;
// ADC功能配置
  ADC1_Handler.Instance                   = ADC1;
        ADC1_Handler.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ
  ADC1_Handler.Init.Resolution            = ADC_RESOLUTION_12B;    //12位模式
  ADC1_Handler.Init.ScanConvMode          = ENABLE;              //扫描模式
        ADC1_Handler.Init.ContinuousConvMode    = ENABLE;               //打开连续转换
        ADC1_Handler.Init.DiscontinuousConvMode = DISABLE;             //不连续采样模式
        ADC1_Handler.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE; //软件触发
        ADC1_Handler.Init.ExternalTrigConv      = ADC_SOFTWARE_START;//ADC_EXTERNALTRIGCONV_T1_CC1;
        ADC1_Handler.Init.DataAlign             = ADC_DATAALIGN_RIGHT;  //右对齐       
        ADC1_Handler.Init.NbrOfConversion       = ADC_NUMOFCHANNEL;     //8个转换在规则序列中
        ADC1_Handler.Init.DMAContinuousRequests =        ENABLE;                                             //打开DMA请求
  ADC1_Handler.Init.EOCSelection          = ADC_EOC_SEQ_CONV;     //关闭EOC中断
        if (HAL_ADC_Init(&ADC1_Handler) != HAL_OK){Error_Handler();}
       
  // 配置采样通道 1
  sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_144CYCLES;
  if (HAL_ADC_ConfigChannel(&ADC1_Handler, &sConfig) != HAL_OK){Error_Handler();}

        // 配置采样通道 2
。。。。。。。。[/mw_shl_code]
另外建议放弃标准库吧。很操心。hal库好用到极点。
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-4-17
在线时间
29 小时
 楼主| 发表于 2017-1-6 22:29:26 来自手机 | 显示全部楼层
我是参考了论坛其他人写的  然后自己写的 你这个初始化和我的差别好大啊 你说的hal库是什么 我的问题还没解决  这个项目一直卡这儿 求教啊
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-4-17
在线时间
29 小时
 楼主| 发表于 2017-1-6 22:32:57 来自手机 | 显示全部楼层
bg8wj 发表于 2017-1-6 19:19
看了你的程序,错误来源于ADC 和dma初始化上,adc 句柄设置中中断软件方式没有设置。dma 设置上你好好看看 ...

我是参考了论坛其他人写的  然后自己写的 你这个初始化和我的差别好大啊 你说的hal库是什么 我的问题还没解决  这个项目一直卡这儿 求教啊 我看论坛其他人调试成功的程序和我的一样啊 为啥我测不出来电压 还有adc不需要中断吧
回复

使用道具 举报

18

主题

190

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1068
金钱
1068
注册时间
2012-6-18
在线时间
158 小时
发表于 2017-1-7 18:48:46 | 显示全部楼层
我是参考了论坛其他人写的  然后自己写的 你这个初始化和我的差别好大啊 你说的hal库是什么 我的问题还没解决  这个项目一直卡这儿 求教啊 我看论坛其他人调试成功的程序和我的一样啊 为啥我测不出来电压 还有adc不需要中断吧

总结你的问题是三个:
1.hal库是啥?
2.我的代码的功能
3.解决你的问题。
1.hal 库是 st公司主推的一种库函数的方式,也是未来支持的方式,目前f7的芯片已经没有标准库支持了。其次关于
hal库也就是标准库的一种升级版,比方一个,好方!winxp——》win10 winxp再也不提供升级服务了。
2.你需要的是多通道adc dma传输,我给你的hal代码用于设置adc和dma 我用了8个通道,独立规则输入,初始化设置这样配置可以用。如果你用std标准库也是一样设置,具体为什么你还是好好看一下原子的407标准库教程,搞懂。另外不论标准库
还是hal库c++编程基础要打牢。
3.关于具体的解决你的问题的代码。如果做项目不好意思,伸手党要付费。要学的话,你找原子哥买开发板配套的教程非常好
我从51转stm32一路用原子的战旗板f1,探索者f4,两年就完全转型。从std库到hal库就两个月彻底爱上hal库。配合
stm32cubemx非常顺手。回到第一个问题hal库+cubemx就是st公司未来释放开发者让开发者集中精力写app,而不是
纠结在时钟,硬件寄存器的繁琐中。
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-4-17
在线时间
29 小时
 楼主| 发表于 2017-1-8 12:58:36 来自手机 | 显示全部楼层
bg8wj 发表于 2017-1-7 18:48
总结你的问题是三个:
1.hal库是啥?
2.我的代码的功能

兄弟 那我如何把hal库和原子标准库对应起来 那个hal库在论坛能不能下载 我不是什么伸手党 我改了很多遍还是不对 才到论坛求救的 你改的程序用的是hal库我写的是标准库 这两种架构好像有点差别  
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-4-17
在线时间
29 小时
 楼主| 发表于 2017-1-8 13:01:47 来自手机 | 显示全部楼层
bg8wj 发表于 2017-1-7 18:48
总结你的问题是三个:
1.hal库是啥?
2.我的代码的功能

我也想学hal库  希望引下路
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2016-4-17
在线时间
29 小时
 楼主| 发表于 2017-1-8 13:53:57 | 显示全部楼层
bg8wj 发表于 2017-1-6 19:19
看了你的程序,错误来源于ADC 和dma初始化上,adc 句柄设置中中断软件方式没有设置。dma 设置上你好好看看 ...

我现在用的是F407的开发板 哪儿能下载对应hal库的教程 论坛里有F429的hal库教程 他和407不一样吧
回复

使用道具 举报

18

主题

190

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1068
金钱
1068
注册时间
2012-6-18
在线时间
158 小时
发表于 2017-1-8 15:33:47 | 显示全部楼层
我现在用的是F407的开发板 哪儿能下载对应hal库的教程 论坛里有F429的hal库教程 他和407不一样吧
我也想学hal库  希望引下路

到了hal库的级别其实只要是4xx系列的基本都一样了。区别在在你的IDE编译设置的mcu的型号。
入门了std库转hal 库很简单。
你先到st公司下载一个叫stm32cubemx的图形配置软件,教程自己找了。在升级mdk 至少5.20版本。
对应的mdk包,cubemx软件支持包下载即可。
如果你想简单一点我发过两个hal的例程,风格和429的hal一样。你可以试试。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-12 12:37

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表