OpenEdv-开源电子网

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

F767通过CubeMx配置ADC参数,初始化函数失败

[复制链接]

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-4-15
在线时间
10 小时
发表于 2019-7-22 18:15:04 | 显示全部楼层 |阅读模式
11金钱
通过Cube配置adc参数,在执行完MX_ADC1_Init语句后ADC没有被配置。
具体情况如图(ADC初始化无效):。
可以看到,在执行完MX_ADC1_Init语句后,右侧的ADC寄存器全都是0。
作为对比,这是一张正确执行该语句后的效果图(ADC初始化成功):。
在正确执行后,右侧的几个控制寄存器应该会被配置为相应值。
我再次尝试进入该函数内部单步执行,ADC参数初始化和通道初始化两个子函数返回状态都是HAL_OK。但是寄存器依然没有被配置。
最后附上我的ADC初始化参数设置代码:

void MX_ADC1_Init(void)
{
  ADC_ChannelConfTypeDef sConfig = {0};
  /**Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)   */
  hadc1.Instance = ADC1;
  hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
  hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc1.Init.ContinuousConvMode = DISABLE;
  hadc1.Init.DiscontinuousConvMode = DISABLE;
  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  hadc1.Init.NbrOfConversion = 1;
  hadc1.Init.DMAContinuousRequests = DISABLE;
  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  if (HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }
  /**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time. */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = ADC_REGULAR_RANK_1;
  sConfig.SamplingTime = ADC_SAMPLETIME_112CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

}



ADC初始化无效

ADC初始化无效

ADC初始化成功

ADC初始化成功

参数初始化

参数初始化

通道初始化

通道初始化
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-4-15
在线时间
10 小时
 楼主| 发表于 2019-7-22 18:26:57 | 显示全部楼层
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2018-4-15
在线时间
10 小时
 楼主| 发表于 2019-7-23 16:47:56 | 显示全部楼层
####问题解决了,但是不知道原理。####

今天上午我重新建了一个工程,一路运行下来发现ADC能够正常初始化了,但是定时器又不行了。
单步执行,修改编译优化等级都没用。
后面我把while循环里的全部代码注释掉,两个外设都能正常初始化。
然后我一部分一部分地取消注释,最终发现有一段跟ADC和定时器有关的操作代码注释掉之后就能正常初始化。
我与之前能够正常运行的程序对比,发现在正常的程序中我把这段操作代码封装成了函数,在while循环中调用。
我尝试在不能正常运行的程序中也这样做,结果两个外设都正常初始化了。
原因我还不知道,希望大神可以解答。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 10:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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