打印

STM32串口通讯完美收发变长字节程序

[复制链接]
379|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第三章|  楼主 | 2019-11-27 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口配置代码
__IO uint8_t RS485_RxBuffer[256];
__IO uint8_t RS485_RXCount=0;

void RS485Config(enum USARTxNumber RS485Number,uint32_t usrBaudRate)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;        
        NVIC_InitTypeDef NVIC_InitStructure;
        
        switch(RS485Number)
                {
                        case RS485_2:
                                RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能外设时钟      
                  
                                //使能串口2的发送和接收 和中断
                                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);                                   
                                // Enable the USART2 Interrupt   
                                NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;  
                                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
                                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        
                                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
                                NVIC_Init(&NVIC_InitStructure);  
                                /*
                                */
                          
                        //GPIO结构的成员设置如下:  
                        /*--------------485控制端初始化*/  
                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  
                            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
                              GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                            GPIO_Init(GPIOD, &GPIO_InitStructure);                          
                            GPIO_ResetBits(GPIOD, GPIO_Pin_11);                  
                                
                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;          //485_TX  
                        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出  
                        GPIO_Init(GPIOA, &GPIO_InitStructure);  
                  
                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;           //485_RX  
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入  
                        GPIO_Init(GPIOA, &GPIO_InitStructure);  
                  
                        //串口的结构成员设置如下:  
                        USART_InitStructure.USART_BaudRate = usrBaudRate;           
                        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_Tx | USART_Mode_Rx;  
                        USART_Init(USART2, &USART_InitStructure);  
                                /* Enable the USART Receive interrupt: this interrupt is generated when the  USART receive data register is not empty */

                                USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
                                USART_Cmd(USART2, ENABLE);// USART2 Enable
                  
                                break;
                        case RS485_3:
                                /* 使能 USART3 时钟*/
                                RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
                                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //使能外设时钟      
                                /*
                                //使能串口3的发送和接收中断
                                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                                   
                                //Enable the USART3 Interrupt  
                                NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;  
                                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
                                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        
                                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
                                NVIC_Init(&NVIC_InitStructure);  
                                */
                                 
                                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;  
                            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;               
                                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                            GPIO_Init(GPIOD, &GPIO_InitStructure);
                                GPIO_ResetBits(GPIOD, GPIO_Pin_12);  
                                 
                                /* USART3 使用IO端口配置 */   
                                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
                                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
                                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                                GPIO_Init(GPIOB, &GPIO_InitStructure);   
                                 
                                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
                                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
                                GPIO_Init(GPIOB, &GPIO_InitStructure);   //初始化GPIO
                                 
                                /* USART3 工作模式配置 */
                                USART_InitStructure.USART_BaudRate = usrBaudRate; //波特率设置
                                USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位数设置:8位
                                USART_InitStructure.USART_StopBits = USART_StopBits_1;  //停止位设置: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);  //初始化USART3
                                /* Enable the USART Receive interrupt: this interrupt is generated when the  USART receive data register is not empty */                                
                                //USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);  
                                USART_Cmd(USART3, ENABLE);// USART3 Enable
                                break;
                        case RS485_4:
                                RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4 ,ENABLE);
                                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
                            RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE);
                                /*
                                //Configure the NVIC Preemption Priority Bits
                                NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                                   
                                // Enable the UART4 Interrupt
                                NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;  
                                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
                                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        
                                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
                                NVIC_Init(&NVIC_InitStructure);  

                                */
                                
                            GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;        
                            GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
                            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                            GPIO_Init(GPIOD, &GPIO_InitStructure);
                                GPIO_ResetBits(GPIOD, GPIO_Pin_13);         

                                /* USART4 GPIO config */
                            /* Configure USART4 Tx (PC.10) as alternate function push-pull */
                                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
                                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                                  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                                  GPIO_Init(GPIOC, &GPIO_InitStructure);   
                                  /* Configure USART4 Rx (PC.11) as input floating */
                                  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
                                  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                                  GPIO_Init(GPIOC, &GPIO_InitStructure);
                                 
                                /* USART4 mode config */
                                USART_InitStructure.USART_BaudRate = usrBaudRate;
                                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);
                                
                                //USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
                            USART_Cmd(UART4, ENABLE);
                                break;
                }



数据接收中断代码:
#include "485Ctrl.h"

extern uint8_t RS485_RxBuffer[256];
extern uint8_t RS485_RXCount;

void USART2_IRQHandler(void)
{
        
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {
                USART_ClearITPendingBit(USART2, USART_IT_RXNE);
                RS485_RxBuffer[RS485_RXCount++]=USART_ReceiveData(USART2);
                USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
        }
        //如果为空闲总线中断
        if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)
        {
                USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);
                USART_ClearITPendingBit(USART2, USART_IT_IDLE);
                //处理接收到的数据代码略
                RS485_RXCount=0;
        }

}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

380

主题

380

帖子

0

粉丝