您好,欢迎来到刀刀网。
搜索
您的当前位置:首页STM32F103多个串口配置DMA程序(纯代码版详解)

STM32F103多个串口配置DMA程序(纯代码版详解)

来源:刀刀网
实用文档

软件:KeilMDK

芯片:STM32F103/STM32F107 串口数量:4

备注:4个串口均配置为DMA读取

//串口1初始化函数

void uart1_init(u32 bound) {

//GPIO端口设置

GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

USART_DeInit(USART1); //复位串口1 //USART1_TX PA.9

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9

//USART1_RX PA.10

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10

//Usart1 NVIC 配置

NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//抢占优先级3

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

/*Enable DMA Channel4 Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

实用文档

NVIC_Init(&NVIC_InitStructure);

/*Enable DMA Channel5 Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

//USART 参数初始化设置

USART_InitStructure.USART_BaudRate = bound;//一般设置为9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

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_Rx | USART_Mode_Tx; //收发模式

USART_Init(USART1, &USART_InitStructure); //初始化串口

// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断 USART_ITConfig(USART1, USART_IT_IDLE , ENABLE); //开启空闲中断 USART_Cmd(USART1, ENABLE); //使能串口 }

//串口2初始化函数

void uart2_init(u32 bound) {

GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽

实用文档

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2 RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位

USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度

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_Rx | USART_Mode_Tx;//收发模式

USART_Init(USART2, &USART_InitStructure); ; //初始化串口

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级2级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级2级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

//////////////////////Enable DMA Channel7 Interrupt //////////////////////////////

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

/*Enable DMA Channel6 Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

实用文档

// USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断 USART_ITConfig(USART2, USART_IT_IDLE , ENABLE); //开启空闲中断

USART_Cmd(USART2, ENABLE); //使能串口 }

//串口3初始化函数

void uart3_init(u32 bound) {

//GPIO端口设置

GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //使能USART3时钟

USART_DeInit(USART3); //复位串口3 //USART1_TX PB.10

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB.11

//USART1_RX PB.11

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB

//USART 初始化设置

//#ifdef EN_USART3_RX //如果使能了接收

USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

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_Rx | USART_Mode_Tx; //收发模式

USART_Init(USART3, &USART_InitStructure); //初始化串口 //Usart1 NVIC 配置

实用文档

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

///////////////////// /*Enable DMA Channel2 Interrupt */ /////////////////

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /*Enable DMA Channel3 Interrupt */

NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

// USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断 USART_ITConfig(USART3, USART_IT_IDLE , ENABLE); //开启空闲中断 USART_Cmd(USART3, ENABLE); //使能串口 }

//串口4初始化函数

void uart4_init(u32 bound) {

GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;

DMA_InitTypeDef DMA_InitStructure; //定义DMA初始化结构体DMA_InitStructure

// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //选择NVIC优先级分组0 RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); // 打开串口外设的时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);

实用文档

//串口4所使用管脚输出输入定义

//定义UART4 Tx (PC.10)脚为复用推挽输出

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //IO口的第2脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //IO口复用推挽输出

GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化串口1输出IO口

//定义 UART4 Rx (PC.11)为悬空输入

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //IO口的第3脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//IO口悬空输入

GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化串口1输入IO口

//串口4参数初始化定义部分,串口1参数为9600 , 8 ,1 ,N 接收中断方式 USART_InitStructure.USART_BaudRate = bound; //设定传输速率 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_Rx | USART_Mode_Tx; //使用接收和发送功能

USART_Init(UART4, &USART_InitStructure); //初始化串口4

USART_ITConfig(UART4, USART_IT_IDLE,ENABLE); //使能串口4接收中断 USART_Cmd(UART4, ENABLE); //使能串口4 USART_ClearFlag(UART4, USART_FLAG_TC); // 清标志(后增加)

DMA_DeInit(DMA2_Channel3); //重置DMA 2通道配置

DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004C04; //外设地址

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART4_RECEIVE_DATA; //存地址

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //外设作为数据目的地 DMA_InitStructure.DMA_BufferSize = 512; //DMA缓存大小:BufferSize

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不递增

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //存地址寄存器递增

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据宽度为8位

DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; //存数据宽度为8位

实用文档

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //工作在正常缓存模式

DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //设置DMA通道优先级为高

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //禁止DMA通道设置为存至存传输

DMA_Init(DMA2_Channel3, &DMA_InitStructure); //初始化

DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA2_Channel3, DMA_IT_TE, ENABLE);

USART_DMACmd(UART4, USART_DMAReq_Rx, ENABLE); DMA_Cmd(DMA2_Channel3, ENABLE); //使能串口4中断

NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(UART4, ENABLE); }

