OpenEdv-开源电子网

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

ADC+DMA下载程序死机了,帮看看配置出什么问题了

[复制链接]

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-3-20
在线时间
16 小时
发表于 2017-5-3 13:23:20 | 显示全部楼层 |阅读模式
1金钱
最近用hal库写了ADC和DMA使用的程序,但是调用  HAL_DMA_Init(&ADC1TxDMA_Handler);这个函数就出现问题了,死机,芯片是STM32F4xx的,原子哥能帮看看配置出什么问题了吗?



#include "adc.h"
#include "main.h"

ADC_HandleTypeDef  ADC1_Handler;       //ADC¾ä±ú
DMA_HandleTypeDef  ADC1TxDMA_Handler; //DMA¾ä±ú
//ch: ADC_channels
//ͨµÀÖµ 0~16ȡֵ·¶Î§Îª£ºADC_CHANNEL_0~ADC_CHANNEL_16
void MY_ADC_Init(void)
{
    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler          = ADC_CLOCK_SYNC_PCLK_DIV4;   //4·ÖƵ   ADCʱÖÓΪ25M
    ADC1_Handler.Init.Resolution              = ADC_RESOLUTION_12B;             //12λģʽ
    ADC1_Handler.Init.DataAlign               = ADC_DATAALIGN_RIGHT;             //ÓÒ¶ÔÆë
    ADC1_Handler.Init.ScanConvMode            = DISABLE;                      //·ÇɨÃèģʽ
    ADC1_Handler.Init.EOCSelection            = DISABLE;                      //¹Ø±ÕEOCÖжÏ
    ADC1_Handler.Init.ContinuousConvMode      = ENABLE;                //¹Ø±ÕÁ¬Ðø×ª»»
    ADC1_Handler.Init.NbrOfConversion         = 1;                         //1¸öת»»ÔÚ¹æÔòÐòÁÐÖÐ Ò²¾ÍÊÇֻת»»¹æÔòÐòÁÐ1
    ADC1_Handler.Init.DiscontinuousConvMode   = DISABLE;             //½ûÖ¹²»Á¬Ðø²ÉÑùģʽ
    ADC1_Handler.Init.NbrOfDiscConversion     = 0;                     //²»Á¬Ðø²ÉÑùͨµÀÊýΪ0
    ADC1_Handler.Init.ExternalTrigConv        = ADC_SOFTWARE_START;       //Èí¼þ´¥·¢
    ADC1_Handler.Init.ExternalTrigConvEdge    = ADC_EXTERNALTRIGCONVEDGE_NONE;//ÎÞÍⲿ´¥·¢×ª»»
    ADC1_Handler.Init.DMAContinuousRequests   = ENABLE;             //¹Ø±ÕDMAÇëÇó
   ADC1_Handler.Init.EOCSelection            = DISABLE;
    HAL_ADC_Init(&ADC1_Handler);                                 //³õʼ»¯
}
//ADCµ×²ãÇý¶¯£¬Òý½ÅÅäÖã¬Ê±ÖÓʹÄÜ
//´Ëº¯Êý»á±»HAL_ADC_Init()µ÷ÓÃ
//hadc:ADC¾ä±ú
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{
    GPIO_InitTypeDef GPIO_Initure;

    __HAL_RCC_ADC1_CLK_ENABLE();            //ʹÄÜADC1ʱÖÓ
    __HAL_RCC_GPIOC_CLK_ENABLE();         //¿ªÆôGPIOCʱÖÓ

    GPIO_Initure.Pin    = GPIO_PIN_0;            //PC0
    GPIO_Initure.Mode   = GPIO_MODE_ANALOG;     //Ä£Äâ
    GPIO_Initure.Pull   = GPIO_NOPULL;          //²»´øÉÏÏÂÀ­
    HAL_GPIO_Init(GPIOC,&GPIO_Initure);
  
}
void MY_DMA_Config(void)
{

  __HAL_RCC_DMA2_CLK_ENABLE();                                  //DMA2ʱÖÓʹÄÜ
  __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1TxDMA_Handler);    //½«DMAÓëADC1ÁªÏµÆðÀ´(·¢ËÍDMA)

    ADC1TxDMA_Handler.Instance                 = DMA2_Stream0;                 //Êý¾ÝÁ÷Ñ¡Ôñ
    ADC1TxDMA_Handler.Init.Channel             = DMA_CHANNEL_0;                //ͨµÀÑ¡Ôñ
    ADC1TxDMA_Handler.Init.Direction           = DMA_PERIPH_TO_MEMORY;         //ÍâÉèµ½´¢´æÆ÷
    ADC1TxDMA_Handler.Init.PeriphInc           = DMA_PINC_DISABLE;             //ÍâÉè·ÇÔöÁ¿Ä£Ê½
    ADC1TxDMA_Handler.Init.MemInc              = DMA_MINC_DISABLE;             //´æ´¢Æ÷ÔöÁ¿Ä£Ê½
    ADC1TxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;      //ÍâÉèÊý¾Ý³¤¶È:16λ
    ADC1TxDMA_Handler.Init.MemDataAlignment    = DMA_PDATAALIGN_HALFWORD;      //´æ´¢Æ÷Êý¾Ý³¤¶È:16λ
    ADC1TxDMA_Handler.Init.Mode                = DMA_CIRCULAR;                 //Ñ­»·Ä£Ê½
    ADC1TxDMA_Handler.Init.Priority            = DMA_PRIORITY_MEDIUM;          //¸ßÓÅÏȼ¶
    ADC1TxDMA_Handler.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;              
    ADC1TxDMA_Handler.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_HALFFULL;      
    ADC1TxDMA_Handler.Init.MemBurst            = DMA_MBURST_SINGLE;              //´æ´¢Æ÷Í»·¢µ¥´Î´«Êä
    ADC1TxDMA_Handler.Init.PeriphBurst         = DMA_PBURST_SINGLE;              //ÍâÉèÍ»·¢µ¥´Î´«
  
