stm32f103c8t6hal库编写串口通信中断接收DMA发送
时间: 2023-10-05 10:08:13 浏览: 79
1. 配置串口
在使用串口通信前,需要对串口进行配置。配置包括波特率、数据位、停止位、奇偶校验位等等。以STM32F103C8T6为例,使用的是USART1,所以需要先打开USART1外设时钟,然后进行配置。以下是代码示例:
//打开USART1外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
//定义USART1相关参数
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位长度
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶校验位
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制
//初始化USART1
USART_Init(USART1, &USART_InitStructure);
//使能USART1
USART_Cmd(USART1, ENABLE);
2. 配置DMA
DMA是直接内存访问,可以在无需CPU干预的情况下进行数据传输。使用DMA可以提高数据传输效率,提高系统性能。在使用DMA前,需要打开DMA外设时钟,然后进行配置。以下是代码示例:
//打开DMA外设时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
//定义DMA相关参数
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR; //外设地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)TxBuffer; //存储器地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,外设到存储器
DMA_InitStructure.DMA_BufferSize = TxBufferSize; //数据传输量
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传输模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA传输优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //存储器到存储器传输禁止
//初始化DMA
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
3. 配置中断
在串口接收数据时,需要配置中断来处理接收到的数据。以USART1为例,需要打开USART1接收中断,然后在中断处理函数中读取接收到的数据。以下是代码示例:
//打开USART1接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//中断处理函数
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //判断是否接收到数据
{
RxBuffer[RxCounter++] = USART_ReceiveData(USART1); //读取接收到的数据
if(RxCounter == RxBufferSize) //接收到的数据量达到预设值,关闭接收中断
{
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
}
}
}
4. 发送数据
在发送数据时,需要使用DMA进行数据传输。以USART1为例,需要打开DMA发送通道,然后启动DMA传输。以下是代码示例:
//打开DMA发送通道
DMA_Cmd(DMA1_Channel4, ENABLE);
//启动DMA传输
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);