STM32串口485通信编程实战

目录

1.编程思路

2.代码   

USART串口的库函数:

   USART_:

      AIRCR中断分组设置表:   


1.编程思路

        通过485通信来实现MCU之间的通信,把接收到的数据通过串口助手显示在pc端。第一是对usart1,usart2进行初始化,Usart1负责与串口助手通信,Usart2,485负责进行MCU通信。第二是实现发送接收,接收在Ustart2中去实现。第三是把数据信息在PC端显示。

2.代码   

1)初始化  
void Uart1_Init(void)	
{
    //USART1 初始化
    GPIO_InitTypeDef GPIO_InitStructure;	//声明一个结构体,定义了一个GPIO_InitTypeDef类型的变量,名为GPIO_InitStructure。
    USART_InitTypeDef USART_InitStructure;	//USART_Init函数的功能是初始化异步串口,包括选定使用的串口,设定串口的数据传输速率、数据位数、检验方式、停止位、流量控制方式等,是串口最重要的库函数。
    NVIC_InitTypeDef NVIC_InitStructure;	//中断优先级

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);        //开启GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);       //开启USART1时钟

    //串口1对应引脚复用映射
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);     //GPIOA9复用为USART1
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);    //GPIOA10复用为USART1

    //USART1端口配置
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;     //GPIOA9,GPIOA10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                //复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //速度50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;              //推挽复用输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                //上拉
    GPIO_Init(GPIOA,&GPIO_InitStructure);                       //初始化PA9,PA10

    //USART1 端口配置
    USART_InitStructure.USART_BaudRate= 115200;    // 波特率为:115200
    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(USART1, &USART_InitStructure); 

    USART_Cmd(USART1, ENABLE);      //使能串口1

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);     //开启相关中断

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;	    //串口 1 中断       
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;     // 抢占优先级为3(抢断)
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		    //子优先级为3(响应)     
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	    //IRQ通道使能 
    NVIC_Init(&NVIC_InitStructure);	    //根据上面指定的参数初始化NVIC寄存器                         
}

void Uart2_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;	//声明一个结构体,定义了一个GPIO_InitTypeDef类型的变量,名为GPIO_InitStructure。
    USART_InitTypeDef USART_InitStructure;    //USART_Init函数的功能是初始化异步串口,包括选定使用的串口,设定串口的数据传输速率、数据位数、检验方式、停止位、流量控制方式等,是串口最重要的库函数。
    NVIC_InitTypeDef NVIC_InitStructure;    //中断优先级

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);      //开启GPIOA时钟      
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);        //开启USART1时钟    

     //串口2对应引脚复用映射
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);       //GPIOA2复用为USART2
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);     
//GPIOA3复用为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_50MHz;        //速度50MHz           
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;           //推挽复用输出              
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;             //上拉              
    GPIO_Init(GPIOA,&GPIO_InitStructure);                    //初始化PA2,PA3                    

    //USART2 端口配置
    USART_InitStructure.USART_BaudRate = 115200;    // 波特率为:115200
    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(USART2, &USART_InitStructure); 

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

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);  //开启相关中断    

    //Usart2 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;   //串口 2 中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;    // 抢占优先级为3(抢断)
    NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;    //子优先级为2(响应) 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;    //IRQ通道使能     
    NVIC_Init(&NVIC_InitStructure);     //根据上面指定的参数初始化NVIC寄存器  


接收数据
void USART2_IRQHandler(void)
{
    static u32 rx_i=0;		//32位,初始化
   if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收数据寄存器不为空的中断(接收到的数据必须是0x0d 0x0a结尾)
   {     
        USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除标志位
        rx_buf[rx_i++] = USART_ReceiveData(USART2);    //rx_buf是在main.c定义的全局变量
        while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); //发送数据寄存器空标志位
   }
   rx_flag = 1;//
}

USART串口的库函数:

        USART_Init函数:初始化所使用的串口外设

        USART_Cmd函数:使能或者失能USART外设

         USART_ITConfig函数:使能或者失能指定的USART中断

        USART_SendData函数:通过外设USARTx发送单个数据

        USART_ReceiveData函数:返回USARTx最近解释接收到的数据

         USART_GetFlagStatus函数:检查指定的USART标志位设置与否

         USART_ClearFlag函数:清楚USARTx的待处理标志位

         USART_GetITStatus函数:检查指定的USART中断发生与否

   USART_:

                USART_BaudRate:波特率,视具体设备而定

                USART_WordLength:字长

                USART_StopBits:停止位

                USART_Parity:校验方式

                USART_HardwareFlowControl:硬件流控制

                USART_Mode:单/双工

                USART_WordLength提示了在一个帧中传输或者接收到的数据位数;

                USART_WordLength_8b;8位数据

                USART_WordLength_9b;9位数据

                USART_StopBits定义了发送的停止位数目;

                USART_StopBits_1 在帧结尾传输1个停止位

                USART_StopBits_0.5 在帧结尾传输0.5个停止位

                USART_StopBits_2 在帧结尾传输2个停止位

                USART_StopBits_1.5 在帧结尾传输1.5个停止位

                USART_Parity定义了奇偶模式

                USART_Parity_No 奇偶失能

                USART_Parity_Even 偶模式

                USART_Parity_Odd 奇模式

                USART_HardwareFlowControl指定了硬件流控制模式使能还是失能

                USART_HardwareFlowControl_None 硬件流控制失能

                USART_HardwareFlowControl_RTS 发送请求RTS使能

                USART_HardwareFlowControl_CTS 清除发送CTS使能

                USART_HardwareFlowControl_RTS_CTS RTS和CTS使能

                USART_Mode指定了使能或者失能发送和接收模式

                USART_Mode_Tx 发送使能

                USART_Mode_Rx 接收使能

                USART_FLAG_CTS CTS标志位

                USART_FLAG_LBD LIN中断检测标志位

                USART_FLAG_TXE  发送数据寄存器空标志位

                USART_FLAG_TC  发送完成标志位

                USART_FLAG_RXNE 接收数据寄存器非空标志位

                USART_FLAG_IDLE 空闲总线标志位

                USART_FLAG_ORE 溢出错误标志位

                USART_FLAG_NE 噪声错误标志位

                USART_FLAG_FE 帧错误标志位

                USART_FLAG_PE 奇偶错误标志位

                USART_IT_PE 奇偶错误判断

                USART_IT_TXE 发送中断

                USART_IT_TC  发送完成中断

                USART_IT_RXNE  接收中断

                USART_IT_IDLE  空闲总线中断

                USART_IT_LBD  LIN中断探测中断

                USART_IT_CTS  CTS中断

                USART_IT_ORE  溢出错误中断

                USART_IT_NE  噪声错误中断

                USART_IT_FE  帧错误中断

      AIRCR中断分组设置表:   

0 111 0:4 0位抢占优先级,4位响应优先级
1 110 1:3 1位抢占优先级,3位响应优先级
2 101 2:2 2位抢占优先级,2位响应优先级
3 100 3:1 3位抢占优先级,1位响应优先级
4 011 4:0 4位抢占优先级,0位响应优先级
物联沃分享整理
物联沃-IOTWORD物联网 » STM32串口485通信编程实战

发表评论