STM32之485通信(RS485串口编程)

news/2024/11/23 9:27:16/

目录

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复用为USART1GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);    //GPIOA10复用为USART1//USART1端口配置GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;     //GPIOA9,GPIOA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                //复用功能GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //速度50MHzGPIO_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;    // 波特率为:115200USART_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);      //使能串口1USART_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复用为USART2GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);     
//GPIOA3复用为USART2GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2 | GPIO_Pin_3;     //GPIOA2,GPIOA3GPIO_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;    // 波特率为:115200USART_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);   //使能串口2USART_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中断分组设置表:   

01110:40位抢占优先级,4位响应优先级
11101:31位抢占优先级,3位响应优先级
21012:22位抢占优先级,2位响应优先级
31003:13位抢占优先级,1位响应优先级
40114:04位抢占优先级,0位响应优先级


http://www.ppmy.cn/news/137272.html

相关文章

Python潮流周刊#4:Python 2023 语言峰会

△点击上方“Python猫”关注 ,回复“1”领取电子书 你好,我是猫哥。这里记录每周值得分享的 Python 及通用技术内容,本期是特别加更版,聚焦于 Python 官方 2023 年语言峰会的系列博客。 由于公众号不支持外链,文中大量…

Vagrant编排虚拟机安装与配置

1.安装VirtualBox与Vagrant VirtualBox与Vagrant是支持不通过操作系统的;根据具体操作系统下载对应版本即可。(这里使用windows操作系统搭建) VirtualBox https://www.virtualbox.org/wiki/Downloads Vagrant https://developer.hashicorp.com/vagrant/downloads Va…

设计模式之~状态模式

状态模式(State),当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是改变了其类。 能够让程序根据不同的外部情况来做出不同的响应,最直接的方法就是在程序中将这些 可能发生的外部情况全部考虑到&#xff…

一个注解的事儿,数据脱敏解决了

目录 什么是数据脱敏开整使用 Hutool 工具类实现数据掩码Hutool 信息脱敏工具类使用 Jackson 进行数据序列化脱敏 注解实现数据脱敏1、定义一个注解2、创建一个枚举类3、创建我们的自定义序列化类4、测试 项目 pom 文件 总结 本文主要分享什么是数据脱敏,如何优雅的…

修复电动牙刷

电动牙刷 飞利浦6750,服役三年多。 一天,突然不能正常工作,正常工作时间为两分钟,这下几秒就停。 拆开检查,电池处有水迹,存在跑电现象,用吹风机吹干,装回。 正常用了几天&#…

智能牙刷

资料整理: 一,牙刷震动方式 1.偏振式 2.回转式 二,电机种类 1.机械扭力式振荡电机 2.有刷旋转电机 3.有刷往复式振动电机 4.无刷往复式振电机 三,电路设计 主柄:蓝牙无线充电电机控制状态指示(LED、震动、…

飞利浦 27B1U7903 评测怎么样

这款显示器采用27英寸4K分辨率60Hz刷新率的MiniLED IPS屏,具有1300:1的对比度,而且通过DisplayHDR 1400认证,色域达到Adobe RGB 99.2%。 飞利浦 27B1U7903更多使用感受和评价:http://www.adiannao.cn/dy 此外,这款显示…

超声波五档电动牙刷方案

两个按键,4个指示灯,一个充电指示灯,3个档位指示灯。 三个档位,低速,高速、震动。每个档位工作30S停0.5秒,总共工作2分钟&#…