新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2016-1-7
- 在线时间
- 3 小时
|
1金钱
STM32F103 开启了串口中断,且字符串收发正常。现在使用DMA将ADC双通道采样的数据传到内存空间,供主函数调用。现在的现象是能进入串口中断,但是只能接收到第一个字符,采用查询方式从串口接受单个字符时可以成功进行ADC双通道采样,改用串口中断后出现了以上现象。求大神指点啊,在线等!谢谢PS:注释掉DMA配置中带红色背景的命令时串口中断收发正常,去掉注释后只能接收到第一个字符串口中断函数为:(字符串以$开头*结尾)
[mw_shl_code=c,true]void USART1_IRQHandler(void)
{
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
{
if(startf==1)
{
if(USART_ReceiveData(USART1)=='$')
{
Recevedflag=0;
RxCounter=0;
flag=1;
}
}
if(flag)
{
UARTBuffer[RxCounter]=USART_ReceiveData(USART1);
RxCounter++;
startf=0;
if((USART_ReceiveData(USART1))=='*')
{
flag=0;
UARTBuffer[RxCounter]='\r';
RxCounter-=1;
Recevedflag=1;
startf=1;
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
}
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}[/mw_shl_code]
主函数中的while循环:
[mw_shl_code=c,true] while(1 )
{
printf("\r\n 接收到的字符串为%s \r\n",UARTBuffer);
SensorData ();//传感器数据
}
}[/mw_shl_code]
DMA配置:
[mw_shl_code=c,true]void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value;//内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//DMA 单向传输方式
//BufferSize=2,因为 ADC 转换序列有 2 个通道
DMA_InitStructure.DMA_BufferSize = 2;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设置DMA 外设递增模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //设置DMA 内存递增模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设字长
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//内存地址
//循环模式开启,Buffer 写满后,自动回到初始地址开始传输
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 设置传输模式连续不断的循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置 DMA 优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;// 设置 DMA 的 2 个memory 中的变量互相访问
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
//配置完成后,启动 DMA 通道
DMA_Cmd(DMA1_Channel1, ENABLE);
} [/mw_shl_code]
ADC配置:
[mw_shl_code=c,true]void ADC_Configuration(void)
{
/* 定义 ADC 初始化结构体 ADC_InitStructure */
ADC_InitTypeDef ADC_InitStructure;
/* 配置ADC时钟分频 */
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
/*
* 独立工作模式;
* 多通道扫描模式;
* 连续模数转换模式;
* 转换触发方式:转换由软件触发启动;
* ADC 数据右对齐 ;
* 进行规则转换的 ADC 通道的数目为2;
*/
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 2;
ADC_Init(ADC1, &ADC_InitStructure);
/* 设置 ADC1 使用8转换通道,转换顺序1,采样时间为 55.5 周期 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_55Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_55Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* 使能 ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* 复位 ADC1 的校准寄存器 */
ADC_ResetCalibration(ADC1);
/* 等待 ADC1 校准寄存器复位完成 */
while(ADC_GetResetCalibrationStatus(ADC1));
/* 开始 ADC1 校准 */
ADC_StartCalibration(ADC1);
/* 等待 ADC1 校准完成 */
while(ADC_GetCalibrationStatus(ADC1));
/* 启动 ADC1 转换 */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}[/mw_shl_code]
|
|