stm8 stm8s stm8af 485接口 modbus协议代码

发布者:数据小巨人最新更新时间:2021-11-12 来源: eefocus关键字:stm8  stm8s  485接口  modbus协议 手机看文章 扫描二维码
随时随地手机看文章

本人使用stm8af62a6,stm8s和stm8af大多数是互通的,只用一个库函数

62a6只能使用uart3!


485接口是硬件,不需要管,任何硬件接线都可以实现


代码见附件,已实现通信


主函数代码,主要为初始化函数,以及modbus帧接收处理函数,帧接收处理按自己的需求自行修改,本例的处理函数为接收数据再多输出一点数据


单片机源程序如下:

/******************************************************************

mian.c文件部分

******************************************************************/


void main(void)

{


  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);


  GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_OUT_PP_LOW_FAST);


  UART3_DeInit();

  UART3_Init((u32)9600, UART3_WORDLENGTH_8D, UART3_STOPBITS_1, UART3_PARITY_NO, UART3_MODE_TXRX_ENABLE);

  UART3_ITConfig(UART3_IT_RXNE_OR, ENABLE);


  TIM1_TimeBaseInit(15, TIM1_COUNTERMODE_UP, 1000, 0);

  TIM1_ARRPreloadConfig(ENABLE);

  TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);

  TIM1_Cmd(ENABLE);


  ITC_SetSoftwarePriority(ITC_IRQ_UART3_RX, ITC_PRIORITYLEVEL_3);

  ITC_SetSoftwarePriority(ITC_IRQ_TIM1_OVF, ITC_PRIORITYLEVEL_1);


  enableInterrupts();


  while (1)

  {

    UartDriver();

  }


}



/******************************************************************

modbus.c文件

******************************************************************/

#include "stm8s.h"


extern void Delay(uint16_t nCount);     //延迟1us



unsigned char cntRxd = 0;       //接受计数器

unsigned char bufRxd[64];       //接受寄存器


unsigned char flagFrame = 0;


void UartWriteBuf(unsigned char * buf ,unsigned char len)       //串口输出buf

{

  GPIO_WriteHigh(GPIOD, GPIO_PIN_3);


  while(len--)

  {

    while(( UART3_GetFlagStatus(UART3_FLAG_TXE)==RESET));

    UART3_SendData8(*buf++);

    while(( UART3_GetFlagStatus(UART3_FLAG_TXE)==RESET));

  }


  Delay(0xFFFF);

  GPIO_WriteLow(GPIOD, GPIO_PIN_3);

}


void UartAction(unsigned char * buf ,unsigned char len)         //帧处理函数

{

  buf[len++] = 'r';

  buf[len++] = 'n';

  UartWriteBuf(buf ,len);

}


unsigned char UartReadBuf(unsigned char * buf ,unsigned char len)       //串口buf读取

{

  unsigned char i;

  if(len > cntRxd)

  {

    len = cntRxd;

  }


  for(i = 0; i < len; i++)

  {

    *buf++ = bufRxd[i];

  }

  cntRxd = 0;


  return len;

}


void UartReadMonitor(unsigned char ms)  //接收结束帧判断

{

  static unsigned char cntbkp = 0;

  static unsigned char idletmr = 0;


  if(cntRxd > 0)

  {

    if(cntbkp != cntRxd)

    {

      cntbkp = cntRxd;

      idletmr = 0;

    }

    else

    {

      if(idletmr < 30)

      {

        idletmr += ms;

        if(idletmr >= 30)

        {

          flagFrame = 1;

        }

      }

    }

  }

  else

  {

    cntbkp = 0;

  }

}


void UartDriver(void)   //接收buf[len-2],处理判断帧结构

{

  unsigned char len;

  unsigned char buf[40];


  if(flagFrame)

  {

    flagFrame = 0;

    len = UartReadBuf(buf ,sizeof(buf)-2);

    UartAction(buf ,len);

  }

}


/******************************************************************

it.c文件部分(中断函数)

******************************************************************/


INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)

{  

  TIM1_ClearITPendingBit(TIM1_IT_UPDATE);

  UartReadMonitor(1);

}




INTERRUPT_HANDLER(UART3_RX_IRQHandler, 21)

{

   UART3_ClearITPendingBit(UART3_IT_RXNE);

   if(cntRxd < sizeof(bufRxd))

   {

     bufRxd[cntRxd++] = UART3_ReceiveData8();

   }

}


关键字:stm8  stm8s  485接口  modbus协议 引用地址:stm8 stm8s stm8af 485接口 modbus协议代码

上一篇:STM8L151G sx1276-LoRa测试程序
下一篇:STM8S005K6单片机点亮流水灯程序

推荐阅读最新更新时间:2024-11-17 17:01

