Подскажите пожалуйста по следующему вопросу:
Передаю байт ПК -> STM32, по схеме ПК->USB/RS485 - драйвер RS485/проц. Отсылаю обратно, все отлично. Хочу передать два и более байт, не выходит ничего, получаю в результате либо один непонятный байт, либо ничего вообще. Терминалка COM Port Toolkit.
Привожу код:
Основной цикл:
Код: Выделить всё
int main(void)
{
HardwareInit();
while(1)
{
if(rx)
{
rx=0;
tx_end=0;
USART1->CR1 &= ~USART_CR1_RXNEIE;
USART1->CR1 |= USART_CR1_TCIE;
RS485_TR; //переключаем на передачу
USART1->DR = temp;
}
if(tx_end)
{
tx_end=0;
RS485_RS; //переключаем на прием
USART1->CR1 |= USART_CR1_RXNEIE;
USART1->CR1 &= ~USART_CR1_TCIE;
}
}
}Код: Выделить всё
/***** Инициализация USART1 *****/
RCC->APB2ENR |= RCC_APB2ENR_USART1EN; // enable clock for USART1
RCC->APB2ENR|= RCC_APB2ENR_AFIOEN; //Alternate Function I/O clock enable
// 32,768 МГц/16*9600 => 213.33..
//USART1->BRR = (213 << 4) + 5;
// 32,768 МГц/16*115200 => 17.7..
USART1->BRR = (17 << 4) + 12;
USART1->CR1 |= USART_CR1_UE | USART_CR1_RXNEIE | USART_CR1_TE | USART_CR1_RE; //USART Enable; RXNE Interrupt Enable; Transmitter Enable; Receiver Enable
//USART1->CR2 no init, 1 stopbit by default
//USART1->CR3 |= USART_CR3_EIE; //Error Interrupt Enable
USART1->DR = 0x00; //очищаем регистр данных
RS485_RS; //переключаем драйвер RS485 на прием
/********************************/
/** раздача приоритетов прерываний **/
__enable_irq(); // глобальное включение прерывания
NVIC_EnableIRQ(USART1_IRQn); // прерывание по USART
NVIC_SetPriority(USART1_IRQn, 0); // поумолчанию приоритет 0, самый высокий
NVIC_EnableIRQ(TIM2_IRQn); // прерывание по таймеру2
NVIC_SetPriority(TIM2_IRQn, 1); // приоритет после UART
/************************************/
Код: Выделить всё
void USART1_IRQHandler (void)
{
//Receive Data register not empty interrupt
if(USART1->SR & USART_SR_RXNE){
rx=1;
USART1->SR&=~USART_SR_RXNE;
temp=USART1->DR;
}
//Transmission complete interrupt
if(USART1->SR & USART_SR_TC){
USART1->SR &= ~USART_SR_TC;
tx_end=1;
}
}Заранее благодарен за любую помощь!!!
ЗЫ
прием более одного байта сопровождается выставлением флага ORE в статус-регистре юсарта, что уже дожно повлечь за собой очередное прерывание, но я не наблюдаю его. Где накосячил?


