ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
870596 Топик полностью
vesago (12.09.2018 10:24 - 10:26, просмотров: 94) ответил IBAH на STM32 как узнать, что УАРТ занят передачей, т.е. в состоянии от старта до стопа . Все регистры просмотрел, не нашел никакого подходящего флага. Неужели самому писать?
Это для 485? Так я переключаю на передачу: //:::::::::::::::::::::::::::::::::::::::::::::::::::::: // Запрет приема //:::::::::::::::::::::::::::::::::::::::::::::::::::::: void USART1_Disable_Recive(void) { USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//UCSR0B &= ~(1 << RXEN0); USART_ClearITPendingBit(USART1, USART_IT_RXNE); //Global_Bus_RS485_Dir_TX(); } Так отправляю: //:::::::::::::::::::::::::::::::::::::::::::::::::::::: // Передача байта //:::::::::::::::::::::::::::::::::::::::::::::::::::::: void USART1_Transmit(u8_t data) { u16_t tmphead; tmphead = (usart1.tx_head + 1) & USART1_TX_BUFFER_MASK; while (tmphead == usart1.tx_tail); usart1.tx_buf[tmphead] = data; usart1.tx_head = tmphead; usart1.flags &= ~(1<<USART1_FLAG_TX_COMPLETE); usart1.flags &= ~(1<<USART1_FLAG_SHIFT_REG_EMPTY); #ifdef ALLOW_USART1_TX_DELAY USART1_TX_Timeout_Init(); #else USART_ITConfig(USART1, USART_IT_TXE, ENABLE); #endif } Так прерывание обрабатываю: //****************************************************************************************** //Обработчики прерывания USART1 //****************************************************************************************** void USART1_IRQHandler(void) { u8_t data; u16_t tmptail; u16_t tmphead; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { data = USART_ReceiveData(USART1); tmphead = ( usart1.rx_head + 1 ) & USART1_RX_BUFFER_MASK; usart1.rx_head = tmphead; if ( tmphead == usart1.rx_tail ) { //ERROR! Receive buffer overflow } usart1.rx_buf[tmphead] = data; } if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { tmphead = usart1.tx_head; if( tmphead != usart1.tx_tail ) { tmptail = ( usart1.tx_tail + 1 ) & USART1_TX_BUFFER_MASK; usart1.tx_tail = tmptail; USART_SendData(USART1, usart1.tx_buf[tmptail]); } else { USART_ClearITPendingBit(USART1, USART_IT_TC); USART_ITConfig(USART1, USART_IT_TC, ENABLE); USART_ITConfig(USART1, USART_IT_TXE, DISABLE); usart1.flags |= (1<<USART1_FLAG_TX_COMPLETE); } } if(USART_GetITStatus(USART1, USART_IT_TC) != RESET) { USART_ClearITPendingBit(USART1, USART_IT_TC); if((usart1.flags & (1<<USART1_FLAG_TX_COMPLETE)) != 0) { usart1.flags &= ~(1<<USART1_FLAG_TX_COMPLETE); usart1.flags |= (1<<USART1_FLAG_SHIFT_REG_EMPTY); USART1_Enable_Recive(); USART_ITConfig(USART1, USART_IT_TC, DISABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); } } if(USART_GetITStatus(USART1, USART_IT_LBD) != RESET) { USART_ClearITPendingBit(USART1, USART_IT_LBD); USART1_LBD_Flag_Clr(); } if(USART_GetITStatus(USART1, USART_IT_ORE) != RESET) { USART_ClearITPendingBit(USART1, USART_IT_ORE); } } Как раз if(USART_GetITStatus(USART1, USART_IT_TC) != RESET) проверяет, что данные переданы и можно переключиться на прием..