stm32 adc中断,采样,然后一直(中断一次,采样一次)循环怎么做,求高手指导,自己小白。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32 adc中断,采样,然后一直(中断一次,采样一次)循环怎么做,求高手指导,自己小白。相关的知识,希望对你有一定的参考价值。
自己设计了打开adc中断,但是进不去,求好用的stm32的实例,或者告诉我设置方法,在此谢过!!!
贴出部分源码:求指点
——————————————————————————————————————
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC1工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在扫描模式(多通道)还是单次(单通道)模式
ADC_InitStructure.ADC_ContinuousConvMode =ENABLE; //连续转换还是单次转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1; //规定了顺序进行规则转换的ADC通道的数目。这个数目的取值范围是1到16
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5); //通道11采样时间 239.5周期
ADC_DMACmd(ADC1, ENABLE); //使能ADC1 DMA
ADC_Cmd(ADC1, ENABLE); //使能ADC1
ADC_ResetCalibration(ADC1); // 初始化ADC1校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //检测ADC1校准寄存器初始化是否完成
ADC_StartCalibration(ADC1); //开始校准ADC1
while(ADC_GetCalibrationStatus(ADC1)); //检测是否完成校准
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ADC1转换启动
ADC_ExternalTrigConvCmd(ADC1, ENABLE); //使能ADC经外部触发启动转换功能
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //ADC1,ADC2全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
---------------------------------------------------------------------------------------------------------
void ADC1_2_IRQHandler(void)
int Status;
Status = ADC_GetITStatus(ADC1, ADC_IT_EOC); //检查指定的ADC中断是否发生
if(Status ==SET)
USART_OUT(USART1,"XXXX = %d \r\n", ADC_ConvertedValue);
ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
---------------------------------------------------------------------------------------------------------
Status 貌似一直是0,跟断点也进不去,求一个好的demo!
ADC_ExternalTrigConvCmd(ADC1, ENABLE); //使能ADC经外部触发启动转换功能
不知道你是想软件触发还是外部事件触发
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
将外部触发使能改成软件触发再测试下。 参考技术A ADC_DMACmd(ADC1, ENABLE);
这个是打开ADC_DMA功能
ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
中断都没打开你怎么进中断函数 参考技术B stm32 ADC的启动方式我没有具体看过,不是特别清楚。
但即使没有这种启动方式。采用外部中断,编程也能实现外部下降沿触发ADC中断。
stm32_ADC定时器采样(DMA均值处理数据)
在有些要求高的场合,需要用到定时器采样。本人在网上没找到合适的源码,于是将自己的思路分享出来,欢迎大家提出意见。
- 确定ADC采用的通道对应的通道
- 确定采样对应的引脚(这个在规格书的引脚定义部分可以找到)
- ADC开启DMA传输
- 确定ADC采样通道对应的DMA的stream和channel,(这个在英文Reference manual中可以找到)
- 设定DMA的传输方向,还有DMA缓冲区的大小,
- 配置DMA中断
- 在ADC的触发源,选择定时器触发,并配置定时器的频率等参数。
---------------------------------------------------------------------------------------------------------------------------------
论坛上很多人的帖子在问,为什么选用了定时器触发,采样还是不成功,理由很简单。没有配置并使能定时器。
以上是关于stm32 adc中断,采样,然后一直(中断一次,采样一次)循环怎么做,求高手指导,自己小白。的主要内容,如果未能解决你的问题,请参考以下文章