历史上的今天
返回首页

历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2018年08月12日 | stm32---RS485初始化

2018-08-12 来源:eefocus

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  {     
   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  {
   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 
  } 
 }              
}


推荐阅读

史海拾趣

DSP Group Inc公司的发展小趣事

在智能语音领域,DSP Group凭借其深厚的技术积累和创新能力,取得了显著的突破。公司推出了一系列智能语音处理技术和产品,如SmartVoice系列语音处理芯片和算法套件等。这些技术和产品不仅为用户提供了更加自然、智能的语音交互体验,还为智能家居、汽车电子等领域的发展提供了有力支持。

Everspin公司的发展小趣事

随着技术的不断进步,Everspin不断推出新的MRAM产品,并逐渐将市场扩展到工业自动化、游戏、能源管理、通讯、运输和航空电子等多个领域。特别是其MRAM和STT-MRAM产品在数据中心、云存储、能源、工业、汽车和运输市场中的广泛应用,为全球MRAM用户奠定了最强大、增长最快的基础。

ELEMENT14公司的发展小趣事

ELEMENT14公司最初是一家电子元器件分销商,但随着市场的变化和客户需求的升级,公司决定转型为提供一站式服务的平台。这一转变意味着公司不仅要提供电子元器件,还要提供软件、技术支持、在线社区等全方位的服务。通过不断的投入和努力,ELEMENT14成功转型为一个综合性的电子元器件服务平台,满足了客户多样化的需求。

GHz Technology ( Microsemi )公司的发展小趣事

为了满足全球客户的需求,ELEMENT14致力于构建和优化全球供应链。公司与多家国际知名电子元器件制造商建立了长期稳定的合作关系,确保了货源的稳定性和多样性。同时,ELEMENT14还建立了全球物流体系,实现了快速、准确的物流配送服务。这些措施不仅提升了客户满意度,也增强了公司在全球市场的竞争力。

常州星海电子(Starsea)公司的发展小趣事

质量是企业的生命线。常州星海电子自成立以来,便高度重视质量管理体系的建设和完善。公司先后通过了ISO9002、ISO9001:2000、ISO14000等多项国际质量管理体系认证,以及TS16949体系认证。这些认证不仅证明了公司在质量管理方面的卓越实力,也为公司赢得了众多国内外客户的信任和赞誉。

Custom Electronics Inc公司的发展小趣事

随着公司规模的扩大和产品质量的提升,CEI开始寻求更广阔的市场空间。通过与全球知名电子产品制造商建立合作关系,CEI的产品逐渐进入国际市场。同时,CEI还积极参与国际电子行业的交流与合作,不断引进先进的生产技术和管理经验,为公司的长远发展奠定了坚实基础。

问答坊 | AI 解惑

晶闸管在电力稳压器中的应用

摘要:在所研制的新型无触点电力稳压器中,采用晶闸管作为开关器件。文中介绍该系统基本工作原理,详细分析晶闸管在使用过程中存在的一些问题及解决方法。目前流行的电力稳压器大多采用伺服电机带动炭刷移动调整电压。它具有整机效率高、输出波形好 ...…

查看全部问答>

自学成才-电子工程师-找工作 General Electronics Engineer

我从小就有很强的好奇心和动手能力,想知道每一件东西是如何工作的,对自然科学非常着迷。我还记得,小学时因为在课堂上用钉子和电线做电磁铁被批评;初中因为画电路图做收音机被取笑;高中被禁止做一种能开所有教室门锁的万能钥匙。我父亲是一名中 ...…

查看全部问答>

tcpmp 的问题.

tcpmp 好不好用,下了一个, 在EVC下怎么编译不了?请高手介绍一下经验.…

查看全部问答>

闹钟的问题

用IAppointment设定一个闹钟,时间到了没有\"日程提醒\" 再去设定另一个闹钟,上一个已过时间的闹钟就马上蹦出\"日程提醒\"来,这是怎么回事? “日程提醒”界面好好象是poom画的,我想显示自己的闹钟界面该怎么做? 我的poom组件还需要其它设置 ...…

查看全部问答>

wince下用GDI加载bmp图片的方法(能提供下可用的代码吗?)跪求

wince下用GDI加载bmp图片的方法(能提供下可用的代码吗?)跪求…

查看全部问答>

arm9 开发板

想自己学一下嵌入式方面的东西,在网上看了一下arm9 的板子,但不知道哪一块比较合适 2410或是2440的,请大家推荐一块,价格合理,性能比较好,适合初学者的。支持linux和wince。…

查看全部问答>

wince 连接sql server解决方案

我现在使用c++在pda下需要访问sql server,使用RDA.现在有个问题就是需要实时的和sql server通讯,使用RDA速度总是有2秒左右的延时。 不知道是RDA固有的问题,还是sql server设置的问题? 在PDA上真的没有好的解决方案?不能直接连接sql server?不 ...…

查看全部问答>

飞思卡尔单片机MC9RS08KA8的C程序的例子

高手求助一下,哪位有MC9RS08KA8的C程序例子呢?急用!小女子新学,好歹不知道从何下手!谢谢各位的帮忙!…

查看全部问答>

讨论下mma7455的一些参数含义

最近在看mma7444的资料,看到里面有俩个中断脚,init1和init2,还看到里面讲到脉冲测试,水平测试。不知道脉冲测试和水平测试指的是什么东西?还有为啥有俩个中断引脚?这俩个引脚如何使用?还有大家怎么处理x,y,z轴的校准,以及如何处理得到的数据 ...…

查看全部问答>

很全面的传感器应用电路

文档一共讲述14章的内容,基本涉及了现有常用传感器的电路,分享给大家····…

查看全部问答>