//DMA的配置

void DMA_Configuration(void) {

DMA_InitTypeDef DMA_InitStructure; /* DMA clock enable */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//DMA1 ////////////////////////串口1 dma配////////////////////////////////////////////// /* DMA1 Channel4 (串口1 TX) Config */ DMA_DeInit(DMA1_Channel4);

DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_SEND_DATA; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 512;

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_Mode_Circular DMA_Mode_Normal

DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE); /* Enable USART1 DMA TX request */

USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); DMA_Cmd(DMA1_Channel4, DISABLE); //使能

/* DMA1 Channel5 (串口1 RX) Config */ DMA_DeInit(DMA1_Channel5);

DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40013804;

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART1_RECEIVE_DATA; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 512;

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工作模 DMA_Mode_Circular DMA_Mode_Normal

DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel5, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, ENABLE); /* Enable USART1 DMA RX request */

USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); DMA_Cmd(DMA1_Channel5, ENABLE); //使能

////////////////////串口2 dma配置//////////////////////////////// /* DMA1 Channel7 (串口2 TX) Config */ DMA_DeInit(DMA1_Channel7);

DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_SEND_DATA; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 512;

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_Mode_Circular DMA_Mode_Normal

DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel7, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel7, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Channel7, DMA_IT_TE, ENABLE); /* Enable USART1 DMA TX request */

USART_DMACmd(USART2, USART_DMAReq_Tx, ENABLE); DMA_Cmd(DMA1_Channel7, DISABLE); //使能

/* DMA1 Channel6 (串口2 RX) Config */ DMA_DeInit(DMA1_Channel6);

DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004404;

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART2_RECEIVE_DATA; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 512;

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工作模式 DMA_Mode_Circular DMA_Mode_Normal

DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel6, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel6, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Channel6, DMA_IT_TE, ENABLE); /* Enable USART2 DMA RX request */

USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE); DMA_Cmd(DMA1_Channel6, ENABLE); //使能

////////////////////串口3 dma配置//////////////////////////////// /* DMA1 Channel2 (串口3 TX) Config */ DMA_DeInit(DMA1_Channel2);

DMA_InitStructure.DMA_PeripheralBaseAddr =0x40004804;

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART3_SEND_DATA; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = 512;

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_Mode_Circular DMA_Mode_Normal

DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel2, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel2, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Channel2, DMA_IT_TE, ENABLE); /* Enable USART1 DMA TX request */

USART_DMACmd(USART3, USART_DMAReq_Tx, ENABLE); DMA_Cmd(DMA1_Channel2, DISABLE); //使能

/* DMA1 Channel3 (串口3 RX) Config */ DMA_DeInit(DMA1_Channel3);

DMA_InitStructure.DMA_PeripheralBaseAddr = 0x40004804;

DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)USART3_RECEIVE_DATA; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 512;

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工作模式 DMA_Mode_Circular DMA_Mode_Normal

DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel3, &DMA_InitStructure); DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE); DMA_ITConfig(DMA1_Channel3, DMA_IT_TE, ENABLE); /* Enable USART2 DMA RX request */

USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE); DMA_Cmd(DMA1_Channel3, ENABLE); //使能 }

//////////////////使用DMA发数据中断服务程序//////////////////////// void DMA1_Channel4_IRQHandler(void) {

DMA_ClearITPendingBit(DMA1_IT_TC4); DMA_ClearITPendingBit(DMA1_IT_TE4);

DMA_Cmd(DMA1_Channel4, DISABLE);//关闭DMA USART1_TX_Finish=1;//置DMA传输完成

// UART_CTL_R;//JIANGYU 新加 发完变为接收 }

void DMA1_Channel5_IRQHandler(void) {

DMA_ClearITPendingBit(DMA1_IT_TC5);

实用文档

DMA_ClearITPendingBit(DMA1_IT_TE5);

DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据 DMA1_Channel5->CNDTR = 580;//重装填

DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA }

//2012-7-13add(e)

//2012-7-13add(s)

//USART2使用DMA发数据中断服务程序 void DMA1_Channel7_IRQHandler(void) {

DMA_ClearITPendingBit(DMA1_IT_TC7); DMA_ClearITPendingBit(DMA1_IT_TE7);

DMA_Cmd(DMA1_Channel7, DISABLE);//关闭DMA USART2_TX_Finish=1;//置DMA传输完成 }

void DMA1_Channel6_IRQHandler(void) {

DMA_ClearITPendingBit(DMA1_IT_TC6); DMA_ClearITPendingBit(DMA1_IT_TE6);

DMA_Cmd(DMA1_Channel6, DISABLE);//关闭DMA,防止处理其间有数据 DMA1_Channel6->CNDTR = 580;//重装填

DMA_Cmd(DMA1_Channel6, ENABLE);//处理完,重开DMA }

void DMA2_Channel3_IRQHandler(void) {

DMA_ClearITPendingBit(DMA2_IT_TC3); DMA_ClearITPendingBit(DMA2_IT_TE3);

DMA_Cmd(DMA2_Channel3, DISABLE);//关闭DMA,防止处理其间有数据 DMA2_Channel3->CNDTR = 580;//重装填

DMA_Cmd(DMA2_Channel3, ENABLE);//处理完,重开DMA }

//USART3使用DMA发数据中断服务程序 void DMA1_Channel2_IRQHandler(void) {

DMA_ClearITPendingBit(DMA1_IT_TC2); DMA_ClearITPendingBit(DMA1_IT_TE2);

DMA_Cmd(DMA1_Channel2, DISABLE);//关闭DMA USART3_TX_Finish=1;//置DMA传输完成 }

void DMA1_Channel3_IRQHandler(void) {

实用文档

DMA_ClearITPendingBit(DMA1_IT_TC3); DMA_ClearITPendingBit(DMA1_IT_TE3);

DMA_Cmd(DMA1_Channel3, DISABLE);//关闭DMA,防止处理其间有数据 DMA1_Channel3->CNDTR = 580;//重装填

DMA_Cmd(DMA1_Channel3, ENABLE);//处理完,重开DMA }

//串口1中断服务函数

void USART1_IRQHandler(void) //串口1中断服务程序 {

unsigned char i = 0,Clear = Clear; unsigned int wCrcCal; u16 DATA_LEN;

if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) {

DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据 USART_ReceiveData(USART1);//读取数据 注意:这句必须要,否则不能够清除中断标志位。

DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel5);

if(DATA_LEN > 0) {

while(USART1_TX_Finish==0) {

; }

if(USART1_RECEIVE_DATA[0] == 0x01) {

switch(USART1_RECEIVE_DATA[1]) {

case 0x02:

wCrcCal = CRC16(USART1_RECEIVE_DATA, 6);/////2字节通讯与触摸屏 //LABVIEW读取DC模块相关信息和1位UPS是否断电位

实用文档

g_SaveSwBuf数组jiangyu 20180928

if((USART1_RECEIVE_DATA[6] == (wCrcCal%256))&&(USART1_RECEIVE_DATA[7] == (wCrcCal/256))) {

// UART_CTL_T; //JIANGYU 新加

USART1_SEND_DATA[0] = 0x01; USART1_SEND_DATA[1] = 0X02; USART1_SEND_DATA[2] = USART1_RECEIVE_DATA[5]/8;

memcpy(USART1_SEND_DATA+3,g_SaveSwBuf, USART1_SEND_DATA[2]);

wCrcCal = CRC16(USART1_SEND_DATA, USART1_SEND_DATA[2]+3);

memcpy(USART1_SEND_DATA+USART1_SEND_DATA[2]+3, &wCrcCal, 2);

DMA_Cmd(DMA1_Channel4, DISABLE); //改变datasize前先要禁止通道工作

DMA1_Channel4->CNDTR = USART1_SEND_DATA[2]+5;

// DMA1_Channel4->CNDTR=DATA_LEN; //DMA1,传输数据量

USART1_TX_Finish=0;//DMA传输开始标志量

DMA_Cmd(DMA1_Channel4, ENABLE);

}//for(i=0;i<60;i++)USART1_SEND_DATA[i] = 0;

break;

case 0x03: //LABVIEW读BMS的相关数据 wCrcCal = CRC16(USART1_RECEIVE_DATA, 6); if((USART1_RECEIVE_DATA[6] == (wCrcCal%256))&&(USART1_RECEIVE_DATA[7] == (wCrcCal/256))) {

// UART_CTL_T; //JIANGYU 新加 USART1_SEND_DATA[0] = 0x01; USART1_SEND_DATA[1] = 0x03; USART1_SEND_DATA[2] = 0x02;

if(RS485TouchScreeDataAnalyse(USART1_RECEIVE_DATA,USART1_SEND_DATA,g_DataSendBuf) == 1)//////如果读取多个数据 则标志位 为 2 地址只能从00 00 开始

实用文档

{

USART1_SEND_DATA[0]= 0x01;

USART1_SEND_DATA[1]= 0x03;

USART1_SEND_DATA[2]= USART1_RECEIVE_DATA[5]*2;

memcpy(USART1_SEND_DATA+3,g_BmsSaveBuf,USART1_SEND_DATA[2]); wCrcCal = CRC16(USART1_SEND_DATA, USART1_SEND_DATA[2]+3);

memcpy(USART1_SEND_DATA+USART1_SEND_DATA[2]+3, &wCrcCal, 2);

DMA_Cmd(DMA1_Channel4, DISABLE); //改变datasize前先要禁止通道工作

DMA1_Channel4->CNDTR = USART1_SEND_DATA[2]+5;

USART1_TX_Finish=0;//DMA传输开始标志量

DMA_Cmd(DMA1_Channel4, ENABLE);

}

if(RS485TouchScreeDataAnalyse(USART1_RECEIVE_DATA,USART1_SEND_DATA,g_DataSendBuf) == 2)//////如果读取多个数据 则标志位 为 2 地址只能从00 00 开始 {

USART1_SEND_DATA[0]= 0x01;

USART1_SEND_DATA[1]= 0x03;

USART1_SEND_DATA[2]= USART1_RECEIVE_DATA[5]*2;

memcpy(USART1_SEND_DATA+3,g_DataSendBuf,USART1_SEND_DATA[2]); wCrcCal = CRC16(USART1_SEND_DATA, USART1_SEND_DATA[2]+3);

memcpy(USART1_SEND_DATA+USART1_SEND_DATA[2]+3, &wCrcCal, 2);

DMA_Cmd(DMA1_Channel4, DISABLE); //改变datasize前先要禁止通道工作

DMA1_Channel4->CNDTR = USART1_SEND_DATA[2]+5;

实用文档

USART1_TX_Finish=0;//DMA传输开始标志量

DMA_Cmd(DMA1_Channel4, ENABLE);

} }

break;

///////运行模式 自动 00 01 手动 00 02 手动放电 00 04 手动停止 00 08

case 0x06: //LABVIEW发来的相关控制信息 jiangyu 20180928

wCrcCal = CRC16(USART1_RECEIVE_DATA, 6); if((USART1_RECEIVE_DATA[6] == (wCrcCal%256))&&(USART1_RECEIVE_DATA[7] == (wCrcCal/256))) {

}

break; } }

for(i = 0;i<60;i++) {

USART1_RECEIVE_DATA[i] = 0; //USART1_SEND_DATA[i] = 0; }

for(i=0;i//USART1_SEND_DATA[i]=USART1_RECEIVE_DATA[i]; }

//USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。

//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据

DMA_ClearFlag(DMA1_FLAG_GL5 | DMA1_FLAG_TC5 | DMA1_FLAG_TE5 | DMA1_FLAG_HT5);//清标志

DMA1_Channel5->CNDTR = 512;//重装填

DMA_Cmd(DMA1_Channel5, ENABLE);//处理完,重开DMA //读SR后读DR清除Idle i = USART1->SR; i = USART1->DR;

// for(i=0;i<60;i++)USART1_SEND_DATA[i] = 0; }

if(USART_GetITStatus(USART1, USART_IT_PE | USART_IT_FE |

实用文档

USART_IT_NE) != RESET)//出错 {

USART_ClearITPendingBit(USART1, USART_IT_PE | USART_IT_FE | USART_IT_NE); }

//USART_ClearITPendingBit(USART1, USART_IT_TC);

USART_ClearITPendingBit(USART1, USART_IT_IDLE); }

//for(i=0;i<60;i++)USART1_SEND_DATA[i] = 0; }

//串口2中断服务函数

void USART2_IRQHandler(void) {

unsigned int wCrcCal; unsigned char nSum; u16 DATA_LEN; u16 i;

if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) {

DMA_Cmd(DMA1_Channel6, DISABLE);//关闭DMA,防止处理其间有数据 //USART_RX_STA = USART1->SR;//先读SR,然后读DR才能清除 //USART_RX_STA = USART1->DR;

DATA_LEN=512-DMA_GetCurrDataCounter(DMA1_Channel6); if(DATA_LEN > 0) {

LED1_TOGGLE;/// LED2 闪烁 工作指示灯 while(USART2_TX_Finish==0) {

; }

//将数据送DMA存储地址

for(i=0;i//USART2_SEND_DATA[i]=USART2_RECEIVE_DATA[i]; }

实用文档

for(i = 0;i<30;i++) {

USART2_RECEIVE_DATA[i] = 0; }

//USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。

}

//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据 DMA_ClearFlag(DMA1_FLAG_GL6 | DMA1_FLAG_TC6 | DMA1_FLAG_TE6 | DMA1_FLAG_HT6);//清标志

DMA1_Channel6->CNDTR = 512;//重装填

DMA_Cmd(DMA1_Channel6, ENABLE);//处理完,重开DMA //读SR后读DR清除Idle i = USART2->SR; i = USART2->DR; }

if(USART_GetITStatus(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错 {

USART_ClearITPendingBit(USART2, USART_IT_PE | USART_IT_FE | USART_IT_NE); }

USART_ClearITPendingBit(USART2, USART_IT_IDLE); }

//串口4中断服务函数

void UART4_IRQHandler(void) {

unsigned int wCrcCal; unsigned char nSum; u16 DATA_LEN; u16 i;

if(USART_GetITStatus(UART4, USART_IT_IDLE) != RESET) {

DMA_Cmd(DMA2_Channel3, DISABLE);//关闭DMA,防止处理其间有数据 //USART_RX_STA = USART1->SR;//先读SR,然后读DR才能清除 //USART_RX_STA = USART1->DR;

DATA_LEN=512-DMA_GetCurrDataCounter(DMA2_Channel3); if(DATA_LEN > 0) {

GPIO_ResetBits(GPIOE,GPIO_Pin_4);//接收时LED3亮;

while(USART4_TX_Finish==0)

实用文档

{

; }

//将数据送DMA存储地址

for(i=0;i//USART2_SEND_DATA[i]=USART2_RECEIVE_DATA[i]; }

for(i = 0;i<30;i++) {

USART4_RECEIVE_DATA[i] = 0; }

//USART用DMA传输替代查询方式发送,克服被高优先级中断而产生丢帧现象。

}

//DMA_Cmd(DMA1_Channel5, DISABLE);//关闭DMA,防止处理其间有数据 DMA_ClearFlag(DMA2_FLAG_GL3 | DMA2_FLAG_TC3 | DMA2_FLAG_TE3 | DMA2_FLAG_HT3);//清标志

DMA2_Channel3->CNDTR = 512;//重装填

DMA_Cmd(DMA2_Channel3, ENABLE);//处理完,重开DMA //读SR后读DR清除Idle i = UART4->SR; i = UART4->DR; }

if(USART_GetITStatus(UART4, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错 {

USART_ClearITPendingBit(UART4, USART_IT_PE | USART_IT_FE | USART_IT_NE); }

USART_ClearITPendingBit(UART4, USART_IT_IDLE); }

//串口3中断服务函数 解析部分需要自己的协议解析

void USART3_IRQHandler(void) //串口3中断服务程序 {

u16 DATA_LEN;

unsigned char i = 0; unsigned int wCrcCal;

if(USART_GetITStatus(USART3, USART_IT_IDLE) != RESET) {

DMA_Cmd(DMA1_Channel3, DISABLE);//关闭DMA,防止处理其间有数据 USART_ReceiveData(USART3);

实用文档

DATA_LEN = 512-DMA_GetCurrDataCounter(DMA1_Channel3);

if(DATA_LEN > 0) {

while(USART3_TX_Finish==0) {

} if(USART3_RECEIVE_DATA[0] == MainBoardId) {

switch(USART3_RECEIVE_DATA[1]) {

case 0x02:

break; case 0x06:

break; } }

//将数据送DMA存储地址 for(i=0;i<60;i++) {

USART3_RECEIVE_DATA[i] = 0;

}

DMA_ClearFlag(DMA1_FLAG_GL3 | DMA1_FLAG_TC3 | DMA1_FLAG_TE3 | DMA1_FLAG_HT3);//清标志

DMA1_Channel3->CNDTR = 512;//重装填

DMA_Cmd(DMA1_Channel3, ENABLE);//处理完,重开DMA //读SR后读DR清除Idle i = USART3->SR; i = USART3->DR; }

if(USART_GetITStatus(USART3, USART_IT_PE | USART_IT_FE | USART_IT_NE) != RESET)//出错 {

USART_ClearITPendingBit(USART3, USART_IT_PE | USART_IT_FE | USART_IT_NE); }

USART_ClearITPendingBit(USART3, USART_IT_IDLE); } }

实用文档

需要定义变量

u8 USART1_SEND_DATA[512]; u8 USART2_SEND_DATA[512]; u8 USART1_RECEIVE_DATA[512]; u8 USART2_RECEIVE_DATA[512]; u8 USART3_SEND_DATA[512]; u8 USART3_RECEIVE_DATA[512]; u8 USART4_RECEIVE_DATA[512]; u8 USART1_TX_Finish; u8 USART2_TX_Finish; u8 USART3_TX_Finish; u8 USART4_TX_Finish;

//Main函数加载调用初始化函数

uart1_init(115200); //串口初始化为115200 uart2_init(9600); //串口初始化为9600 //

uart3_init(115200);////通过串口波特率波特率115200 uart4_init(9600);

DMA_Configuration();//DMA的配置 串口1 和 串口2 DMA 串口3 DMA

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务