添加串口读写
This commit is contained in:
+288
@@ -0,0 +1,288 @@
|
||||
/*
|
||||
* drv_usart.c
|
||||
*
|
||||
* Created on: Mar 31, 2023
|
||||
* Author: gxms0
|
||||
*/
|
||||
|
||||
#include <drv_uart.h>
|
||||
|
||||
|
||||
UART_t uart1;
|
||||
UART_t uart2;
|
||||
UART_t uart3;
|
||||
|
||||
|
||||
void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||
void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||
void USART3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||
|
||||
|
||||
//void DMA1_Channel5_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
|
||||
|
||||
|
||||
|
||||
//初始化串口,
|
||||
/*
|
||||
void USART1_Init(uint32_t BaudRate,uint16_t WordLength,uint16_t StopBits,uint16_t Parity)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure = {0};
|
||||
USART_InitTypeDef USART_InitStructure = {0};
|
||||
DMA_InitTypeDef DMA_InitStructure = {0};
|
||||
NVIC_InitTypeDef NVIC_InitStructure = {0};
|
||||
|
||||
|
||||
//DMA设置
|
||||
//RX DMA1_Channel5
|
||||
DMA_DeInit(DMA1_Channel5);
|
||||
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DATAR;
|
||||
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buff_rx;
|
||||
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
|
||||
DMA_InitStructure.DMA_BufferSize = sizeof(buff_rx);//设置buffer大小
|
||||
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_Circular;
|
||||
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
|
||||
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
||||
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
|
||||
|
||||
//TX DMA1_Channel4
|
||||
DMA_DeInit(DMA1_Channel4);
|
||||
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DATAR;
|
||||
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buff_tx;
|
||||
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
|
||||
DMA_InitStructure.DMA_BufferSize = sizeof(buff_tx);
|
||||
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_Channel4, &DMA_InitStructure);
|
||||
|
||||
|
||||
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
|
||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&NVIC_InitStructure);
|
||||
|
||||
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
|
||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&NVIC_InitStructure);
|
||||
|
||||
DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
|
||||
DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, ENABLE);
|
||||
|
||||
//打开接收
|
||||
DMA_Cmd(DMA1_Channel5, ENABLE);
|
||||
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
|
||||
|
||||
//打开发送(不需要,等到发送时打开即可)
|
||||
|
||||
USART_Cmd(USART1, ENABLE);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
void usart_init(void)
|
||||
{
|
||||
usart_config(&uart1,USART1 ,GPIOA, GPIO_Pin_9, GPIOA, GPIO_Pin_10,115200, USART_WordLength_8b, USART_StopBits_1, USART_Parity_No,128,128);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void usart_config(UART_ptr ptr,USART_TypeDef *UART, GPIO_TypeDef *GPIO_Tx, uint32_t Pin_Tx, GPIO_TypeDef *GPIO_Rx, uint32_t Pin_Rx,
|
||||
uint32_t BaudRate, uint16_t WordLength, uint16_t StopBits, uint16_t Parity,
|
||||
uint32_t buff_tx_len,uint32_t buff_rx_len)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure = {0};
|
||||
USART_InitTypeDef USART_InitStructure = {0};
|
||||
//DMA_InitTypeDef DMA_InitStructure = {0};
|
||||
NVIC_InitTypeDef NVIC_InitStructure = {0};
|
||||
uint32_t RCC_Periph = RCC_APB2Periph_USART1;
|
||||
|
||||
ptr->USART = UART;
|
||||
ptr->GPIO_Tx = GPIO_Tx;
|
||||
ptr->Pin_Tx = Pin_Tx;
|
||||
ptr->GPIO_Rx = GPIO_Rx;
|
||||
ptr->Pin_Rx = Pin_Rx;
|
||||
|
||||
if (ptr->buffer_rx)
|
||||
free(ptr->buffer_rx);
|
||||
if (ptr->buffer_tx)
|
||||
free(ptr->buffer_tx);
|
||||
|
||||
ptr->buffer_rx = (uint8_t *)malloc(buff_rx_len);
|
||||
ptr->buffer_tx = (uint8_t *)malloc(buff_tx_len);
|
||||
ptr->buffer_rx_len = buff_rx_len;
|
||||
ptr->buffer_tx_len = buff_tx_len;
|
||||
ptr->buffer_tx_len_2 = buff_tx_len / 2;
|
||||
|
||||
|
||||
|
||||
if(ptr->USART == USART1)RCC_Periph = RCC_APB2Periph_USART1;
|
||||
else if(ptr->USART == USART2)RCC_Periph = RCC_APB1Periph_USART2;
|
||||
else if(ptr->USART == USART3)RCC_Periph = RCC_APB1Periph_USART3;
|
||||
else if(ptr->USART == UART4)RCC_Periph = RCC_APB1Periph_UART4;
|
||||
RCC_APB2PeriphClockCmd(RCC_Periph, ENABLE);
|
||||
|
||||
//初始化IO口
|
||||
//init tx
|
||||
if(ptr->GPIO_Tx == GPIOA)RCC_Periph = RCC_APB2Periph_GPIOA;
|
||||
else if(ptr->GPIO_Tx == GPIOB)RCC_Periph = RCC_APB2Periph_GPIOB;
|
||||
else if(ptr->GPIO_Tx == GPIOC)RCC_Periph = RCC_APB2Periph_GPIOC;
|
||||
else if(ptr->GPIO_Tx == GPIOD)RCC_Periph = RCC_APB2Periph_GPIOD;
|
||||
else if(ptr->GPIO_Tx == GPIOE)RCC_Periph = RCC_APB2Periph_GPIOE;
|
||||
|
||||
RCC_APB2PeriphClockCmd(RCC_Periph, ENABLE);
|
||||
GPIO_InitStructure.GPIO_Pin = ptr->Pin_Tx;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(ptr->GPIO_Tx, &GPIO_InitStructure);
|
||||
|
||||
//init rx
|
||||
if(ptr->GPIO_Rx == GPIOA)RCC_Periph = RCC_APB2Periph_GPIOA;
|
||||
else if(ptr->GPIO_Rx == GPIOB)RCC_Periph = RCC_APB2Periph_GPIOB;
|
||||
else if(ptr->GPIO_Rx == GPIOC)RCC_Periph = RCC_APB2Periph_GPIOC;
|
||||
else if(ptr->GPIO_Rx == GPIOD)RCC_Periph = RCC_APB2Periph_GPIOD;
|
||||
else if(ptr->GPIO_Rx == GPIOE)RCC_Periph = RCC_APB2Periph_GPIOE;
|
||||
|
||||
RCC_APB2PeriphClockCmd(RCC_Periph, ENABLE);
|
||||
GPIO_InitStructure.GPIO_Pin = ptr->GPIO_Rx;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_Init(ptr->GPIO_Rx, &GPIO_InitStructure);
|
||||
|
||||
|
||||
USART_InitStructure.USART_BaudRate = BaudRate;
|
||||
USART_InitStructure.USART_WordLength = WordLength;
|
||||
USART_InitStructure.USART_StopBits = StopBits;
|
||||
USART_InitStructure.USART_Parity = Parity;
|
||||
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
||||
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
|
||||
|
||||
USART_Init(ptr->USART, &USART_InitStructure);
|
||||
|
||||
/*打开接收中断*/
|
||||
USART_ITConfig(ptr->USART, USART_IT_RXNE, ENABLE);//读取数据
|
||||
|
||||
/*打开IDLE数据检测中断*/
|
||||
USART_ITConfig(ptr->USART, USART_IT_IDLE, ENABLE);//读取整包数据(读取fifo)
|
||||
|
||||
|
||||
|
||||
uint8_t NVIC_IRQChannel = USART1_IRQn;
|
||||
|
||||
if(ptr->USART == USART1)NVIC_IRQChannel = USART1_IRQn;
|
||||
else if(ptr->USART == USART2)NVIC_IRQChannel = USART2_IRQn;
|
||||
else if(ptr->USART == USART3)NVIC_IRQChannel = USART3_IRQn;
|
||||
else if(ptr->USART == UART4)NVIC_IRQChannel = UART4_IRQn;
|
||||
|
||||
|
||||
NVIC_InitStructure.NVIC_IRQChannel = NVIC_IRQChannel;
|
||||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
|
||||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
|
||||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||||
NVIC_Init(&NVIC_InitStructure);
|
||||
|
||||
USART_Cmd(ptr->USART, ENABLE);
|
||||
|
||||
}
|
||||
|
||||
size_t usart_read(UART_ptr ptr,unsigned char *buff,const unsigned int len)
|
||||
{
|
||||
size_t size = 0;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
size_t usart_write(UART_ptr ptr,const unsigned char *buff,const unsigned int len)
|
||||
{
|
||||
size_t size = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
USART_ITConfig(ptr->USART, USART_IT_TXE, ENABLE);//发送可以不开中断,只要传到dma即可
|
||||
return size;
|
||||
}
|
||||
|
||||
void UART_IRQHandler(UART_ptr ptr)
|
||||
{
|
||||
if (RESET != USART_GetITStatus(ptr->USART, USART_IT_RXNE))
|
||||
{
|
||||
|
||||
/* Read one byte from the receive data register */
|
||||
|
||||
ptr->buffer_rx[ptr->buffer_rx_head++] = (uint8_t)USART_ReceiveData(ptr->USART);
|
||||
//ptr->byt_rx++;
|
||||
|
||||
if (ptr->buffer_rx_head >= ptr->buffer_rx_len)
|
||||
{
|
||||
ptr->buffer_rx_head = 0;
|
||||
}
|
||||
|
||||
USART_ClearITPendingBit(ptr->USART, USART_IT_RXNE);
|
||||
}
|
||||
|
||||
if ((RESET != USART_GetITStatus(ptr->USART, USART_IT_IDLE)))
|
||||
{
|
||||
USART_ClearITPendingBit(ptr->USART, USART_IT_IDLE);
|
||||
USART_ReceiveData(ptr->USART);
|
||||
//发出一个可以读取FIFO的信号
|
||||
}
|
||||
|
||||
//发送中断时使用
|
||||
if (RESET != USART_GetITStatus(ptr->USART, USART_IT_TXE))
|
||||
{
|
||||
USART_ClearITPendingBit(ptr->USART, USART_IT_TXE);
|
||||
|
||||
/*打开发送中断*/
|
||||
USART_ITConfig(ptr->USART, USART_IT_TXE, DISABLE);//发送可以不开中断,只要传到dma即可
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void USART1_IRQHandler(void)
|
||||
{
|
||||
UART_IRQHandler(&uart1);
|
||||
}
|
||||
|
||||
void USART2_IRQHandler(void)
|
||||
{
|
||||
UART_IRQHandler(&uart2);
|
||||
}
|
||||
|
||||
void USART3_IRQHandler(void)
|
||||
{
|
||||
UART_IRQHandler(&uart3);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user