yc_xpg 发表于 2014-11-27 15:51 
发个实验代码来给分析哈....
void TIM3_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 576;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void Exti2_init(void) //这个中断有稳定的18K/秒中断源
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_3_IRQn ;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1 ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
TIM_Cmd(TIM3, DISABLE);
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
DMA_Cmd(DMA1_Channel3, ENABLE); //使能SPI_DMA发送
}
}
void EXTI2_3_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line2);
TIM_Cmd(TIM3, ENABLE); //开启TIM3,TIM3优级抢占优先级较高,计算任何还没有完成时就会进入TIM3中断,
DMA_Cmd(DMA1_Channel3, DISABLE);
SPI_DMA_InitStructure.DMA_BufferSize = 18;
SPI_DMA_InitStructure.DMA_MemoryBaseAddr = data[0];
DMA_Init(DMA1_Channel3, &SPI_DMA_InitStructure);
{
//计算任务
//每次的计算任务都会顺利完成
}
}
流程
1. TIM3_init();
2. Exti2_init();
3. EXTI2中断发生,在EXTI2中断内启动TIM3定时器,定时器马上中断,然后抢占执行,在TIM3中断内使能SPI_DMA,接收设备接收到发送的数据。
问题:接收设备收到的第一个字节的时间上有时会早一点,有时会晚一点(小于1US),时间总是不相等,(描述为接收到第1个字节的时间不对齐),这样的执行方式在STM32F0/F1上时间对齐性都很好。
多谢各位朋友的关注!
|