糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > STM32之485通信(RS485串口编程)

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

时间:2022-09-02 17:19:50

相关推荐

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

目录

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中断分组设置表:

如果觉得《STM32之485通信(RS485串口编程)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。