CODE
//********************************************************************************
//*Настройка прерываний
//********************************************************************************
NVIC_EnableIRQ (USART3_IRQn); //Разрешаем прерывние USART3
USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
//********************************************************************************
//*Разрешаем работу USART3: //********************************************************************************
USART_Cmd(USART3, ENABLE); //Разрешаем работу USART3
USART3->SR&=~USART_SR_TC;
while(1){
data=0;
};
}
void USART3_IRQHandler (void) {
//********************************************************************************
//* RS485 прерывание от приемника
//********************************************************************************
//if ((USART3->SR&USART_SR_RXNE)){
if (USART_GetITStatus(USART3, USART_IT_RXNE)==SET){
RS485_Buffer[RS485_Count]=USART_ReceiveData(USART3);
RS485_Count++;
}
//********************************************************************************
//*RS485 прерывание от передатчика
//********************************************************************************
//if((USART3->SR&USART_SR_TC)){
if (USART_GetITStatus(USART3, USART_IT_TС)==SET){
USART3->SR&=~USART_SR_TC;//Очищаем флаг окончания передачи
USART3->DR=RS485_Buffer[RS485_Count++];
};
}
//*Настройка прерываний
//********************************************************************************
NVIC_EnableIRQ (USART3_IRQn); //Разрешаем прерывние USART3
USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
//********************************************************************************
//*Разрешаем работу USART3: //********************************************************************************
USART_Cmd(USART3, ENABLE); //Разрешаем работу USART3
USART3->SR&=~USART_SR_TC;
while(1){
data=0;
};
}
void USART3_IRQHandler (void) {
//********************************************************************************
//* RS485 прерывание от приемника
//********************************************************************************
//if ((USART3->SR&USART_SR_RXNE)){
if (USART_GetITStatus(USART3, USART_IT_RXNE)==SET){
RS485_Buffer[RS485_Count]=USART_ReceiveData(USART3);
RS485_Count++;
}
//********************************************************************************
//*RS485 прерывание от передатчика
//********************************************************************************
//if((USART3->SR&USART_SR_TC)){
if (USART_GetITStatus(USART3, USART_IT_TС)==SET){
USART3->SR&=~USART_SR_TC;//Очищаем флаг окончания передачи
USART3->DR=RS485_Buffer[RS485_Count++];
};
}
Когда я смотрю отладчиком бит TC устанавливается после разрешения тактирования переферийного модуля USART3, затем сбрасывается когда разрешаются прерывания USART3: NVIC_EnableIRQ (USART3_IRQn); затем усанавливается, когда разрешается работа модуля USART3: USART_Cmd(USART3, ENABLE).
После этого я сбрасываю этот бит USART3->SR&=~USART_SR_TC;. Затем я ставлю точку останова в функции прерывания после строки if (USART_GetITStatus(USART3, USART_IT_TС)==SET) и при первом же запуске попадаю на эту точку останова. Никак не могу понять с чем это связано, ведь данный бит устанавливается после завершения передачи, а я еще ничего не передавал.