#include "usart.h" #include "cdc_main.h" #define U4_DATA_BUF_LEN CDC_EP_SIZE volatile uint8_t USART4_TX_Flag = 0; // 0:IDLE,1:TX uint8_t U4_Rxbuf[U4_DATA_BUF_LEN]; void USART4_Init(void) { GPIO_InitTypeDef GPIO_InitStructure = {0}; USART_InitTypeDef USART_InitStructure = {0}; NVIC_InitTypeDef NVIC_InitStructure = {0}; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART2, &USART_InitStructure); USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART2, ENABLE); } void USART4_Config_Linecoding(uint8_t LineCoding[7]) { USART_InitTypeDef USART_InitStructure = {0}; uint32_t dataRat; uint8_t stopBit, parityType, dataBit; dataRat = (LineCoding[3] << 24) | (LineCoding[2] << 16) | (LineCoding[1] << 8) | LineCoding[0]; stopBit = LineCoding[4]; parityType = LineCoding[5]; dataBit = LineCoding[6]; if(dataRat == 0) return; USART_InitStructure.USART_BaudRate = dataRat; if (stopBit == 0) USART_InitStructure.USART_StopBits = USART_StopBits_1; else if (stopBit == 1) USART_InitStructure.USART_StopBits = USART_StopBits_1_5; else if (stopBit == 2) USART_InitStructure.USART_StopBits = USART_StopBits_2; else USART_InitStructure.USART_StopBits = USART_StopBits_1; if (parityType == 0) USART_InitStructure.USART_Parity = USART_Parity_No; else if (parityType == 1) USART_InitStructure.USART_Parity = USART_Parity_Odd; else if (parityType == 2) USART_InitStructure.USART_Parity = USART_Parity_Even; else USART_InitStructure.USART_Parity = USART_Parity_No; if(dataBit == 8) USART_InitStructure.USART_WordLength = USART_WordLength_8b; else if(dataBit == 9) USART_InitStructure.USART_WordLength = USART_WordLength_9b; else USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART2, &USART_InitStructure); USART4_DMA_Recv(); } void USART4_DMA_Init(void) { DMA_InitTypeDef DMA_InitStructure = {0}; NVIC_InitTypeDef NVIC_InitStructure = {0}; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel7); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DATAR); DMA_InitStructure.DMA_MemoryBaseAddr = 0; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 0; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel7, &DMA_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_ClearFlag(DMA1_FLAG_TC7); DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE); DMA_DeInit(DMA1_Channel6); DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART2->DATAR); DMA_InitStructure.DMA_MemoryBaseAddr = (u32)U4_Rxbuf; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = U4_DATA_BUF_LEN; DMA_Init(DMA1_Channel6, &DMA_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); DMA_ClearFlag(DMA1_FLAG_TC6); DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE); } void USART4_DMA_Recv(void) { DMA_Cmd(DMA1_Channel6, DISABLE); DMA1_Channel6->MADDR = (u32)U4_Rxbuf; DMA1_Channel6->CNTR = U4_DATA_BUF_LEN; DMA_Cmd(DMA1_Channel6, ENABLE); USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); } void USART4_DMA_Send(uint8_t *data, uint32_t datalen) { while (USART4_TX_Flag == 1) ; USART4_TX_Flag = 1; DMA_Cmd(DMA1_Channel7, DISABLE); DMA1_Channel7->MADDR = (uint32_t)data; DMA1_Channel7->CNTR = datalen; DMA_Cmd(DMA1_Channel7, ENABLE); USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE); } uint8_t USART4_Send_IsBusy(void) { return USART4_TX_Flag; } void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void USART2_IRQHandler(void) { if (USART_GetITStatus(USART2, USART_IT_IDLE) == SET) { UART_RX_CallBack(U4_Rxbuf, U4_DATA_BUF_LEN - DMA1_Channel6->CNTR); USART4_DMA_Recv(); // Clear IDLE IT volatile uint8_t temp = 0; temp = USART2->STATR; temp = USART2->DATAR; if (temp != 0) temp = 0; } } void DMA1_Channel7_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void DMA1_Channel7_IRQHandler(void) { if (DMA_GetITStatus(DMA1_IT_TC7) == SET) { UART_TX_CallBack(); USART4_TX_Flag = 0; DMA_ClearITPendingBit(DMA1_IT_TC7); } } void DMA1_Channel6_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast"))); void DMA1_Channel6_IRQHandler(void) { if (DMA_GetITStatus(DMA1_IT_TC6) == SET) { UART_RX_CallBack(U4_Rxbuf, U4_DATA_BUF_LEN - DMA1_Channel6->CNTR); USART4_DMA_Recv(); DMA_ClearITPendingBit(DMA1_IT_TC6); } }