#include <gpio.h>
#include <delay.h>
#include <irq.h>
#include <stm32.h>
#include <string.h>
#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 {
}
}