




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Modbus向MSP430F149上的移植步骤FreeModbus 的MSP430 版本的demo 是在GCC 平台,现移植到IAR 上,版本5.3。先说几点在GCC平台移植到IAR平台要改的几处地方1.先按照如图所示在IAR中建立好工程文件以及工程目录2在system文件夹下建立DCO.C文件配置系统时钟,由于一般使用430单片机的外部8M晶振,因此此处我们自己写的函数只要和作者的留的接口对上即可。DCO.C文件代码如下:#include ./port/port.h#include dco.h/* - Start implementation -*/char cTISetDCO( int delta ) char z,result; /*-选择主系统时钟为8MHZ -*/ BCSCTL1 &= XT2OFF; /打开XT2高频振荡器 do IFG1 &= OFIFG; /清除振荡器失效标志 for (z = 0xFF; z 0; z-); /等待8MHZ晶振起振 while (IFG1 & OFIFG); /判断晶振失效标志是否依然存在 BCSCTL2 |= SELM_2 + SELS; /MCLK和SMCLK选择高频振荡器 result = TI_DCO_NO_ERROR; return(result);。前面说的与作者的留的接口对接,也就是返回值为char类型的TI_DCO_NO_ERROR即可。3. 官方demo 使用的MCU 为MSP430F169,我用的开发板是F149 因此要更改相应的库函数。文件port.h.更改为:/* - Platform includes -*/#include #if defined (_GNUC_)#include #endif#undef CHARPortserial.c 中usOldSR = _DINT( )程序,_DINT()是没有返回值的所以编译会报错,将该部分程序更改为这样文件:Portserial.c-EnterCriticalSection( void )更改为:voidEnterCriticalSection( void )USHORT usOldSR;if( ucCriticalNesting = 0 )#if defined (_GNUC_)usOldSR = READ_SR;_DINT( );#else/ usOldSR = _DINT( );#endif/ ucGIEWasEnabled = usOldSR & GIE ? TRUE : FALSE;_DINT( );ucGIEWasEnabled = TRUE;ucCriticalNesting+;文件:Portserial.c- ExitCriticalSection( void )更改为:voidExitCriticalSection( void )ucCriticalNesting-;if( ucCriticalNesting = 0 )if( ucGIEWasEnabled )ucGIEWasEnabled = FALSE;_EINT( );更改中断服务函数,原程序的中断服务函数格式不能在IAR 中使用,因此要更改为IAR格式文件:portserial.c-prvvMBSerialRXIRQHandler( void )更改为:#pragma vector = USART0RX_VECTOR_interruptvoidprvvMBSerialRXIRQHandler( void ) /_interruptUSART0RX_VECTORDEBUG_TOGGLE_RX( );pxMBFrameCBByteReceived( );文件:portserial.c- prvvMBSerialTXIRQHandler ( void )更改为:#pragma vector = USART0TX_VECTOR_interruptvoidprvvMBSerialTXIRQHandler( void ) / _interruptUSART0TX_VECTORDEBUG_TOGGLE_TX( );pxMBFrameCBTransmitterEmpty( );文件:porttimer.c- prvvMBTimerIRQHandler ( void )更改为:#pragma vector = TIMERA0_VECTOR_interruptvoidprvvMBTimerIRQHandler( void )( void )pxMBPortCBTimerExpired( );main.c 中有4 个配置宏,REG_INPUT_START 定义输入寄存器的开始地址,这里我配置成0;REG_INPUT_NREGS 定义输入寄存器的数目,我配置为4 个;REG_HOLDING_START 定义保持寄存器的开始地址,这里我配置为0;REG_HOLDING_NREGS 定义保持寄存器的个数,这里我定义为125。文件:main.c更改为:文件:main.c更改为:/* - Defines -*/#define REG_INPUT_START 0#define REG_INPUT_NREGS 4#define REG_HOLDING_START 0#define REG_HOLDING_NREGS 125这里配置modbus 支持的工作模式,有RTU、ASCII、TCP 三种模式。0 表示失能,1 表示使能。这里我只开启RTU 模式,当然了你也可以选择都开启。文件:mbconfig.h更改为:/*! brief If Modbus ASCII support is enabled. */#define MB_ASCII_ENABLED ( 0 )/*! brief If Modbus RTU support is enabled. */#define MB_RTU_ENABLED ( 1 )/*! brief If Modbus TCP support is enabled. */#define MB_TCP_ENABLED ( 0 )到这一步新建的工程可以编译成功,接下来将测试功能是否正常,在测试之前先对modbus 模块参数进行配置。在main.c文件中我们如下配置:int main( void ) eMBErrorCode eStatus; volatile USHORT usACLKCnt; /* Stop Watchdog Timer. */ WDTCTL = WDTPW + WDTHOLD; /* Delay for ACLK startup. */ for( usACLKCnt = 0xFFFF; usACLKCnt != 0; usACLKCnt- ); if( cTISetDCO( TI_DCO_4MHZ ) = TI_DCO_NO_ERROR ) _EINT( ); /* Initialize Protocol Stack. */ eStatus = eMBInit( MB_RTU, 0x01, 0, 9600, MB_PAR_EVEN ); if( (eStatus ) != MB_ENOERR ) /* Enable the Modbus Protocol Stack. */ else if( ( eStatus = eMBEnable( ) ) != MB_ENOERR ) else for( ; ) ( void )eMBPoll( ); /* Here we simply count the number of poll cycles. */ usRegInputBuf0+; for( ; );这里是对modbus 的串口参数以及地址的配置,这里我配置为MB_RTU, 0x01, 0, 9600,MB_PAR_EVEN,这时modbus 工作在RTU 模式,节点地址为01,使用的串行端口为0 也就是USART0,波特率9600,偶校验。4.还有一步很要的要修改的地方,那就是文件:port.h更改为:#define SMCLK ( 8000000UL )#define ACLK ( 32768UL )这里定义系统时钟频率,我的开发板使用外部8MHz 晶振,在dco-IAR.c 中的cTISetDCO函数中我将MCU 初始化为8MHz,因此SMCLK = 8000000 ,这个参数非常重要因为串口波特率和以及定时器的计算均参考SMCLK 的设置。5.到此处我们测试读写寄存器都可以通过了,但惟独测试读写线圈移植显示illegal data address,这个地方经过返回查找实际上是由于FREE MODBUS的作者有两个回调函数并没有写实际的内容,只是单纯的返回了出错标志,我们要达到完美的移植modbus到430f149上面去,我们就必须自己重写这两个函数,此处给出了自己写的程序。eMBErrorCodeeMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode ) eMBErrorCode eStatus = MB_ENOERR; int iNCoils = ( int )usNCoils; int usBitOffset; if( ( (int)usAddress = REG_COILS_START ) & ( usAddress + usNCoils 0 ) *pucRegBuffer+ = xMBUtilGetBits( ucRegCoilsBuf, usBitOffset, ( unsigned int)( iNCoils 8 ? 8 : iNCoils ) ); iNCoils -= 8; usBitOffset += 8; break; case MB_REG_WRITE: while( iNCoils 0 ) xMBUtilSetBits( ucRegCoilsBuf, usBitOffset, ( unsigned int )( iNCoils 8 ? 8 : iNCoils ),*pucRegBuffer+ ); iNCoils -= 8; usBitOffset += 8; break; else eStatus = MB_ENOREG; return eStatus;/*eMBErrorCodeeMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) return MB_ENOREG;*/eMBErrorCodeeMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete ) eMBErrorCode eStatus = MB_ENOERR; unsigned int iNDiscrete = ( unsigned int )usNDiscrete; unsigned int usBitOffset; if( ( (int)usAddress = REG_DISCRETE_START ) &( usAddress + usNDiscrete 0 ) *pucRegBuffer+ = xMBUtilGetBits( ucRegDiscreteBuf, usBitOffset, ( unsigned int )( iNDiscrete 8 ? 8 : iNDiscrete ) ); iNDiscrete -= 8; usBitOffset += 8; else eStatus = MB_ENOREG; return eStatus;为了配置这两个函数当然了前面还要有若干个宏定义用来储存线圈的数组如下即可/* - Defines -*/#define REG_COILS_START 1#define REG_COILS_SIZE 150#define REG_DISCRETE_START 1#define REG_DISCRETE_SIZE 150/* - Static variables -*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司收购合同协议书
- 全程服务委托合同协议书
- 建筑安装工程劳务合同
- 招标文件中合同条款
- 《假如》教学课件-
- 人民数据:数据资产入表解决方案2024
- 敲墙合同范本
- 托盘加工制作合同范本
- 大庆个人租房合同范本
- 2025年度合作方试销标准版合同
- 网络零售行业分析
- 屋顶光伏发电系统设计原则与方案
- 保安上墙制度
- 2025年建投国电准格尔旗能源有限公司招聘笔试参考题库含答案解析
- 2025念珠菌病诊断和管理全球指南解读课件
- 碘对比剂应用护理安全性
- 水电站安全生产培训
- 2025年国家药品监督管理局特殊药品检查中心招聘6人历年高频重点提升(共500题)附带答案详解
- 《矿井提升设备》课件2
- 被迫解除劳动合同通知书电子邮件
- 工具表单-岗位价值评估表(海氏)
评论
0/150
提交评论