Files
CuboBmsFirmware/Core/Src/driverHWUART2.c
Yury Shuvakin 190522943f Initial commit
2023-03-29 20:05:40 +03:00

174 lines
7.5 KiB
C

#include "driverHWUART2.h"
UART_HandleTypeDef driverHWUART2Handle;
DMA_HandleTypeDef driverHWUART2HDMAHandleRX;
uint8_t driverHWUART2ReceivedChar;
uint8_t driverHWUART2ReceiveBuffer[RX_UART_BUFFER_SIZE]; // Buffer that stores received chars
uint8_t driverHWUART2ReceiveBuffer_usb[RX_UART_BUFFER_SIZE];
uint32_t driverHWUART2Receive_CNDTR = RX_UART_BUFFER_SIZE;
uint8_t driverHWUART2Receive_CNDTR_resetFlag = 0;
void driverHWUART2Init(uint32_t baudRate) {
// memset(driverHWUART2ReceiveBuffer,0,sizeof(driverHWUART2ReceiveBuffer)/sizeof(uint8_t));
//
// /* DMA controller clock enable */
// __HAL_RCC_DMA1_CLK_ENABLE();
//
// driverHWUART2HDMAHandleRX.Instance = DMA1_Channel6; // Will handle transfer of received char to buffer
// driverHWUART2HDMAHandleRX.Init.Direction = DMA_PERIPH_TO_MEMORY;
// driverHWUART2HDMAHandleRX.Init.PeriphInc = DMA_PINC_DISABLE;
// driverHWUART2HDMAHandleRX.Init.MemInc = DMA_MINC_ENABLE;
// driverHWUART2HDMAHandleRX.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
// driverHWUART2HDMAHandleRX.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
// driverHWUART2HDMAHandleRX.Init.Mode = DMA_CIRCULAR;
// driverHWUART2HDMAHandleRX.Init.Priority = DMA_PRIORITY_MEDIUM;
//
// if (HAL_DMA_Init(&driverHWUART2HDMAHandleRX) != HAL_OK)
// {
// while(true);
// }
//
// __HAL_LINKDMA(&driverHWUART2Handle,hdmarx,driverHWUART2HDMAHandleRX);
//
// driverHWUART2Handle.Instance = USART2;
// driverHWUART2Handle.Init.BaudRate = baudRate;
// driverHWUART2Handle.Init.WordLength = UART_WORDLENGTH_8B;
// driverHWUART2Handle.Init.StopBits = UART_STOPBITS_1;
// driverHWUART2Handle.Init.Parity = UART_PARITY_NONE;
// driverHWUART2Handle.Init.Mode = UART_MODE_TX_RX;
// driverHWUART2Handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
// driverHWUART2Handle.Init.OverSampling = UART_OVERSAMPLING_16;
// // driverHWUART2Handle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
// // driverHWUART2Handle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
//
// if (HAL_UART_Init(&driverHWUART2Handle) != HAL_OK) {
// while(true);
// }
//
// volatile HAL_StatusTypeDef temp = HAL_UART_Receive_DMA(&driverHWUART2Handle,driverHWUART2ReceiveBuffer,sizeof(driverHWUART2ReceiveBuffer)/sizeof(uint8_t)); // Start receive to DMA transfer
//
// HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0); // Will realise interrupt on half and full DMA transfer
// HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
};
void driverHWUART2SendChar(uint8_t character) {
uint8_t usb_out_buffer[1];
uint8_t usb_result = 1;
uint32_t usb_start_time;
usb_start_time = HAL_GetTick();
usb_out_buffer[0] = character;
while(usb_result == 1){
//) || ((HAL_GetTick() - usb_start_time < 10))
usb_result = CDC_Transmit_FS(usb_out_buffer, 1);
}
//HAL_UART_Transmit(&driverHWUART2Handle,&character,sizeof(character)/sizeof(uint8_t),10); // Send single char over serial port
};
bool driverHWUART2GetChar(char *character) {
static uint32_t bufferTail = 0; // Initiate tail to 0
uint32_t bufferHead = sizeof(driverHWUART2ReceiveBuffer_usb)/sizeof(uint8_t) - driverHWUART2Receive_CNDTR; // Tranform to be transferred bytes to bytes transferred.
// if(driverHWUART2Receive_CNDTR_resetFlag){
// bufferTail = 0;
// driverHWUART2Receive_CNDTR_resetFlag = 0;
// //bufferHead = 0;
// }
if(bufferTail != bufferHead){ // If head and tail differs there is something in the buffer
*character = driverHWUART2ReceiveBuffer_usb[bufferTail]; // Get char from tail of buffer
bufferTail++; // Move the tail forward
bufferTail %= (sizeof(driverHWUART2ReceiveBuffer_usb)/sizeof(uint8_t)); // Wrap it around the end
return true; // Indicate there is a char in buffer
}else
return false; // Indicate there is no char in buffer
};
//bool driverHWUART2GetChar(char *character) {
// static uint32_t bufferTail = 0;
// __IO uint32_t a = 0;
// __IO uint32_t b = 0;
// uint32_t usb_start_time;
// __IO uint32_t bufferHead = 0;
// usb_start_time = HAL_GetTick();// Initiate tail to 0
// uint32_t cndtr_buf = driverHWUART2HDMAHandleRX.Instance->CNDTR;
//
// if(driverHWUART2Receive_CNDTR_resetFlag){
// bufferTail = 0;
// driverHWUART2Receive_CNDTR_resetFlag = 0;
// //bufferHead = 0;
//
// }
//
// //uint32_t bufferHead = sizeof(driverHWUART2ReceiveBuffer)/sizeof(uint8_t) - driverHWUART2HDMAHandleRX.Instance->CNDTR; // Tranform to be transferred bytes to bytes transferred.
// bufferHead = sizeof(driverHWUART2ReceiveBuffer)/sizeof(uint8_t) - driverHWUART2Receive_CNDTR; // Tranform to be transferred bytes to bytes transferred.
// // 1024 - 1016 = 8
// a = bufferHead - bufferTail;
// if(a != 0) {
// *character = driverHWUART2ReceiveBuffer_usb[bufferTail];
// bufferTail++;
//
// bufferTail %= (sizeof(driverHWUART2ReceiveBuffer)/sizeof(uint8_t));
// return true;
// } else{
// if(driverHWUART2Receive_CNDTR < 1000) {
// return false;
// }
// return false; // Indicate there is no char in buffer
// }
// //if(bufferTail != bufferHead) { // If head and tail differs there is something in the buffer
// //while (bufferTail != bufferHead) {
//// //if(bufferTail < 20) {
//// //*character = driverHWUART2ReceiveBuffer[bufferTail]; // Get char from tail of buffer
//// *character = driverHWUART2ReceiveBuffer_usb[bufferTail];
//// bufferTail++;
//// // Move the tail forward
//// bufferTail %= (sizeof(driverHWUART2ReceiveBuffer)/sizeof(uint8_t)); // Wrap it around the end
//// // bufferTail = bufferTail % 1024
//// // bufferTail = 1024 % 1024 = 0
//// return true; // Indicate there is a char in buffer
//// }else{
//// if(driverHWUART2Receive_CNDTR < 1000) {
//// return false;
//// }
//// return false; // Indicate there is no char in buffer
//// }
//};
//void driverHWUART2SendChar(uint8_t character) {
// //HAL_UART_Transmit(&driverHWUART2Handle,&character,sizeof(character)/sizeof(uint8_t),10); // Send single char over serial port
//// CDC_Transmit_FS(character, 1);
// uint8_t testDataToSend[8];
// // for (uint8_t i = 0; i < 8; i++)
// // {
// // testDataToSend[i] = i;
// // }
//
// testDataToSend[0] = character;
// CDC_Transmit_FS(testDataToSend, 1);
//
// //uint8_t buf[1];
// //buf[0] = character;
// //CDC_Transmit_FS(buf[0], 1);
//};
//
//bool driverHWUART2GetChar(char *character) {
// static uint32_t bufferTail = 0; // Initiate tail to 0
// uint32_t bufferHead = sizeof(driverHWUART2ReceiveBuffer)/sizeof(uint8_t) - driverHWUART2Receive_CNDTR; // Tranform to be transferred bytes to bytes transferred.
// if(bufferHead == 12) {
//// bufferTail = 1;
// }
// if(bufferTail != bufferHead){ // If head and tail differs there is something in the buffer
// *character = driverHWUART2ReceiveBuffer[bufferTail]; // Get char from tail of buffer
// bufferTail++; // Move the tail forward
// bufferTail %= (sizeof(driverHWUART2ReceiveBuffer)/sizeof(uint8_t)); // Wrap it around the end
// return true; // Indicate there is a char in buffer
// }else
// return false; // Indicate there is no char in buffer
//};
void DMA1_Channel6_IRQHandler(void) { // Will trigger on halve and full
// HAL_DMA_IRQHandler(&driverHWUART2HDMAHandleRX);
}