Вс май 22, 2022 14:15:58
Вс май 22, 2022 15:43:03
Вс май 22, 2022 17:27:04
И сколько понадобилось потратить часов, чтобы выяснить это?
Вс май 22, 2022 17:42:52
Вт май 24, 2022 20:46:57
volatile uint8_t SymbolCount = 0;
volatile char ReceivedText[20];
void USART1_IRQHandler(void) {
while (((USART1->SR & USART_SR_RXNE) >> USART_SR_RXNE_Pos) == 0); // Wait for "RX buffer not empty flag".
ReceivedText[SymbolCount++] = USART1->DR; // Read buffer to ReceivedText[] array.
if (SymbolCount == 0) { // If first symbol recieved, start "Time out" timer.
TIM4->CNT = 0;
TIM4->CR1 |= TIM_CR1_CEN;
}
if (SymbolCount < 10) {
TIM4->CNT = 0;
} else {
TIM4->CNT = 0;
TIM4->CR1 &=~ TIM_CR1_CEN;
SymbolCount = 0;
}
}
void TIM4_IRQHandler(void) {
TIM4->SR &=~ TIM_SR_UIF ; // Clear TIM4 flag.
TIM4->CR1 &=~ TIM_CR1_CEN ; // Disable TIM4.
USART_SendStr("Time out!") ;
SymbolCount = 0 ; // Set SymbolCount to zero.
}
Вт май 24, 2022 21:00:57
Вт май 24, 2022 21:20:53
Вт май 24, 2022 21:24:47
Вт май 24, 2022 21:40:41
if((USART1->SR & USART_SR_RNXE) && (USART1->CR1 & USART_CR1_RXNEIE))
{
// прочитать принятый байт из DR в буфер
// перезапустить таймер таймаута
}
Вт май 24, 2022 21:42:30
Вт май 24, 2022 22:07:42
Вт май 24, 2022 22:32:39
if((USART1->SR & USART_SR_RNXE) && (USART1->CR1 & USART_CR1_RXNEIE))
void USART1_IRQHandler(void)
{
uint32_t sr = USART1->SR;
uint8_t data = USART1->DR;
if(sr & (USART_SR_PE | USART_SR_FE | USART_SR_NE | USART_SR_ORE))
{
// Реакция на ошибку в приеме
}
else
{
// обработка принятых данных
}
}
Вт май 24, 2022 23:20:08
Ср май 25, 2022 00:26:36
Ср май 25, 2022 06:49:00
Ср май 25, 2022 09:08:00
void USART1_IRQHandler(void) {
if (SymbolCount == 0) {
TIM4->CNT = 0;
TIM4->CR1 |= TIM_CR1_CEN;
}
ReceivedText[SymbolCount++] = USART1->DR;
}
void TIM4_IRQHandler(void) {
TIM4->SR &=~ TIM_SR_UIF;
TIM4->CR1 &=~ TIM_CR1_CEN;
USART_SendStr("Time out!"); // ПРОБЛЕМА ЗДЕСЬ!
SymbolCount = 0;
}
#define USART_TX_ON (GPIOB->ODR |= GPIO_ODR_ODR5)
#define USART_TX_OFF (GPIOB->ODR &=~ GPIO_ODR_ODR5)
const Baudrate = 9600;
void USART1_Init(void) {
GPIOA->CRH &=~ GPIO_CRH_CNF9_0 ; // PA9 as alternate funtion Push-Pull (TX). (CNF = "0b10").
GPIOA->CRH |= GPIO_CRH_CNF9_1 ;
GPIOA->CRH |= (GPIO_CRH_MODE9 | GPIO_CRH_MODE9) ; // PA9 is OUTPUT, 50MHz max. (MODE = "0b11").
GPIOA->CRH &=~ GPIO_CRH_CNF10_0 ; // PA10 as input with Pull-Up (RX) (CNF = "0b10").
GPIOA->CRH |= GPIO_CRH_CNF10_1 ;
GPIOA->CRH &=~ (GPIO_CRH_MODE10 | GPIO_CRH_MODE10) ; // PA10 as Input.
GPIOB->CRL &=~ (GPIO_CRL_CNF5_0 | GPIO_CRL_CNF5_1) ; // PB5 as output with Push-Pull (RX/TX). (CNF = "0b00").
GPIOB->CRL |= (GPIO_CRL_MODE5_0 | GPIO_CRL_MODE5_1) ; // PA5 is OUTPUT, 50MHz max. (MODE = "0b11").
GPIOB->ODR &=~ GPIO_ODR_ODR5 ; // TX = 0;
USART1->BRR = SystemCoreClock/Baudrate;
USART1->CR1 = 0;
USART1->CR2 = 0;
USART1->CR3 = 0;
USART1->CR1 |= USART_CR1_RXNEIE ; // Enable RX interrupt.
USART1->CR1 &=~ USART_CR1_TXEIE ; // Disable TX interrupt.
USART1->CR1 &=~ USART_CR1_IDLEIE ; // Disable Idle interrupt.
USART1->CR1 &=~ USART_CR1_TCIE ; // Disable transmit complete interrupt.
USART1->CR1 &=~ USART_CR1_PEIE ; // Disable PEIE interrupt.
USART1->CR3 &=~ USART_CR3_CTSIE ; // Disable CTSIE interrupt.
NVIC_SetPriority(USART1_IRQn, 5) ; // Set USART1 IRQ Priority.
NVIC_EnableIRQ (USART1_IRQn) ;
USART1->CR1 |= USART_CR1_UE ; // Enable USART1.
USART1->CR1 |= USART_CR1_RE ; // Enable USART1 Reciever.
USART1->CR1 |= USART_CR1_TE ; // Enable USART1 Transmitter.
}
void USART_SendSymbol(uint8_t usymb) {
USART_TX_ON;
while (((USART1->SR & USART_SR_TXE) >> USART_SR_TXE_Pos) == 0); // Wait for TXE flag.
USART1->DR = usymb; // Trancieve data.
while (((USART1->SR & USART_SR_TXE) >> USART_SR_TXE_Pos) == 0); // Wait for TXE flag.
Delay_us(1000);
USART_TX_OFF;
}
void USART_SendStr(char *ustr) {
char *q = ustr;
while (*q)
{
USART_SendSymbol(*q++);
}
}
Ср май 25, 2022 11:05:09
Ср май 25, 2022 13:12:58
WiseLord писал(а):Миллисекундная задержка на каждый символ - итого, USART_SendStr() висит несколько миллисекунд в прерывании таймера. - как-то некрасиво
void USART_SendSymbol(uint8_t usymb) {
while (((USART1->SR & USART_SR_TXE) >> USART_SR_TXE_Pos) == 0); // Wait for TXE flag.
USART1->DR = usymb; // Trancieve data.
}
void USART_SendStr(char *ustr) {
char *q = ustr;
USART_TX_ON;
while (*q)
{
USART_SendSymbol(*q++);
}
Delay_us(1000);
USART_TX_OFF;
}
Ср май 25, 2022 13:57:05
Lum1noFor писал(а):И если после окончания передачи я переведу линию Read/Write раньше, чем через 1 мс, передача идет криво
Ср май 25, 2022 14:03:48
Lum1noFor писал(а):И если после окончания передачи я переведу линию Read/Write раньше, чем через 1 мс, передача идет криво