历史上的今天
返回首页

历史上的今天

今天是:2024年11月12日(星期二)

正在发生

2021年11月12日 | stm8 stm8s stm8af 485接口 modbus协议代码

2021-11-12 来源:eefocus

本人使用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();

   }

}


推荐阅读

史海拾趣

Entegris公司的发展小趣事

随着半导体材料开发成本的提高,产业链开始发生变革。Entegris通过与其他公司的合作与并购,积极适应这一变革。例如,与Versum Materials的合并就是Entegris在产业链变革中做出的重要决策之一。通过这一合并,Entegris能够更好地整合资源,提升市场竞争力。

以上是关于Entegris公司在电子行业发展的5个故事概述。这些故事涵盖了Entegris在合并、知识产权保护、技术创新、纯度控制以及产业链变革等方面的关键事实。

BAE Systems公司的发展小趣事

电子行业是一个充满竞争和挑战的领域。面对不断变化的市场环境和客户需求,BAE Systems公司不断调整自身的战略和业务结构。公司注重市场调研和客户需求分析,根据市场变化及时调整产品线和市场策略。同时,公司也加强了对内部管理和流程的优化,提高了运营效率和成本控制能力。这些举措使得公司能够在激烈的市场竞争中保持领先地位,实现稳健发展。

CT [ Central Technologies ]公司的发展小趣事

经过数年的努力,CT公司终于研发出了一款具有颠覆性的新型芯片技术。这款芯片在性能上大幅超越了当时的同类产品,引起了市场的广泛关注。多家知名企业纷纷与CT公司展开合作,将这款芯片应用于他们的产品中。随着合作伙伴的增加和市场份额的扩大,CT公司的知名度逐渐提升,成为了电子行业的一匹黑马。

Capax Technologies Inc公司的发展小趣事

Capax Technologies Inc的崛起始于一次技术突破。公司研发团队成功开发出一种新型半导体材料,显著提高了电子设备的性能和能效。这一创新成果迅速在行业内引起关注,Capax Technologies Inc因此获得了大量订单和投资。随着技术的不断迭代和优化,Capax Technologies Inc逐渐在电子行业中崭露头角,成为一家备受瞩目的创新型企业。

东晶(ECEC)公司的发展小趣事

随着产品质量的不断提升和市场份额的逐步扩大,东晶电子开始将目光投向国际市场。公司积极参与国际展会,与全球知名电子企业建立合作关系,产品出口到欧洲、北美、东南亚等多个国家和地区。同时,东晶电子还与国际知名厂商进行技术交流和合作研发,不断提升自身技术水平,以适应全球市场的竞争需求。

灿科盟(Ckmtw)公司的发展小趣事

为了提升产品质量,增强客户信任,灿科盟在2008年成功通过了ISO9001:2000版质量管理体系认证。这一认证标志着公司在质量管理方面达到了国际标准,也为公司赢得了更多客户的青睐。此后,公司继续加强质量管理体系建设,不断提升产品质量和服务水平。

问答坊 | AI 解惑

焊接逆变电源的发展趋势浅谈

逆变电源被称为‘明天的电源’,其在焊接设备中的应用为焊接设备的发展带来了革命性的变化。首先,逆变式焊接电源与工频焊接电源比节能20%~30%,效率可达 80%~90%;其次,逆变式焊接电源体积小、重量轻,整机重量仅为传统工频整流焊接电源的1 ...…

查看全部问答>

单片机 音乐 源码

本帖最后由 paulhyde 于 2014-9-15 03:07 编辑 单片机 音乐 源码    …

查看全部问答>

求职200次被拒 优秀女大学生吞药自杀

据香港《文汇报》23日援引外电报道,英国一名成绩优秀的女大学生,两年内求职200次被拒,上月31日在家中服食过量药物自杀,并在遗书中透露因找不到工作而感到“耻辱”,表示“不再想做自己”。 21岁的哈里森曾在中学GCSE考试里获得10科A至C级的佳 ...…

查看全部问答>

哪位兄弟姐妹 帮忙找一下论文 有关交通灯的 (61板和模组v3.0)要求如下

利用61板、交通灯模组V3.0设计交通灯控制系统,要求具有下述功能: 1、系统有两个状态,设置状态和显示状态,利用61板的键盘的KEY1键盘可以进行两个状态间的切换; 2、开机时,系统为显示状态,四个路口数码管从默认的倒计时时间(本系统东南西北 ...…

查看全部问答>

嵌入式linux检测网络通断

想在uclinux下实现检测网络通断的功能,如何去检测一个网线插上,但网络不可用的状况? linux有什么接口可以使用? 谢谢…

查看全部问答>

STM32的ISP热身运动开始

哈哈~~~网管马上就要上线了,插空热身热身~~~下图是擦除命令的拦截情况~~~现在开始做自己的ISP软件~~~肯定要带用户序列号和DTR/RTS控制了~~~ …

查看全部问答>

1个主机如何与100个左右的分机即通信又可以供电

                                 1个主机如何与100个左右的分机用2根电缆线即通信又可以给分机提供24V~36V的直流电压,其中会对一个分机提供时间很 ...…

查看全部问答>

高手帮帮忙ntc热敏电阻测温用查表法出问题了

ntc热敏电阻测温,用折半查表法,单片机是stc12c5410ad带10位ad,表的数据ntctab[]=1024*Rm/(Rm+Rntc),显示的结果为00,请各位高手帮帮忙!!程序如下: void NTCADC(void) { WORD ADC_TEMP = 0;//转换后的数据 BYTE i,M= 0,CHBSTART=0,CHBEND ...…

查看全部问答>

基于cortex-M3的CAN-bus设计

如题,想问问各位大虾有没有人做过这方面的,求入门资料和例程,谢谢!…

查看全部问答>

STM32 中断向量表问题?

我用的编译器 是IAR FOR ARM 。我用的芯片是STM32 大概是这样的。 启动代码就改了入口函数。 Reset_Handler         LDR     R0, =SystemInit        ;BLX  &nbs ...…

查看全部问答>