STM8问题汇总
1.在STVD上开发,Build提示bad struct/union operand 这是因为工程文件太大的缘故,对提示的没有使用到的头文件,源文件进行删减即可解决问题 2.DEBUG按钮点击后提示 ERROR:before starting debug session,please,select a target 如图所示,选swim ST-LINK然后确认即可 3.在IAR上函数输入的参数有错,参数实际值不对或为0 有一个函数的参数类型有多个使用uint8_t作为参数类型声明时候,出现传入的参数不对的情况,uint8的声明在其他文件内,后改为int暂时解决。该问题与多地方定义了uint8_t声明有关系,有
[单片机]
<font color='red'>STM8</font>问题汇总
关于基于STM8S,MPU6050驱动的说明及程序
这个MPU6050使用的是IIC驱动的,而在具体电路图中没有使用STM8S自带的硬件IIC接口,所使用的是模拟IIC, 需要指出的是,在STM8S,IO配置的时候,SDA,对于挂SDA的IO来说,在STM8S的处理器上IO是没有真正的开漏输出功能的, 也就是将该IO配置成开漏输出的时候,IO高低电平输出实际是没有变化的,所以在IO具体输出或者读取状态的时候,必须切换IO模式, 另外需要注意的是,在配置IO的输出模式的时候,最好直接使用寄存器操作,如果使用 g_sda_output(); Handler_G_SDA_L;,也就是库函数操作的话,那么在配置成输出模式之后,并且接下来的代码立即输出高或者低的时候,
[单片机]
STM8】SPI通讯
这篇内容有点长,如果有人想透过我的博客学习STM8的SPI,那是我的荣幸 首先我要先说大纲,这样大家心里比较有底,可以把精力都用在SPI理解上 【SPI初步介绍】:介绍SPI如何接线、名称解释、通讯注意事项 【SPI引脚 - 初始化(上)】:相对于STM8,SPI的引脚位置说明,还有引脚的设置,另外还有初始化的部分代码 【SPI寄存器 - 初始化(下)】:使用寄存器做一些设定,例如波特率、SPI开启或关闭、SPI中断、传输方式。。。太多了,要看寄存器手册,我有整理图片出来,另外还包括完整的初始化代码 【SPI通讯】:SPI发送数据、SPI轮询方式接收数据、SPI中断方式接收数据 【SPI初步介绍】 下图是SPI的通讯方式
[单片机]
【<font color='red'>STM8</font>】SPI通讯
STM8单片机中自己实现 printf()函数功能
  由于STM8单片机本身内存比较小,而系统自带的printf()函数又比较占据空间,所以在稍微大一点的工程中有时候一使用 printf() 函数就会导致单片机内存不足,于是想着能不能自己写一个比较小的函数来实现类似printf()函数的功能。经过网上查找资料和总结终于找到了一个占用内存比较小,又能实现串口打印功能的方法。   现在将自己的方法分享出来,这里使用 STM8S003F3P6单片机测试。   首先新建一个工程,专门用来测试串口功能。   串口部分相关代码如下: //串口 void Uart1_IO_Init( void ) { PD_DDR |= ( 1 5 ); //输出模式
[单片机]
在<font color='red'>STM8</font>单片机中自己实现 printf()函数功能
玩转单片机STM8(一)
最初从单片机学习整个计算机系统是个非常正常的阶梯学习方法。因为直到今天,计算机系统的那些事,也没逃离这个最基础的架构。可惜我当年直接跳过了这个过程,直接从intel 486学起的,那时每天带着无数的疑问在艰难的前行。 单片机不一定要学习51,其实随便选一家都是一样的。从实际出发要选,便宜的,外围器件少的,里面功能的,所以为大家挑选了STM8L。 STM8L是个8位单片机,我在论坛中的确看到一些小兄弟在问8位是怎么回事?我至少欣慰这位兄弟确实在思考。通常我说的8位是指CPU计算时,具体点说,不如说加法,是指两个8位二进制数相加的能力。同理,32位,就是32位二进制数相加。 另外,也是最难的部分,这8位单片机的寻范围可不一定是
[单片机]
玩转单片机<font color='red'>STM8</font>(一)
STVD 调试STM8S所遇到的问题
环境为主控芯片: STM8SF103F3,编译器 COSMIC8,IDE环境为STVD。 大概代码如下: u8 ret; ret=rf_get_addr_len(); ret=rf_get_trint_level(); ret=rf_get_drssi_level(); ret=rf_get_dest_provider(); ret=rf_get_addr_len(); 使用STLINK进行调试时发现,ret的值根本就不是正确的,我跟踪到具体的函数里面去,检测值是正确的,但为什么赋值给ret后,这个值就不对了呢? 后来google搜后发现一个贴上有说明,内容如下: 一段很简单的代码,跑在ST-DISCOV
[单片机]
stm8s开发(三) UART的使用:串口通信!
  串口通信是单片机学习的一个最基本、最重要的功能之一。串口通信可以间接的当做调试接口使用,实现单片机与电脑之间的通信。当然可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。   STM8S的通用异步收发器(UART)主要特性:   ● 全双工的,异步通信   ● 可编程数据字长度(8位或9位)   ● 可配置的停止位-支持1或2个停止位   一般的,我们使用串口通信主要是关心几点参数:波特率、停止位、奇偶校验位。   其次就是如何发送、如何接收数据,这里介绍的使用阻塞式发送数据、中断方式接收数据。   以下代码是初始化串口,参数为:115200 1停止位 无校验位   void Init
[单片机]
<font color='red'>stm8s</font>开发(三) UART的使用:串口通信!
STM8 自动唤醒AWU
简介 AWU是用来当MCU进入低功耗的活跃停机(Active Halt) 模式时提供一个内部的唤醒时间基准。该时间基准的时钟是由内部的低速RC振荡器时钟(LSI)或者通过预分频的HSE晶振时钟来提供的。 LSI 时钟测量 在使用LSI低速内部时钟时,为了确保最好的精度,它的频率可以通过TIM3的输入捕捉1 来测定。 AWU 时钟框图 AWU功能描述 AWU 操作 为了使用AWU功能,按顺序执行如下步骤: 1. 使用AWU_CSR寄存器的MSR位和TIM3的输入捕捉通道1来检测LS的时钟频率; 2. 通过写AWU_APR 的APR 位来定义适当的预分频值; 3. 通过写AWU_TBR 的AWUTB 来
[单片机]
<font color='red'>STM8</font> 自动唤醒AWU
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved