IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32之485通信(RS485串口编程) -> 正文阅读

[嵌入式]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复用为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中断分组设置表:? ?

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:12:15  更:2022-09-24 21:14:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:17:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码