stm32---RS485初始化

2023-05-16


u8 RS485_RX_BUF[64];   //接收缓冲,最大64个字节.
u8 RS485_RX_CNT=0;      //接收到的数据长度   

/*
函数:RS485_Init
功能:串口初始化配置
参数:Baud:波特率
备注:GPIO/USART/NVIC初始化,开启串口中断,使能串口中断(中断处理函数)
步骤:
   1---GPIO/USART1/NVIC初始化结构体定义
   2---开启串口USART,GPIO端口时钟
   3---复位串口
   4---USART2_TX/USART2_RX  串口接受/发送端口配置寄存器结构体参数配置
   5---NVIC 中断控制器配置
   6---USART2 初始化设置
   7---开启中断
   8---使能中断
*/ 
void RS485_Init(u32 bound)
{   
    //GPIO/USART1/NVIC初始化结构体
 
    GPIO_InitTypeDef GPIO_InitStructure;
   USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
 
   //开启串口USART,GPIO端口时钟
 
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE);     //使能GPIOA,G时钟
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);                //使能USART2时钟
  
  //串口发送/接受/控制端口配置寄存器结构体参数配置 
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                       //PG9端口配置
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
 
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                      //PA2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                   //复用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure);
  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;                      //PA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); 
 
   //复位串口
 
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);                //复位串口2
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);               //停止复位
  
  //USART_DeInit(USART2); //复位串口  :方式相同(USART_DeInit(USART2)函数调用以上两个函数)
   
    //USART 初始化设置
 
  USART_InitStructure.USART_BaudRate = bound;                     //一般设置为9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;             //8位数据长度
  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(USART2, &USART_InitStructure);                       //初始化串口
  
    //Usart2 NVIC 中断控制器配置

  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                  //使能串口2中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;              //先占优先级2级
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                  //从优先级2级
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                   //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);                           //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
   
  //开启中断
  
    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);                   //开启串口接受中断
  
   //使能中断
 
    USART_Cmd(USART2, ENABLE);                                       //使能串口

    RS485_TX_EN=0;                                   //默认为接收模式
}
/*
函数:RS485_Send_Data
功能:RS485发送len个字节
参数:buf:发送区首地址,len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
备注:
步骤:
*/
void RS485_Send_Data(u8 *buf,u8 len)
{
   u8 t;
   RS485_TX_EN=1;                         //设置为发送模式
 
   for(t=0;t<len;t++)                      //循环发送数据
  {    
   while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  
   USART_SendData(USART2,buf[t]);
  } 
 
  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);  
  RS485_RX_CNT=0;  
  RS485_TX_EN=0;                        //设置为接收模式 
}
/*
函数:RS485_Receive_Data
功能:RS485查询接收到的数据
参数:buf:接收缓存首地址,len:读到的数据长度
备注:
步骤:
*/
void RS485_Receive_Data(u8 *buf,u8 *len)
{
 u8 rxlen=RS485_RX_CNT;
 u8 i=0;
 *len=0;                              //默认为0
 
 delay_ms(10);                           //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
 if(rxlen==RS485_RX_CNT&&rxlen)                  //接收到了数据,且接收完成了
 {
  for(i=0;i<rxlen;i++)
  {
   buf[i]=RS485_RX_BUF[i]; 
  }  
  *len=RS485_RX_CNT;                       //记录本次数据长度
  RS485_RX_CNT=0;                         //计数清零
 }
}
/*
函数:USART2_IRQHandler
功能:中断处理函数
参数:
备注:
步骤:
*/ 
void USART2_IRQHandler(void)
{
 u8 res;    
 
  if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到数据
 { 
     
  res =USART_ReceiveData(USART2);                    //读取接收到的数据
  if(RS485_RX_CNT<64)
  {
   RS485_RX_BUF[RS485_RX_CNT]=res;                  //记录接收到的值
   RS485_RX_CNT++;                              //接收数据增加1
  }
 }             
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stm32---RS485初始化 的相关文章

  • SpringBoot系列---SpringBoot配置文件加载顺序

    1 内部文件配置加载顺序 resource目录下打包之后就是classpath路径 xff0c 所以classpath路径下也就是resource目录下的配置文件 2 外部配置文件加载顺序我们再使用springboot开发程序的时候 xff
  • 4.7树的使用(并查集、哈夫曼树的构建)

    一 并查集 优化后 时间复杂度 xff1a 树高 O log2n 查找 xff1a O log2n 1 并查集初始化 span class token macro property span class token directive ha
  • 游标v_cur的%notfound

    当游标的值为空的时候 xff0c 处理无效员工的id时就会出现错误 比如 xff1a 创建一个程序检索某个员工的工龄 a 创建一个函数GET SERVICE YRS xff0c 检索某个员工总的工龄 xff1b 此函数应该接受员工ID作为输
  • 两个大数(包括负数)相加

    分析 xff1a 当这两个大数为正数时 xff0c 我们可以将字符转化为数字相加 xff0c 再加进位talg xff0c 有进位为1 xff0c 否则为0 xff1b 两个为负数则与正数相似 xff0c 为一正一负时 xff0c 我们可以
  • WRF模式运行的流程以及简单错误的避免

    前提安装好 WPS 43 WRF 43 WRFDomainWizard等组件 一 xff0c WPS 1 xff0c geogrid exe 准备静态数据 地理数据 2 xff0c ungrib exe 解压强迫场资料 气象数据 3 xff
  • 两台计算机之间的直连

    1 xff0c 直连线的要求 xff0c 需要交叉线 2 xff0c 在网络里打开适配器选项 xff0c 右击以太网 xff0c 打开属性 xff0c 双击IP4 xff0c 如图所示 IP地址设置如上图 3 xff0c 另一台计算机的设置
  • MP3转码PCM

    支持aac和mp3转码 xff0c 主要是dst nb sample的计算 xff0c aac大致为1024 xff0c MP3为1152 xff0c static int dst nb samples 61 0 define SWR in
  • RISC-V MCU 导盲手套

    RISC V MCU 导盲手套 关于本文队伍名称第一部分 设计概述1 1 设计目的1 2 应用领域1 3 主要技术特点1 4 关键性能指标1 5 主要创新点 第二部分 系统组成及功能说明2 1 整体介绍2 2 各模块介绍 第三部分 完成情况
  • 告别VMWARE!开源,免费,高效率,跨平台的

    与所有Linux爱好者一样 xff0c 对Windows的感情都是虽然不喜欢 xff0c 但是有些时候还真离不开这个玩意 那怎么办呢 xff1f 虚拟机 xff01 最早接触的虚拟机是virtualpc xff0c 这个软件自从被微软收购之
  • 保护机制

    一 SSP Stack Smashing Protection SSP属于编译器层面的防护 具体实现 1 xff0c 在栈中 xff0c ebp与变量之间插入随机值canary xff0c 用于监视是否栈溢出 xff1b 2 xff0c 在
  • Linux系统溢出漏洞学习

    系统环境 xff1a Linux 3 0 0 12 generic athlon DISTRIB DESCRIPTION 61 34 Ubuntu 11 10 34 gcc Ubuntu Linaro 4 6 3 1ubuntu5 4 6
  • db dw dd 与equ的区别

    此前在写汇编的过程中 xff0c 一直不理解两者间的区别 xff0c 例如 xff1a address1 dw 1000h address2 equ 2000h mov ax address1 mov bx address2 db dw d
  • c++/cmake/cmakelists/cmakelists子目录的添加

    cmake minimum required VERSION 3 10 project learning to create project set CMAKE CXX STANDARD 11 set LIBRARY OUTPUT PATH
  • RoboMaster怎么设计新步兵悬挂

    流程 xff1a 明确需求 gt 提出可量化目标 gt 方案提出与评估 gt 细化方案 gt 任务分配 gt 画图设计 gt 图纸提交与验收 gt 加工 gt 装配 gt 机械调试 需求 xff1a 性能优越的悬挂 目标 xff1a 1 任
  • windows7资源管理器无响应的解决方案

    windows7使用过程中常常会出现资源管理器无响应 xff0c 分多种情况 xff1a 1 xff0c 由于第三方程序大量占用内存 xff0c 系统响应速度变慢 xff0c 选择等待程序响应 xff0c 过一段时间即可恢复正常 xff1b
  • 黑客技巧:Google hacking实现以及应用

    前言 google hacking其实并算不上什么新东西 在早几年我在一些国外站点上就看见过相关的介绍 但是由于当时并没有重视这种技术 认为最多就只是用来找找未改名的mdb或者别人留下的webshell什么的 并无太大实际用途 但是前段时间
  • C语言string库函数介绍(附模拟实现)

    目录 strlen 模拟实现 strcpy 模拟实现 strcat 模拟实现 strcmp 模拟实现 strncpy strncat strncmp strstr 模拟实现 strlen size t strlen const char s
  • Realsense D435i Yolov5目标检测实时获得目标三维位置信息

    文章目录 一 效果演示二 环境配置三 模型配置四 相机配置五 部分代码 六 仓库链接 一 效果演示 Colorimage Colorimage and depthimage 二 环境配置 1 一个可以运行YOLOv5的python环境 pi
  • C语言中return的各种用法

    转自 xff1a https www pinlue com article 2021 06 2614 1611638969328 html
  • 从零开始搭二维激光SLAM --- 激光雷达数据效果对比

    我们知道 xff0c 不同品牌的激光雷达产生的数据是不一样的 xff0c 那这些不同点是如何影响建图效果的呢 xff1f 这篇文章就是来分析这个问题 xff0c 将从不同光强下的点云效果 xff0c 不同夹角下的点云效果 xff0c 以及

随机推荐

  • 海上垂直无人机垂直起降平台

    无人机的降落要实现对飞行轨迹和飞行状态的精确控制 xff0c 对目标地点的精确定位与识别 xff0c 而海上无人机降落具有更多不确定因素 xff0c 现提出一些有效方案 xff0c 以使得无人机海上起降成为可能 无人机起降条件 xff1a
  • 开源自制6通道航模遥控器,Arduino Pro Mini NRF24L01模块

    前言 前段时间跟着LOLI大神的教程制作了LOLI三代控 xff0c 效果很好 但是 xff0c 由于LOLI三代控的接收机带有数据回传功能 xff0c 也就是接收机的无线模块也承担了发射数据功能 xff0c 所以接收机也要使用带有功率放大
  • linux下TCP/IP通讯实例

    下面是server端源码 xff1a include lt stdio h gt include lt stdlib h gt include lt string h gt include lt unistd h gt include lt
  • STM32 USART 一些问题

    SECTION 1 1 2 3 4 5 6 7 8 9 10 11 12 13
  • 数据缓冲策略 —— 无缓冲、行缓冲、全缓冲(缓冲区大小测试)

    printf打印数据时 xff0c 一般会先把数据放入C缓冲区 xff0c 然后再刷新到内核缓冲区 xff0c 最后再写入硬件 这个过程中 xff0c 数据从C缓冲区迁移到内核缓冲区的操作我们称为缓冲 xff08 也可以理解为刷新 xff0
  • K210 FreeRTOS多任务多核系统调度

    一 目的 众所周知 xff0c K210这款AI新品是一款64bit 双核芯片 xff0c 其支持裸机编程 xff0c 并且官方也提供freertos sdk xff0c 方便开发者在其上进行多任务应用开发 那么如何进行任务创建和多核开发呢
  • keil如何添加h文件_KEIL 那些编辑技巧与方法

    当然了 xff0c 很多人现在更多的是使用 VSCode 或者 SI 等软件进行编辑 xff0c 但不可否认的是 xff0c 还有很多道友还是选择 KEIL 作为编辑软件的 xff0c 本篇笔记作为一个编辑技巧的总结 关于 KEIL 软件的
  • 关于keil C51 案例 加入头文件

    1 先在工程下面建立一个 h文件 xff0c 例如delay h 在其中写入要加入的函数声明 xff0c 或者其他的一些预定义 xff1a ifndef DELAY H define DELAY H include lt reg52 h g
  • "extern C", 你真的懂了吗?

    在c 43 43 prime书中看到过 xff0c 在DLL和lib中看到过 xff0c 但是每次看过就不求甚解地一扫而过 心里知道有extern c这个语句 xff0c 却不知道该用在哪里 xff0c 又能起到什么作用 唉 xff0c 想
  • 内存或寄存器定义和赋值

    在嵌入式中 xff0c 会经常遇到寄存器 内存的数据传输 xff0c 如何向寄存器中写入数据呢 xff1f 现举例说明 xff1a define rDISRC0 volatile unsigned 0x4b000000 DMA 0 Init
  • Makefile的文件格式,详解规则

    构建规则都写在Makefile文件里面 xff0c 要学会如何Make命令 xff0c 就必须学会如何编写Makefile文件 1 概述 Makefile文件由一系列规则 xff08 rules xff09 构成 每条规则的形式如下 xff
  • 只声明而不定义变量

    如果想声明一个变量而不定义它 xff0c 就在变量前面添加关键字extern xff0c 而且不要显式地初始化变量 extern int i 声明i而非定义i extern int j 61 0 定义 int k 声明并且定义 注意 xff
  • vector 与 智能指针使用注意事项

    看以下代码 xff0c 执行时会有什么问题 xff1f include lt vector gt include lt stdio h gt include lt stdlib h gt include lt memory gt class
  • SystemV 共享内存(一)—— 共享内存的创建与释放(shmget / shmctl)

    匿名管道和命名管道都是基于文件 的进程间通信 xff0c SystemV方案是在OS内核层面 专门为进程间通信设计的一个方案 xff0c 然后通过系统调用 xff08 system call xff09 给用户提供通信接口 SystemV方
  • TTL 485 232 全双工 半双工 单工---精简总结

    全双工 xff1a 双向2车道 半双工 xff1a 双向1车道 单工 xff1a 单向车道 1 从单片机软件编程角度来说 xff0c RS232 RS485都是转换为TTL电平方式与单片机通信 xff08 CAN收发器把差分信号转化为TTL
  • STM32F4-ADC-常规通道-转换模式配置-总结

    STM32F4 ADC常规通道转换的模式配置 模式选择 此寄存器定义 xff1a 是否自动循环 这两个寄存器定义 xff1a Scan mode xff08 是否轮询序列 xff09 和Discontinuous mode xff08 是否
  • 单片机 裸机 架构

    以前是 while xff08 1 xff09 43 软件定时器 43 中断标志 的框架 xff0c 现在的项目我想尝试一下新的框架 xff0c 简单来说是 主状态机 43 大量子状态机 43 软件定时器 的方式 xff0c 这其中状态机和
  • USART---串口发送数据

    xfeff xfeff while USART1 gt SR amp 0X40 61 61 0 等待发送结束 解析 xff1a USART1 gt SR xff1a 串口 状态 寄存器 USART1 gt SR amp 0X40 即串口状态
  • STM32---串口初始化

    u8 USART RX BUF USART REC LEN 接收缓冲 最大USART REC LEN个字节 bit15 xff0c 接收完成标志 bit14 xff0c 接收到0x0d bit13 0 xff0c 接收到的有效字节数目 u1
  • stm32---RS485初始化

    u8 RS485 RX BUF 64 接收缓冲 最大64个字节 u8 RS485 RX CNT 61 0 接收到的数据长度 函数 xff1a RS485 Init 功能 xff1a 串口初始化配置 参数 xff1a Baud 波特率 备注