初级会员

- 积分
- 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;
}
} |
|