 
					
				 
					
				接着188楼。换个思路,用BHS的办法,ADC 使用了 DMA方式,结果通过串口送出。
结果是相近的,另在输入端接地、接3.3V时,结果是正确的(000和FFF)。

要点(大多数注解byBHS):
void adc_Init (void) {
  RCC->APB2ENR|=1<<4;    //使能PORTC口时钟    
 GPIOC->CRL&=0XFFFF0000;//PC0 1 2 3 anolog输入 
  
  // enable periperal clock for DMA
  //使能DMA时钟
  RCC->AHBENR |= (1<<0);
  // set channel1 memory address   
  //设置DMA内存地址,ADC转换结果直接放入该地址
  DMA1_Channel1->CMAR  = (u32)&ADC_ConvertedValue;
  // set channel0 peripheral address
  //设置通道1外设地址
  DMA1_Channel1->CPAR  = (u32)&(ADC1->DR);
  // transmit 1 word
  //DMA传送1个字
  DMA1_Channel1->CNDTR = 1;
  // configure DMA channel
  DMA1_Channel1->CCR   = 0x00002520;
  // DMA Channel 1 enable    //使能DMA通道
  DMA1_Channel1->CCR  |= (1 << 0);               
  // enable periperal clock for ADC1  
  //使能ADC时钟
  RCC->APB2ENR |= (1<<9);
  // only one conversion   // 只有1个转换通道
  ADC1->SQR1  = 0x00000000;
  // set sample time channel0 (55,5 cycles)// (3bit)
  //通道1采样周期55.5个时钟周期
  ADC1->SMPR2 = 0x00000028;
  // set channel1 as 1st conversion // (5bit)
  //第1个转换通道是1通道
//  ADC1->SQR3  = 0x00000000;  //这适合CH0 
  ADC1->SQR3  = 0x0000000B;   // CH11
  // use independant mode, SCAN mode
  //使用独立模式,扫描模式
  ADC1->CR1   = 0x00000100;
  // use data align right,continuous conversion
  //使用数据右对齐,连续转换
  ADC1->CR2   = 0x000E0103;
  // EXTSEL = SWSTART 
  // enable ADC, DMA mode, no external Trigger
  // start SW conversion
  //允许ADC,DMA模式,无需外接触发器
  //开始转换
  ADC1->CR2  |=  0x00500000;       
}
 
					
				回复
| 有奖活动 | |
|---|---|
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
| 送您一块开发板,2025年“我要开发板活动”又开始了! | |

 
					
				 
			
			
			
						
			
 
					
				 我要赚赏金
 我要赚赏金 STM32
STM32 MCU
MCU 通讯及无线技术
通讯及无线技术 物联网技术
物联网技术 电子DIY
电子DIY 板卡试用
板卡试用 基础知识
基础知识 软件与操作系统
软件与操作系统 我爱生活
我爱生活 小e食堂
小e食堂

