历史上的今天
今天是: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();
}
}
史海拾趣
|
逆变电源被称为‘明天的电源’,其在焊接设备中的应用为焊接设备的发展带来了革命性的变化。首先,逆变式焊接电源与工频焊接电源比节能20%~30%,效率可达 80%~90%;其次,逆变式焊接电源体积小、重量轻,整机重量仅为传统工频整流焊接电源的1 ...… 查看全部问答> |
|
据香港《文汇报》23日援引外电报道,英国一名成绩优秀的女大学生,两年内求职200次被拒,上月31日在家中服食过量药物自杀,并在遗书中透露因找不到工作而感到“耻辱”,表示“不再想做自己”。 21岁的哈里森曾在中学GCSE考试里获得10科A至C级的佳 ...… 查看全部问答> |
|
哪位兄弟姐妹 帮忙找一下论文 有关交通灯的 (61板和模组v3.0)要求如下 利用61板、交通灯模组V3.0设计交通灯控制系统,要求具有下述功能: 1、系统有两个状态,设置状态和显示状态,利用61板的键盘的KEY1键盘可以进行两个状态间的切换; 2、开机时,系统为显示状态,四个路口数码管从默认的倒计时时间(本系统东南西北 ...… 查看全部问答> |
|
哈哈~~~网管马上就要上线了,插空热身热身~~~下图是擦除命令的拦截情况~~~现在开始做自己的ISP软件~~~肯定要带用户序列号和DTR/RTS控制了~~~ … 查看全部问答> |
|
ntc热敏电阻测温,用折半查表法,单片机是stc12c5410ad带10位ad,表的数据ntctab[]=1024*Rm/(Rm+Rntc),显示的结果为00,请各位高手帮帮忙!!程序如下: void NTCADC(void) { WORD ADC_TEMP = 0;//转换后的数据 BYTE i,M= 0,CHBSTART=0,CHBEND ...… 查看全部问答> |
|
我用的编译器 是IAR FOR ARM 。我用的芯片是STM32 大概是这样的。 启动代码就改了入口函数。 Reset_Handler LDR R0, =SystemInit ;BLX &nbs ...… 查看全部问答> |




