#include #include #include #include #include #include "queue.h" #include "uart.h" #include "leds.h" #define RED_LED_GPIO GPIOA #define RED_LED_PIN 6 #define RedLEDon() RED_LED_GPIO->BSRRH = 1 << RED_LED_PIN #define RedLEDoff() RED_LED_GPIO->BSRRL = 1 << RED_LED_PIN #define USART_Mode_Rx_Tx (USART_CR1_RE | USART_CR1_TE) #define USART_Enable USART_CR1_UE #define USART_WordLength_8b 0x0000 #define USART_Parity_No 0x0000 #define USART_StopBits_1 0x0000 #define USART_FlowControl_None 0x0000 #define HSI_HZ 16000000U #define PCLK2_HZ HSI_HZ #define USART1_GPIO GPIOA #define USART1_TXD_PIN 9 #define USART1_RXD_PIN 10 #define BUFF_SIZE 100 char buffer[BUFF_SIZE]; Queue queue; char buff[2] = "\0"; static void enableUSART() { USART1->CR1 |= USART_CR1_UE; } static void initDMA2() { RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN; DMA2_Stream7->CR = 4U << 25 | DMA_SxCR_PL_1 | DMA_SxCR_MINC | DMA_SxCR_DIR_0 | DMA_SxCR_TCIE; DMA2_Stream7->PAR = (uint32_t)&USART1->DR; DMA2_Stream5->CR = 4U << 25 | DMA_SxCR_PL_1 | DMA_SxCR_MINC | DMA_SxCR_TCIE; DMA2_Stream5->PAR = (uint32_t)&USART1->DR; DMA2->HIFCR = DMA_HIFCR_CTCIF7 | DMA_HIFCR_CTCIF5; NVIC_EnableIRQ(DMA2_Stream5_IRQn); //DMA2->HIFCR = DMA_HIFCR_CTCIF7; NVIC_EnableIRQ(DMA2_Stream7_IRQn); } static int busyDMA() { return (DMA2_Stream7->CR & DMA_SxCR_EN); } static void sendDMA(char* msg, uint32_t len) { DMA2_Stream7->M0AR = (uint32_t)msg; DMA2_Stream7->NDTR = len; DMA2_Stream7->CR |= DMA_SxCR_EN; } static void recvDMA(char* msg) { DMA2_Stream5->M0AR = (uint32_t)msg; DMA2_Stream5->NDTR = 2; DMA2_Stream5->CR |= DMA_SxCR_EN; } void initUSART1() { uint32_t const baudrate = 9600U; RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; RCC->APB2ENR |= RCC_APB2ENR_USART1EN; USART1->BRR = (PCLK2_HZ + (baudrate / 2U)) / baudrate; USART1->CR1 = USART_Mode_Rx_Tx | USART_WordLength_8b | USART_Parity_No; USART1->CR2 = USART_StopBits_1; USART1->CR3 = USART_CR3_DMAT | USART_CR3_DMAR; GPIOafConfigure(USART1_GPIO, USART1_TXD_PIN, GPIO_OType_PP, GPIO_Fast_Speed, GPIO_PuPd_NOPULL, GPIO_AF_USART1); GPIOafConfigure(USART1_GPIO, USART1_RXD_PIN, GPIO_OType_PP, GPIO_Fast_Speed, GPIO_PuPd_UP, GPIO_AF_USART1); initDMA2(); enableUSART(); initQueue(&queue); recvDMA(buff); } void DMA2_Stream7_IRQHandler() { uint32_t isr = DMA2->HISR; if (isr & DMA_HISR_TCIF7) { DMA2->HIFCR = DMA_HIFCR_CTCIF7; if (!isEmptyQueue(&queue)) { uint32_t len = getStrQueue(&queue, buffer, BUFF_SIZE); sendDMA(buffer, len); } } } void DMA2_Stream5_IRQHandler() { uint32_t isr = DMA2->HISR; if (isr & DMA_HISR_TCIF5) { DMA2->HIFCR = DMA_HIFCR_CTCIF5; sendUSART(buff); parseCmdLed(buff); recvDMA(buff); } } void sendUSART(char* msg) { // toggleLed(RED); if (busyDMA()) { putStrQueue(&queue, msg); } else { sendDMA(msg, strlen(msg)); } }