OpenEdv-开源电子网

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

STM32 f103rct6 奇怪的ADC问题

[复制链接]

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-10-24
在线时间
26 小时
发表于 2020-12-7 19:43:15 | 显示全部楼层 |阅读模式
1金钱
  1. #include "adc.h"

  2. /* USER CODE BEGIN 0 */
  3. volatile uint32_t ADC_ConvertedValue[2]={0,0};
  4. #define ADC1_DR_Address ((u32)0x40012400+0x4c)
  5. /* USER CODE END 0 */

  6. /* ADC1 init function */
  7. void MX_ADC1_Init(void)
  8. {
  9.   LL_ADC_InitTypeDef ADC_InitStruct = {0};
  10.   LL_ADC_CommonInitTypeDef ADC_CommonInitStruct = {0};
  11.   LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0};

  12.   LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  13.   /* Peripheral clock enable */
  14.   LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC1);

  15.   LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_GPIOA);
  16.   /**ADC1 GPIO Configuration
  17.   PA0-WKUP   ------> ADC1_IN0
  18.   PA1   ------> ADC1_IN1
  19.   */
  20.   GPIO_InitStruct.Pin = LL_GPIO_PIN_0|LL_GPIO_PIN_1;
  21.   GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
  22.   LL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  23.   /* ADC1 DMA Init */

  24.   /* ADC1 Init */
  25.   LL_DMA_SetDataTransferDirection(DMA1, LL_DMA_CHANNEL_1, LL_DMA_DIRECTION_PERIPH_TO_MEMORY);

  26.   LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_HIGH);

  27.   LL_DMA_SetMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MODE_CIRCULAR);

  28.   LL_DMA_SetPeriphIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PERIPH_NOINCREMENT);

  29.   LL_DMA_SetMemoryIncMode(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MEMORY_INCREMENT);

  30.   LL_DMA_SetPeriphSize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PDATAALIGN_HALFWORD);

  31.   LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_1, LL_DMA_MDATAALIGN_HALFWORD);


  32.   /* ADC1 interrupt Init */
  33.   NVIC_SetPriority(ADC1_2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),2, 0));
  34.   NVIC_EnableIRQ(ADC1_2_IRQn);

  35.   /** Common config
  36.   */
  37.   ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT;
  38.   ADC_InitStruct.SequencersScanMode = LL_ADC_SEQ_SCAN_ENABLE;
  39.   LL_ADC_Init(ADC1, &ADC_InitStruct);
  40.   ADC_CommonInitStruct.Multimode = LL_ADC_MULTI_INDEPENDENT;
  41.   LL_ADC_CommonInit(__LL_ADC_COMMON_INSTANCE(ADC1), &ADC_CommonInitStruct);
  42.   ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
  43.   ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_ENABLE_2RANKS;
  44.   ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
  45.   ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_CONTINUOUS;
  46.   ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;
  47.   LL_ADC_REG_Init(ADC1, &ADC_REG_InitStruct);
  48.   /** Configure Regular Channel
  49.   */
  50.   LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_0);
  51.   LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_0, LL_ADC_SAMPLINGTIME_55CYCLES_5);
  52.   /** Configure Regular Channel
  53.   */
  54.   LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_2, LL_ADC_CHANNEL_1);
  55.   LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_1, LL_ADC_SAMPLINGTIME_55CYCLES_5);



  56. }

  57. /* USER CODE BEGIN 1 */
  58. void ADC_DMA_Config_Start(void)
  59. {
  60.         LL_DMA_SetChannelPriorityLevel(DMA1, LL_DMA_CHANNEL_1, LL_DMA_PRIORITY_LOW);
  61.         LL_DMA_SetMemoryAddress(DMA1,LL_DMA_CHANNEL_1,(uint32_t)ADC_ConvertedValue);
  62.         LL_DMA_SetPeriphAddress(DMA1,LL_DMA_CHANNEL_1,LL_ADC_DMA_GetRegAddr(ADC1,LL_ADC_DMA_REG_REGULAR_DATA));
  63.         LL_DMA_SetDataLength(DMA1,LL_DMA_CHANNEL_1, sizeof(ADC_ConvertedValue));
  64.         LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_1);

  65.         LL_ADC_Enable(ADC1);
  66.         LL_ADC_StartCalibration(ADC1);
  67.         while(LL_ADC_IsCalibrationOnGoing(ADC1));

  68.         LL_ADC_REG_StartConversionSWStart(ADC1);
  69. }