//  HAL_DMA_DeInit(&ADC1TxDMA_Handler);
    HAL_DMA_Init(&ADC1TxDMA_Handler);
}

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

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2017-5-3 15:46:13 | 显示全部楼层
HAL库我没用过

不过 你DMA数据长度是不是超过了数组长度,这里可能造成溢出。

还有你ADC里面有一个溢出的寄存器,是不是溢出了
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-3-20
在线时间
16 小时
 楼主| 发表于 2017-5-3 21:50:09 | 显示全部楼层
止天 发表于 2017-5-3 15:46
HAL库我没用过

不过 你DMA数据长度是不是超过了数组长度,这里可能造成溢出。

长度都是半字啊,16位
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2017-5-4 08:11:12 | 显示全部楼层
liangliang123 发表于 2017-5-3 21:50
长度都是半字啊,16位

我说的是传输个数
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165464
金钱
165464
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-5-4 22:33:29 | 显示全部楼层
这种,仿真找问题了
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-3-20
在线时间
16 小时
 楼主| 发表于 2017-5-6 00:17:57 | 显示全部楼层
正点原子 发表于 2017-5-4 22:33
这种,仿真找问题了

谢谢原子哥回复了,仿真的时候是怎么找问题呢?看寄存器的值吗????
回复

使用道具 举报

18

主题

190

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1068
金钱
1068
注册时间
2012-6-18
在线时间
158 小时
发表于 2017-5-11 00:02:04 | 显示全部楼层
[mw_shl_code=c,true] sConfig.Channel = ADC_CHANNEL_1;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_144CYCLES;
  if (HAL_ADC_ConfigChannel(&ADC1_Handler, &sConfig) != HAL_OK){Error_Handler();}[/mw_shl_code]
感觉你少了这个配置,其次__HAL_LINKDMA调用应该再DMA配置完成后,程序初始DMA不对。另外没有看到你的HAL_ADC_Start_DMA()不知道你是数组是否溢出了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165464
金钱
165464
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-5-11 19:10:07 | 显示全部楼层
liangliang123 发表于 2017-5-6 00:17
谢谢原子哥回复了,仿真的时候是怎么找问题呢?看寄存器的值吗????

看寄存器配置,对比例程
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

25

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-6
在线时间
43 小时
发表于 2018-1-24 11:02:30 | 显示全部楼层
本帖最后由 sweetstandard 于 2018-1-24 11:04 编辑


我也是这个问题,没解决。
但你这个好象缺少对DMA的中断设置:

void MX_DMA_Init(void)
{

  DMAx_RCC_CLK_ENABLE();

  /* 外设中断优先级配置和使能中断 */
  HAL_NVIC_SetPriority(ADCx_DMA_IRQx, 0, 0);
  HAL_NVIC_EnableIRQ(ADCx_DMA_IRQx);
}


事在人为,顺势而为。
回复

使用道具 举报

0

主题

25

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2016-3-6
在线时间
43 小时
发表于 2018-1-24 11:04:43 | 显示全部楼层
拜请各位大侠帮忙
事在人为,顺势而为。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-26 09:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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