OpenEdv-开源电子网

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

STM32H7的ADC中断怎么进去啊???哪里错了呢???

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2019-7-19
在线时间
10 小时
发表于 2019-11-10 19:31:05 | 显示全部楼层 |阅读模式
1金钱

  1. #include "adc.h"
  2. #include "delay.h"
  3. #include "led.h"
  4. /*200Khz正弦波是0.005ms*/

  5. ADC_HandleTypeDef ADC1_Handler;

  6. void My_Adc_Init()
  7. {

  8.         ADC1_Handler.Instance=ADC1;
  9.     ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV2;         //2分频,ADCCLK=PER_CK/4=64/2=32MHZ
  10.     ADC1_Handler.Init.Resolution=ADC_RESOLUTION_16B;                   //16位模式
  11.     ADC1_Handler.Init.ScanConvMode=DISABLE;                            //非扫描模式
  12.     ADC1_Handler.Init.EOCSelection=ADC_EOC_SINGLE_CONV;               //关闭EOC中断
  13.         ADC1_Handler.Init.LowPowerAutoWait=DISABLE;                                        //自动低功耗关闭                               
  14.     ADC1_Handler.Init.ContinuousConvMode=DISABLE;               //关闭连续转换
  15.     ADC1_Handler.Init.NbrOfConversion=1;                        //1个转换在规则序列中 也就是只转换规则序列1
  16.     ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;            //禁止不连续采样模式
  17.     ADC1_Handler.Init.NbrOfDiscConversion=0;                    //不连续采样通道数为0
  18.     ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;      //软件触发
  19.     ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发
  20.         ADC1_Handler.Init.BoostMode=ENABLE;                                                        //BOOT模式关闭
  21.         ADC1_Handler.Init.Overrun=ADC_OVR_DATA_OVERWRITTEN;                        //有新的数据的死后直接覆盖掉旧数据
  22.         ADC1_Handler.Init.OversamplingMode=DISABLE;                                        //过采样关闭
  23.         ADC1_Handler.Init.ConversionDataManagement=ADC_CONVERSIONDATA_DR;  //规则通道的数据仅仅保存在DR寄存器里面
  24.     HAL_ADC_Init(&ADC1_Handler);                                //初始化
  25.        
  26.         HAL_ADCEx_Calibration_Start(&ADC1_Handler,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC校准
  27.         HAL_ADC_Start_IT(&ADC1_Handler);
  28. }

  29. void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
  30. {
  31.     GPIO_InitTypeDef GPIO_Initure;
  32.     if(hadc->Instance==ADC1)
  33.         {
  34.                 __HAL_RCC_ADC12_CLK_ENABLE();           //使能ADC1/2时钟
  35.                 __HAL_RCC_GPIOA_CLK_ENABLE();                        //开启GPIOA时钟
  36.                 __HAL_RCC_ADC_CONFIG(RCC_ADCCLKSOURCE_CLKP); //ADC外设时钟选择
  37.                   
  38.                 HAL_NVIC_SetPriority(ADC_IRQn, 0, 0);
  39.                 HAL_NVIC_EnableIRQ(ADC_IRQn);
  40.                
  41.                 GPIO_Initure.Pin=GPIO_PIN_5;            //PA5
  42.                 GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
  43.                 GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
  44.                 HAL_GPIO_Init(GPIOA,&GPIO_Initure);
  45.         }
  46. }

  47. u16 Get_Adc(u32 ch)   
  48. {
  49.     ADC_ChannelConfTypeDef ADC1_ChanConf;
  50.    
  51.     ADC1_ChanConf.Channel=ch;                                   //通道
  52.     ADC1_ChanConf.Rank=ADC_REGULAR_RANK_1;                          //1个序列
  53.     ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_2CYCLES_5;              //采样时间,2.5周期采一次,时间是0.3us     
  54.         ADC1_ChanConf.SingleDiff=ADC_SINGLE_ENDED;                                  //单边采集                         
  55.         ADC1_ChanConf.OffsetNumber=ADC_OFFSET_NONE;                    
  56.         ADC1_ChanConf.Offset=0;   
  57.     HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置

  58.     HAL_ADC_Start_IT(&ADC1_Handler);                               //开启ADC
  59.        
  60.     HAL_ADC_PollForConversion(&ADC1_Handler,10);                //轮询转换
  61.         return (u16)HAL_ADC_GetValue(&ADC1_Handler);                    //返回最近一次ADC1规则组的转换结果
  62. }

  63. u16 Get_Adc_Average(u32 ch,u8 times)
  64. {
  65.         u32 temp_val=0;
  66.         u8 t;
  67.         for(t=0;t<times;t++)
  68.         {
  69.                 temp_val+=Get_Adc(ch);
  70.                 delay_ms(5);
  71.         }
  72.         return temp_val/times;
  73. }

  74. void ADC1_IRQHandler()
  75. {
  76.         HAL_ADC_IRQHandler(&ADC1_Handler);
  77. }

  78. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* AdcHandle)
  79. {
  80.        if(AdcHandle->Instance == ADC1)        
  81.                 {
  82.               LED0(0);
  83.         }
  84. }


复制代码


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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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