复制代码

程序就是添加了这个adc单元,现在main里面已添加void ADC_DMA_Config_Start(),LCD就没显示,注释掉后LCD就显示正常,检查了几次里面没设计LCD SPI(硬件) 的内容啊?
请大家帮忙看看呢?

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-12-8 02:09:28 | 显示全部楼层
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2020-12-8 08:47:46 | 显示全部楼层
是不是开了ADC的中断但是没写中断服务函数
回复

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-10-24
在线时间
26 小时
 楼主| 发表于 2020-12-8 17:17:47 | 显示全部楼层
Da Wen 发表于 2020-12-8 08:47
是不是开了ADC的中断但是没写中断服务函数

确实没写中断服务函数,回去试一试
回复

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-10-24
在线时间
26 小时
 楼主| 发表于 2020-12-8 19:42:32 | 显示全部楼层
@正点原子 Da Wen 发表于 2020-12-8 08:47
是不是开了ADC的中断但是没写中断服务函数

亲,取消了中断服务还没没有反应啊?在网上有查了很多代码示例,感觉有些不一样的,本人小白。麻烦指点一下。呼叫原子哥啊。
回复

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-10-24
在线时间
26 小时
 楼主| 发表于 2020-12-8 19:43:52 | 显示全部楼层
感觉设置还没配置完,当但是参考网上的例子,感觉方法又不一样。没头绪了
回复

使用道具 举报

11

主题

2154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4951
金钱
4951
注册时间
2015-1-10
在线时间
620 小时
发表于 2020-12-9 08:21:33 | 显示全部楼层
zqdl8 发表于 2020-12-8 19:43
感觉设置还没配置完,当但是参考网上的例子,感觉方法又不一样。没头绪了

网上标准库的例子有很多啊,你用LL库的话大家都靠猜的,没人真去看你的代码
回复

使用道具 举报

5

主题

54

帖子

0

精华

高级会员

Rank: 4

积分
693
金钱
693
注册时间
2020-5-25
在线时间
85 小时
发表于 2020-12-9 16:12:06 | 显示全部楼层
ADC_DMA_Config_Start();

你这个初始化的东西放main循环里面肯定不行的啊  
回复

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-10-24
在线时间
26 小时
 楼主| 发表于 2020-12-9 16:35:21 | 显示全部楼层
陆行 发表于 2020-12-9 16:12
ADC_DMA_Config_Start();

你这个初始化的东西放main循环里面肯定不行的啊

这个没有放main里面的,放adc的初始化的
回复

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-10-24
在线时间
26 小时
 楼主| 发表于 2020-12-9 16:36:28 | 显示全部楼层
zqdl8 发表于 2020-12-9 16:35
这个没有放main里面的,放adc的初始化的

调用的时候是在main之前,adc初始化之后
回复

使用道具 举报

7

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2015-10-24
在线时间
26 小时
 楼主| 发表于 2020-12-9 16:40:50 | 显示全部楼层
神奇的存在,只要注释掉这句,LCD就显示正常
回复

使用道具 举报

3

主题

261

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2075
金钱
2075
注册时间
2014-2-20
在线时间
284 小时
发表于 2020-12-10 14:02:34 | 显示全部楼层
zqdl8 发表于 2020-12-8 19:42
亲,取消了中断服务还没没有反应啊?在网上有查了很多代码示例,感觉有些不一样的,本人小白。麻烦指点一 ...

进调试,看看是不是程序卡在某一个地方了
目测是没配置好,卡在这里了while(LL_ADC_IsCalibrationOnGoing(ADC1));
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 20:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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