OpenEdv-开源电子网

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

大家好,请教一个有关AD中断的问题

[复制链接]

13

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-5-8
在线时间
0 小时
发表于 2014-5-21 10:53:40 | 显示全部楼层 |阅读模式
5金钱
编译出现的问题如图一所示:




具体的配置如下:






主函数如下:


请问大神问题出在哪?感激涕零!

最佳答案

查看完整内容[请看2#楼]

1、请楼猪给出具体的芯片型号,不同的芯片的ADC的中断处理函数长得不一样。 2、楼猪提示错误的问题在于楼猪定义的ADC的中断向量为ADC1_IRQn,有可能你的stm32f103.h中根本就没有这个向量的定义,比如有的是ADC1_2_IRQn,有的是ADC1_IRQn,不同的芯片不一样。并且没有看到楼猪定义中断处理函数,而且看楼猪主程序是采用查询的方式启动每次转换。 3、建议楼猪在本坛搜一下如何定义中断处理函数,其实很简单,在stm32f103_it.h中声 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2014-5-4
在线时间
0 小时
发表于 2014-5-21 10:53:41 | 显示全部楼层
1、请楼猪给出具体的芯片型号,不同的芯片的ADC的中断处理函数长得不一样。
2、楼猪提示错误的问题在于楼猪定义的ADC的中断向量为ADC1_IRQn,有可能你的stm32f103.h中根本就没有这个向量的定义,比如有的是ADC1_2_IRQn,有的是ADC1_IRQn,不同的芯片不一样。并且没有看到楼猪定义中断处理函数,而且看楼猪主程序是采用查询的方式启动每次转换。
3、建议楼猪在本坛搜一下如何定义中断处理函数,其实很简单,在stm32f103_it.h中声明一下,然后在stm32f103_it.c中添加处理代码。
4、多说一句,楼猪如果对库函数结构了解地深入一点的话就会发现,其实中断处理函数不一定非得定义在stm32f103_it.c中,定义在其他的源文件中,系统也可以找到。

给你一个参考:在stm32f103_it.c中加入如下代码,然后在stm32f103_it.h中声明一下:void ADC1_IRQHandler(void);(你需要确认一下是不是ADC1_IRQHandler)
void ADC1_IRQHandler(void)
{
 if(ADC_GetITStatus(ADC1,ADC_IT_EOC) == RESET)
 {
/*此处添加你的ADC采集处理程序*/
  ADC_SoftwareStartConvCmd(ADC1,ENABLE);
  ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
 }
}
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3348
金钱
3348
注册时间
2013-5-28
在线时间
468 小时
发表于 2014-5-21 11:04:56 | 显示全部楼层
一般么不是写错就是头文件没加
回复

使用道具 举报

13

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2014-5-8
在线时间
0 小时
 楼主| 发表于 2014-5-24 09:53:48 | 显示全部楼层
回复【3楼】cdshkf:
---------------------------------
真是活雷锋,谢谢你的详细解答。

我的芯片是STM32F103ZET6这块板子,stm32f10x.h是包含“ ADC1_IRQn                   = 18,     /*!< ADC1 global Interrupt ”的。

我的AD中断处理函数在这里:
void ADC1_IRQHandler(void)
{
u16 DATA_LEN;
u16 i;
  if(ADC_GetITStatus(ADC1, ADC_IT_EOC ) != RESET)//检查空闲总线中断是否发生,若发生,则数据接收完毕             ADC_ITConfig(ADC2, ADC_IT_EOC | ADC_IT_AWD, ENABLE); 
    {
DMA_Cmd(DMA1_Channel1, DISABLE);//关闭DMA,防止处理其间有数据
//USART_RX_STA = USART1->SR;//先读SR,然后读DR才能清除
        //USART_RX_STA = USART1->DR;
   DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel1);// DMA_GetCurrDataCounter返回//当前 DMA通道 x剩余的待传输数据数目, DATA_LEN为接收到的数据
if(DATA_LEN > 0)
        {
while(USART1_TX_Finish==0)//等待数据传输完成才下一次
            {
                ;
            }
//将数据送DMA存储地址
            for(i=0;i<DATA_LEN;i++)
            {
                USART1_SEND_DATA=USART1_RECEIVE_DATA;//由外设发数据给内存,再由内////存发给外设
            }
            //USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。
            DMA_Cmd(DMA1_Channel4, DISABLE); //改变datasize前先要禁止通道工作,对!
            DMA1_Channel4->CNDTR=DATA_LEN; //DMA1,传输数据量
            USART1_TX_Finish=0;//DMA传输开始标志量
            DMA_Cmd(DMA1_Channel4, ENABLE);
}
//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据
DMA_ClearFlag(DMA1_FLAG_GL1 | DMA1_FLAG_TC1 | DMA1_FLAG_TE1 | DMA1_FLAG_HT1);//清标志
DMA1_Channel1->CNDTR = 512;//重装填
DMA_Cmd(DMA1_Channel1, ENABLE);//处理完,重开DMA
//读SR后读DR清除Idle
i = USART1->SR;
i = USART1->DR;
}
if(USART_GetITStatus(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错
{
USART_ClearITPendingBit(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE);
}
   USART_ClearITPendingBit(USART1, USART_IT_TC);
   USART_ClearITPendingBit(USART1, USART_IT_IDLE);
}

我的启动AD转换是通过定时器中断实现的:
 void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
{

FLAG=1;
TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志
}
}
int main(void)
{
   GPIO_Configuration();
   DMA_Configuration();
Timer3_Configuration();
   NVIC_Configuration1();
   USART_Configuration();
Adc_Init();    //ADC初始化
Timer3_Configuration();
   while (1)
   {
  if(FLAG==1)
{
 ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
      FLAG=0;
   }
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-8 02:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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