目标:
实现串口通过DMA收发,不使用串口中断及DMA中断,使用1ms中断来判断是否发送结束或启动发送。
初始化,使用usart1:
1、UART_HandleTypeDef huart1;
typedef struct
{
UINT16 wRxdRdPtr;
UINT16 wRxdWrPtr;
UINT16 wTxdRdPtr;
UINT16 wTxdWrPtr;
BYTE byRxdBuff[2048];
BYTE byTxdBuff[2048];
UART_HandleTypeDef *phandle;
UINT32 dwRamScan2;
}tagCOMM;
tagCOMM g_tUart[1];
int uart0wRxdWrPtr;
int uart0delay=0;
int uart0rxdflag=0;
int uart0txdflag=0;
TIM_HandleTypeDef htim10;
int HY_USART1_UART_Init(int bps,int cs,int databits,int stopbits)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = bps;
huart1.Init.WordLength = databits;
huart1.Init.StopBits = stopbits;
huart1.Init.Parity = cs;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
return -1;
}
/* USER CODE BEGIN USART1_Init 2 */
g_tUart[0].phandle = &huart1;
return 0;
}
void MYDMA_Config(void)
{
//Tx DMA配置
//数据流选择
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
UARTDMATX_HD.Instance = DMA2_Stream7;
//通道选择
UARTDMATX_HD.Init.Channel = DMA_CHANNEL_4;
//存储器到外设
UARTDMATX_HD.Init.Direction = DMA_MEMORY_TO_PERIPH;
//外设非增量模式,UART只有一个DR寄存器,地址不能变化
UARTDMATX_HD.Init.PeriphInc = DMA_PINC_DISABLE;
//存储器增量模式
UARTDMATX_HD.Init.MemInc = DMA_MINC_ENABLE;
//外设数据长度:8位一个字节
UARTDMATX_HD.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
//存储器数据长度:8位
UARTDMATX_HD.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE

本文介绍了如何利用DMA技术实现串口数据的无中断传输,包括USART1初始化配置、DMA配置、定时中断处理以及发送和接收函数。通过1ms中断监控发送状态并控制DMA,避免了使用串口中断和DMA中断。
最低0.47元/天 解锁文章
1671

被折叠的 条评论
为什么被折叠?



