Помогите разобраться с приоритетами прерываний. У меня реализован модбас чере зперрывания от юсарт и считывание внешнего ацп через exti(сигнал готовности данных). Но когда на входе ацп 0, то модбас работает прекрасно. а когда напряжение на вхоже повышается то модбас отвечает через раз.
CODE
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART,USART_IT_ERR,ENABLE);
}
NVIC_SetPriority(USART2_IRQn,0); //!!
USART_ITConfig(USARTx,USART_IT_TC,ENABLE);
USART_ITConfig(USARTx,USART_IT_RXNE,ENABLE);
/*===============================================================================
===============================*/
void ADCRDYInterruptConfig (void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Line = EXTI_Line1|EXTI_Line13;
EXTI_Init(&EXTI_InitStructure);
}
/*===============================================================================
===============================*/
void ADCNVIC_Conf (void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*===============================================================================
===============================*/
void ADC2NVIC_Conf (void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
и еще, возможно ли такое, что когда выполняется бесконечный цикл while, прерывания не срабатывают? потому что запись команд и чтение АЦп сделано через spi и очень часто когда виснет программа я ее останавливаю и останавливается на строчке while (!(SPIx->SR & SPI_SR_RXNE));
Код
uint8_t WriteSPI(SPI_TypeDef * SPIx,uint8_t val)
{
SPIx->DR = val;
while (!(SPIx->SR & SPI_SR_RXNE));//while(!(SPI1->SR & 0x01));
return SPIx->DR;
}
Сообщение отредактировал IgorKossak - Mar 19 2012, 10:17
Причина редактирования: [codebox] для длинных кодов!!!