uint8_t TM_USART_FindCharacter(USART_TypeDef* USARTx, uint8_t c) { uint16_t num, out; TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* Temp variables */ num = u->Num; out = u->Out; while (num > 0) { /* Check overflow */ if (out == u->Size) { out = 0; } /* Check if characters matches */ if ((uint8_t) u->Buffer[out] == (uint8_t) c) { /* Character found */ return 1; } /* Set new variables */ out++; num--; } /* Character is not in buffer */ return 0; }
uint8_t TM_USART_Getc(USART_TypeDef* USARTx) { int8_t c = 0; TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* Check if we have any data in buffer */ if (u->Num > 0 || u->In != u->Out) { /* Check overflow */ if (u->Out == u->Size) { u->Out = 0; } /* Read character */ c = u->Buffer[u->Out]; /* Increase output pointer */ u->Out++; /* Decrease number of elements */ if (u->Num) { u->Num--; } } /* Return character */ return c; }
void TM_USART_SetCustomStringEndCharacter(USART_TypeDef* USARTx, uint8_t Character) { /* Get USART structure */ TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* Set delimiter */ u->StringDelimiter = Character; }
void TM_USART_ClearBuffer(USART_TypeDef* USARTx) { TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* Reset variables */ u->Num = 0; u->In = 0; u->Out = 0; }
void TM_USART_Puts(USART_TypeDef* USARTx, char* str) { TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* If we are not initialized */ if (u->Initialized == 0) { return; } /* Go through entire string */ while (*str) { /* Wait to be ready, buffer empty */ USART_WAIT(USARTx); /* Send data */ USARTx->DR = (uint16_t)(*str++ & 0x01FF); /* Wait to be ready, buffer empty */ USART_WAIT(USARTx); } }
uint8_t TM_USART_Getc(USART_TypeDef* USARTx) { int8_t c = 0; TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* Check if we have any data in buffer */ if (u->Num > 0) { if (u->Out == u->Size) { u->Out = 0; } c = *(u->Buffer + u->Out); u->Out++; u->Num--; } /* Return character */ return c; }
void TM_USART_Send(USART_TypeDef* USARTx, uint8_t* DataArray, uint16_t count) { uint16_t i; TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* If we are not initialized */ if (u->Initialized == 0) { return; } /* Go through entire data array */ for (i = 0; i < count; i++) { /* Wait to be ready, buffer empty */ USART_WAIT(USARTx); /* Send data */ USARTx->DR = (uint16_t)(DataArray[i]); /* Wait to be ready, buffer empty */ USART_WAIT(USARTx); } }
uint16_t TM_USART_Gets(USART_TypeDef* USARTx, char* buffer, uint16_t bufsize) { uint16_t i = 0; /* Get USART structure */ TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* Check for any data on USART */ if ( u->Num == 0 || /*!< Buffer empty */ ( !TM_USART_FindCharacter(USARTx, u->StringDelimiter) && /*!< String delimiter not in buffer */ u->Num != u->Size /*!< Buffer is not full */ ) ) { /* Return 0 */ return 0; } /* If available buffer size is more than 0 characters */ while (i < (bufsize - 1)) { /* We have available data */ buffer[i] = (char) TM_USART_Getc(USARTx); /* Check for end of string */ if ((uint8_t) buffer[i] == (uint8_t) u->StringDelimiter) { /* Done */ break; } /* Increase */ i++; } /* Add zero to the end of string */ buffer[++i] = 0; /* Return number of characters in buffer */ return i; }
static void TM_USART_INT_Init( USART_TypeDef* USARTx, TM_USART_PinsPack_t pinspack, uint32_t baudrate, TM_USART_HardwareFlowControl_t FlowControl, uint32_t Mode, uint32_t Parity, uint32_t StopBits, uint32_t WordLength ) { USART_InitTypeDef USART_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* Set USART baudrate */ USART_InitStruct.USART_BaudRate = baudrate; /* * Initialize USARTx pins * Set channel for USARTx NVIC */ #ifdef USE_USART1 if (USARTx == USART1) { /* Enable USART clock */ RCC->APB2ENR |= RCC_APB2ENR_USART1EN; /* Init pins */ TM_USART1_InitPins(pinspack); /* Set IRQ channel */ NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn; } #endif #ifdef USE_USART2 if (USARTx == USART2) { /* Enable USART clock */ RCC->APB1ENR |= RCC_APB1ENR_USART2EN; /* Init pins */ TM_USART2_InitPins(pinspack); /* Set IRQ channel */ NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn; } #endif #ifdef USE_USART3 if (USARTx == USART3) { /* Enable USART clock */ RCC->APB1ENR |= RCC_APB1ENR_USART3EN; /* Init pins */ TM_USART3_InitPins(pinspack); /* Set IRQ channel */ NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn; } #endif #ifdef USE_UART4 if (USARTx == UART4) { /* Enable UART clock */ RCC->APB1ENR |= RCC_APB1ENR_UART4EN; /* Init pins */ TM_UART4_InitPins(pinspack); /* Set IRQ channel */ NVIC_InitStruct.NVIC_IRQChannel = UART4_IRQn; } #endif #ifdef USE_UART5 if (USARTx == UART5) { /* Enable UART clock */ RCC->APB1ENR |= RCC_APB1ENR_UART5EN; /* Init pins */ TM_UART5_InitPins(pinspack); /* Set IRQ channel */ NVIC_InitStruct.NVIC_IRQChannel = UART5_IRQn; } #endif #ifdef USE_USART6 if (USARTx == USART6) { /* Enable UART clock */ RCC->APB2ENR |= RCC_APB2ENR_USART6EN; /* Init pins */ TM_USART6_InitPins(pinspack); /* Set IRQ channel */ NVIC_InitStruct.NVIC_IRQChannel = USART6_IRQn; } #endif #ifdef USE_UART7 if (USARTx == UART7) { /* Enable UART clock */ RCC->APB1ENR |= RCC_APB1ENR_UART7EN; /* Init pins */ TM_UART7_InitPins(pinspack); /* Set IRQ channel */ NVIC_InitStruct.NVIC_IRQChannel = UART7_IRQn; } #endif #ifdef USE_UART8 if (USARTx == UART8) { /* Enable UART clock */ RCC->APB1ENR |= RCC_APB1ENR_UART8EN; /* Init pins */ TM_UART8_InitPins(pinspack); /* Set IRQ channel */ NVIC_InitStruct.NVIC_IRQChannel = UART8_IRQn; } #endif /* Deinit USART, force reset */ USART_DeInit(USARTx); /* Fill NVIC settings */ NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = TM_USART_NVIC_PRIORITY; NVIC_InitStruct.NVIC_IRQChannelSubPriority = TM_USART_INT_GetSubPriority(USARTx); NVIC_Init(&NVIC_InitStruct); /* Fill default settings */ USART_InitStruct.USART_HardwareFlowControl = FlowControl; USART_InitStruct.USART_Mode = Mode; USART_InitStruct.USART_Parity = Parity; USART_InitStruct.USART_StopBits = StopBits; USART_InitStruct.USART_WordLength = WordLength; /* We are not initialized */ u->Initialized = 0; do { volatile uint32_t x = 0xFFF; while (x--); } while (0); /* Init */ USART_Init(USARTx, &USART_InitStruct); /* Enable RX interrupt */ USARTx->CR1 |= USART_CR1_RXNEIE; /* We are initialized now */ u->Initialized = 1; /* Enable USART peripheral */ USARTx->CR1 |= USART_CR1_UE; }
uint8_t TM_USART_BufferFull(USART_TypeDef* USARTx) { TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* Check if number of characters is the same as buffer size */ return (u->Num == u->Size); }
uint8_t TM_USART_BufferEmpty(USART_TypeDef* USARTx) { TM_USART_t* u = TM_USART_INT_GetUsart(USARTx); /* Check if number of characters is zero in buffer */ return (u->Num == 0 && u->In == u->Out); }