- u8 USART2_RX_BUF[USART2_REC_LEN]={0}; //接收缓冲,最大USART_REC_LEN个字节.
-
- u16 USART2_RX_STA=0; //接收状态标记
-
- u16 USART2_RX_CNT=0;
- //初始化IO 串口2 bound:波特率
- void RS422_Init(u32 bound)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
-
- //串口2引脚复用映射
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2复用为USART2
- GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3复用为USART2
-
- //USART2
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2与GPIOA3
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA2,PA3
-
- //PA4推挽输出,485模式控制
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //GPIOA4
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
- GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA4
-
- RS422_TX_EN=1; //初始化接收模式
-
- //USART2 初始化设置
- USART_InitStructure.USART_BaudRate = bound;//波特率设置
- 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); //初始化串口2
-
- USART_Cmd(USART2, ENABLE); //使能串口 2
- USART_ClearFlag(USART2, USART_FLAG_TC);//清除发送完成标志
- //USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接受中断
- USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启空闲,幁错,噪声,校验错中断
-
-
-
- //Usart2 NVIC 配置
- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3
- NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级3
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
- NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、
-
-
- USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE); //使能串口2的DMA发送
- USART_DMACmd(USART2,USART_DMAReq_Rx,ENABLE); //使能串口2的DMA接收
- }
-
- //串口2接收中断服务函数
- void USART2_IRQHandler(void)(接系统板)
- {
- //u8 rec_data;
- if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)//检测到空闲中断
- {
- DMA_Cmd(DMA1_Stream5,DISABLE);
- USART2_RX_STA=0x08;
- printf("zhoubofeng");
- USART2_RX_CNT=USART2->SR;//清除中断标志位
- USART2_RX_CNT=USART2->DR;
- USART2_RX_CNT=USART2_REC_LEN-DMA_GetCurrDataCounter(DMA1_Stream0); //收到的数据长度
- //memset(, 0, ); //清空接受区
- DMA1_Stream5->NDTR=USART2_REC_LEN;//重新装填
- DMA_Cmd(DMA1_Stream5,ENABLE); //接着传输
- }
- }
3.2 DMA1的配置
- void MYDMA_TXConfig(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
- {
-
- DMA_InitTypeDef DMA_InitStructure;
-
- if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
-
- }else
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
- }
- DMA_DeInit(DMA_Streamx);
-
- while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待DMA可配置
-
- /* 配置 DMA Stream */
- DMA_InitStructure.DMA_Channel = chx; //通道选择
- DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA外设地址
- DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式
- DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量
- 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_MemoryDataSize_Byte;//存储器数据长度:8位
- DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
- DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream
- DMA_Cmd(DMA_Streamx,ENABLE);
-
- }
- //开启一次DMA传输
- //DMA_Streamx:DMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
- //ndtr:数据传输量
- void MYDMA_Enable(DMA_Stream_TypeDef *DMA_Streamx,u16 ndtr)
- {
-
- DMA_Cmd(DMA_Streamx, DISABLE); //关闭DMA传输
-
- while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){} //确保DMA可以被设置
-
- DMA_SetCurrDataCounter(DMA_Streamx,ndtr); //数据传输量
-
- DMA_Cmd(DMA_Streamx, ENABLE); //开启DMA传输
- }
-
- //DMAx的各通道配置
- //这里的传输形式是固定的,这点要根据不同的情况来修改
- //外设到存储器模式/8位数据宽度/存储器增量模式
- //DMA_Streamx:DMA数据流,DMA1_Stream0~7/DMA2_Stream0~7
- //chx:DMA通道选择,[url=home.php?mod=space&uid=144993]@ref[/url] DMA_channel DMA_Channel_0~DMA_Channel_7
- //par:外设地址
- //mar:存储器地址
- //ndtr:数据传输量
- void MYDMA_RXConfigPtoM(DMA_Stream_TypeDef *DMA_Streamx,u32 chx,u32 par,u32 mar,u16 ndtr)
- {
- DMA_InitTypeDef DMA_InitStructure;
-
- if((u32)DMA_Streamx>(u32)DMA2)//得到当前stream是属于DMA2还是DMA1
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);//DMA2时钟使能
-
- }else
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1时钟使能
- }
- DMA_DeInit(DMA_Streamx);
-
- while (DMA_GetCmdStatus(DMA_Streamx) != DISABLE){}//等待DMA可配置
-
- /* 配置 DMA Stream */
- DMA_InitStructure.DMA_Channel = chx; //通道选择
- DMA_InitStructure.DMA_PeripheralBaseAddr = par;//DMA外设地址
- DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//外设到存储器模式
- DMA_InitStructure.DMA_BufferSize = ndtr;//数据传输量
- 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_MemoryDataSize_Byte;//存储器数据长度:8位
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// 使用循环模式
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;//高等优先级
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
- DMA_Init(DMA_Streamx, &DMA_InitStructure);//初始化DMA Stream
-
- DMA_Cmd(DMA_Streamx,ENABLE);
-
- }