174 lines
7.5 KiB
C
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);
|
|
}
|