《嵌入式软件设计及编程思想2-1..学习资料.ppt》由会员分享,可在线阅读,更多相关《嵌入式软件设计及编程思想2-1..学习资料.ppt(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式软件设计及编程思想2-1.一个嵌入式设计系统一般包含一个嵌入式设计系统一般包含对内对内显示驱动显示驱动LED 595/IO/TM1629LED 595/IO/TM1629LCD 1621/1622LCD 1621/1622等等点阵、段式点阵、段式存储驱动存储驱动EEPROM/EEPROM/铁电铁电/FLASH/FLASH采样采样CPUCPU内部内部ADAD、ADAD芯片、测量芯片、测量SOCSOC控制控制+算法算法设计原则v1.可靠性v2.维护性(可读性)v3.移植性功能模块分类功能模块分类编程时分文件处理,一般一个驱动、一个功编程时分文件处理,一般一个驱动、一个功能模块一个文件能模块一
2、个文件原则:原则:1.1.一个驱动芯片相应的操作封装到一个文件一个驱动芯片相应的操作封装到一个文件中中2.2.一个算法,详细描述计算公式,涉及优化一个算法,详细描述计算公式,涉及优化后的公式,标明原始和推导公式,做一个文件后的公式,标明原始和推导公式,做一个文件3.3.文件不适合过多,文件名应一目了然,根文件不适合过多,文件名应一目了然,根据文件名知其内容据文件名知其内容设计分类文件结构v遵循一模块一文件格式v注释 特别是设计更改需注明 更改日期、更改人、更改记录(头、行)文件头加注释说明功能文件结构程序版式(易读性)v以布局清晰为原则v不同函数体v不同功能(同一函数中、定义变量)v缩进缩进(
3、不要使用空格、使用TAB(4格)程序版式(易读性)v推荐写法vif(condition)vv/program codevvelsevv/program codevv不推荐写法vif(condition)v/program codevvelse v/program codev v少用if(width 15)keyDownDLy=0;KEY_DATA=KEY_OLD;SAM+;elseif(keyDownDLy99)keyDownDLy=0;KEY_DATA=KEY_OLD;SAM+;else KEY_OLD=keypress;SAM=0;keypress=9;菜单设计菜单层数菜单设计菜单层数不得
4、超过4 层(原则上采用4 层结构需要有4 行显示),宜采用3 层结构,不可采用一层(一层但多排显示)翻到底结构。第一层为系统(SYS)、输入(In)、通信(bUS)、报警(do)、变送(tr)、版本(Ver)等设置;第二层为第1 层下的子类细分,以报警为例,第2层可以是报警阈值、死区、延时、报警功能选择等;第三层为第2 层显示的具体数据。注:选择太多时可选择数字加字母组合到方式,例:报警信号选择0.UA 1.UB等菜单设计方法:1。函数指针,网上例程很多2。状态机菜单设计switch(Setup_Data)case 0:if(KEY_DATA=KEY_Menu)Setup_Data=1;DS_
5、SETUP(0);break;else if(KEY_DATA=KEY_Left)Display_Page=Get_Display_Page(Display_Page,0);else if(KEY_DATA=KEY_Right)Display_Page=Get_Display_Page(Display_Page,1);else if(KEY_DATA=KEY_Enter)Display_Page=Get_Display_Page(Display_Page,2);elsebreak;Display_All_Page();return;菜单设计switch(Setup_Data)case 1:if
6、(KEY_DATA=KEY_Menu)Setup_Data=0;Display_All_Page();else if(KEY_DATA=KEY_Enter)Setup_Data=2;tmp_PASSWORD=9999;DS_INT_DATA(2,0,tmp_PASSWORD);break;菜单设计switch(Setup_Data)case 2:if(KEY_DATA=KEY_Menu)Setup_Data=1;DS_SETUP(0);/PASSelse if(KEY_DATA=KEY_Enter)if(tmp_PASSWORD=PASSWORD.UWD|tmp_PASSWORD=8)Setu
7、p_Data=9;DS_SETUP(2);m1Keytmp=0;tmp_PASSWORD=PASSWORD.UWD;tmp_PT=PT.UWD;tmp_CT=CT.UWD;elsetmp_PASSWORD=Data_4IWD_Key_Do(tmp_PASSWORD,1,9999);DS_INT_DATA(2,0,tmp_PASSWORD);break;菜单设计switch(Setup_Data)case Setup_DO1:case Setup_DO2:case Setup_DO3:case Setup_DO4:if(KEY_DATA=KEY_Menu)Setup_Data=9;DS_SETU
8、P(2+m1Keytmp);else if(KEY_DATA=KEY_Enter)cnt=Setup_Data-Setup_DO1;Setup_Data=cnt*SetupD_NN;Setup_Data+=SetupD_DO1+m2Keytmp;if(m2Keytmp=0)DS_SET_DAT(60+tmp_DOSelcnt);else if(m2Keytmp=1)DS_INT_DATA(2,0,tmp_DODlycnt);elseif(m2Keytmp=2)DS_INT_DATA(2,0,tmp_DOBandcnt);DsKeyDOSetPoint(tmp_DOSelcnt);else if
9、(m2Keytmp=3)DS_INT_DATA(2,0,tmp_DOHDatcnt);DsKeyDOSetPoint(tmp_DOSelcnt);else if(m2Keytmp=4)DS_INT_DATA(2,0,tmp_DOLDatcnt);DsKeyDOSetPoint(tmp_DOSelcnt);elseDS_SET_DAT(50+tmp_DOZerocnt);elsem2Keytmp=Data_4IWD_Key_Do(m2Keytmp,0,5);DS_LINE(40+m2Keytmp);break;显示小数点菜单设计switch(Setup_Data)case SetupD_DO1:
10、case SetupD_DO2:case SetupD_DO3:case SetupD_DO4:cnt=Setup_Data-SetupD_DO1;cnt/=SetupD_NN;tmp_DOSelcnt=Data_4IWD_Key_Do(tmp_DOSelcnt,0,31);DS_SET_DAT(60+tmp_DOSelcnt);break;case SetupD_DO1+1:case SetupD_DO2+1:case SetupD_DO3+1:case SetupD_DO4+1:cnt=Setup_Data-SetupD_DO1;cnt/=SetupD_NN;tmp_DODlycnt=Da
11、ta_4IWD_Key_Do(tmp_DODlycnt,0,9999);DS_INT_DATA(2,0,tmp_DODlycnt);break;存储设计按操作方式IIC(FM24C04)SPI(X5045)地址数据总线总线(FLASH)中断中和主程序中不能均控制外设,尤其注意定时器和通信的处理存储设计按存储介质 我司常用的EEPROM铁电(存储电能)不推荐设计时使用芯片内部FLASH做存储存储设计IIC 外部有上拉电阻,需考虑CPU的IO口属性开漏输入输出普通IO做普通IO时,在时序不对时易产生大电流锁死CPU,程序应和常规不一样存储设计一存储设计二存储设计三注意事项:1.上电后,CPU开始运
12、行后,不能立即读写外设2.一般延时3秒后操作,此时电源稳定3.一般上电操作 灭-显示版本-全亮-(读数据)-正常运行4.上电后推荐不进行写操作5.推荐存储数据分区间校验,可以做累加和,如设置数据一组、校准数据一组、电能数据一组等6.EEPROM上电默认一般为FFFF,铁电上电一般默认为07.有条件做双备份DI读取注意,设计时最好IO默认上拉(可以外部),考虑未安装时设计为断开状态,不能为不确定状态1.常开常闭点IO状态要么断开、要么闭合中断中读取,延时消抖2.有源湿节点无信号时才完全断开,有信号时时断时续DI读取1.常开常闭点if(READ2_DI1()if(DIDLY_On0DI_Read_
13、TotalCnt)DIDLY_On0+;elseDI_DO_Status.DIDO.DI1=0;DIDLY_Of0=0;elseif(DIDLY_Of0800)if(DI_ON_DLY0400)Meas.T.DIStatus.Bits.Bit0=1;else Meas.T.DIStatus.Bits.Bit0=0;DI_OFF_DLY0=0;DI_ON_DLY0=0;DI读取3.注意事项通信和DI和DO排在一起时操作DO时,DI不应被更改MODBUS协议需要做02命令DO设置1.总线控制电平方式脉冲方式2.报警控制取各信号输入延时死区,不动作带高报警、低报警为零时是否报警DO设置1.电平方式中
14、断中操作IOif(DI_DO_Status.DIDO.DO1)RELAY_SET_TDO1();elseRELAY_CLR_TDO1();2.脉冲方式毫秒级需要要中断中做,秒级主程序中做即可DO动作后,判断延时到了修改相应变量皆可 DI_DO_Status.DIDO.DO1通信v通信编程需采用收数据帧方式处理,不同波特率延时不同,收帧最短帧间隔时间应大于1.5个字符时间v以9600波特率为例,如果接收的2个字符间隔时间超过1.5毫秒则认为是2帧。发送数据帧时应有延时,从收到帧结束到发送帧开始最短间隔应大于3.5个字符时间。波特率超过9600可以以9600的时间为准。通信通信v设计时应按帧接收v
15、例:可用1毫秒定时器做,检测是否有数据接收structunsigned short int INNUM,START;unsigned char R_ALL,S_Dly,S_Flag,R_Dly,R_Flag;unsigned char inbuff100;unsigned char outbuff270;unsigned short int OUTNUM;unsigned char*sbuff;UartUD1;通信v设计时应按帧接收v例:可用1毫秒定时器做,检测是否有数据接收void USART1_SendRec_Dly(void)if(UartUD1.S_Flag)if(UartUD1.S_
16、Dly=0)UartUD1.S_Flag=0;USART_ITConfig(USART1,USART_IT_TXE,ENABLE);USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);if(UartUD1.OUTNUM!=0)UartUD1.OUTNUM-;USART_SendData(USART1,*UartUD1.sbuff);UartUD1.sbuff+;elseUartUD1.S_Dly-;else if(UartUD1.OUTNUM=0)USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);。通信v设计时应按帧接
17、收v例:可用1毫秒定时器做,检测是否有数据接收void USART1_SendRec_Dly(void)。switch(Comm_Baud)case 3:if(UartUD1.R_Dly=4)UartUD1.R_Flag=1;if(UartUD1.START2)UartUD1.R_ALL=1;else UartUD1.R_Dly+;UartUD1.R_Flag=0;break;case 4:if(UartUD1.R_Dly=7)UartUD1.R_Flag=1;if(UartUD1.START2)UartUD1.R_ALL=1;else UartUD1.R_Dly+;UartUD1.R_Fla
18、g=0;break;case 5:if(UartUD1.R_Dly=14)UartUD1.R_Flag=1;if(UartUD1.START2)UartUD1.R_ALL=1;else UartUD1.R_Dly+;UartUD1.R_Flag=0;break;default:if(UartUD1.R_Dly=2)UartUD1.R_Flag=1;if(UartUD1.START2)UartUD1.R_ALL=1;else UartUD1.R_Dly+;UartUD1.R_Flag=0;break;通信v发送时设置延时v例:void USART1_Send_Ready(void)switch(
19、Comm_Baud)case 5:UartUD1.S_Dly=19;break;case 4:UartUD1.S_Dly=8;break;case 3:UartUD1.S_Dly=4;break;default:UartUD1.S_Dly=1;break;UartUD1.S_Flag=1;UartUD1.INNUM=0;UartUD1.START=0;UartUD1.R_ALL=0;UartUD1.sbuff=UartUD1.outbuff;通信MODBUS通信v按GBZ19582.1-2004标准执行,以下需特别注意v地址范围1-247,波特率推荐1200-38400,奇偶校验位v 03H
20、命令读功能默认最少允许用户从地址0开始读125个数据,如只用到20个地址,其他地址宜默认填0。地址125以上超过设定的地址如果未默认为0,则需返回异常码,不推荐无通信。v10H 命令写功能写寄存器时对数据需要有范围判断,如超过范围需返回异常码,如设备地址范围为1-247,写248应为超范围,返回异常码,不存储。写多个寄存器时,如其中一个地址的数据超范围需认定整个命令帧无效,同时需给出异常码,禁止给其他符合范围的地址进行存储数据。已经遇到多个客户需要、645协议需要MODBUS通信vDI 通信读取v除设计任务书明确指定部分命令不做外(需返回异常码),带DI功能需02H和03H命令均可读开关量输入
21、状态,未安装或选配功能的开关量输入对应的通信和显示应显示为0,断开状态。超过总个数可回复异常码(推荐保留一定的开关量数目)。v例如:仪表只有5个开关量输入,设计时可默认保留为8个,02H命令读第9个开关量输入应返回异常码。MODBUS通信vD0 通信控制v除设计任务书明确指定部分命令不做外(需返回异常码),带DO功能需01H、03H命令均可读,05H、10H命令均可写。未安装或选配功能的DO对应的通信和显示应显示为0,断开状态。超过总个数可回复异常码(可保留一定的开关量数目)。写操作时应注意,如果DO被设置为报警功能时,使用05命令操作DO需返回异常码,且DO不应变位,使用10H命令操作DO只
22、能非报警功能的DO允许变位,设置为报警功能的DO不应变位,全为报警功能宜回复异常码。645通信vDLT-645 规约分97和07两个版本,编写时应按标准协议执行,以下需特别注意。前导字节在协议中规定了在发送数据帧时有时会先发送1-4个字节FEH,东软默认为FCH,因此程序设计时需考虑前导符,宜设计F8H以上均可作前导符一次量二次量带PC、CT变比的仪表,宜传输二次量已保证和标准协议的一致性,注意小数点、单位和符号。数据块应支持数据块和单个数据均可读取,例可同时读取三相电压,也可分别读取每相电压。变送输出1.DA输出2-3光耦隔离外加DA控制芯片2.PWM输出1光耦隔离外加RC电路根据公司目前硬件,宜采用100HZ。设计时软件分辨率不得小于千分之一,公司目前硬件有点非线性,宜作分段补偿或非线性补偿信号测量1.宜采用真有效值方式测量,扫描频率宜以50Hz的信号做设计,例测量某直流电平反映时间1秒,可以以3.2K的频率采集,采集1600个点后做运算2.有参考抬高,宜将参考接入AD通道,采样参考,扣除参考(N次累加后点均值)和校准的偏移后再做有效值此课件下载可自行编辑修改,仅供参考!此课件下载可自行编辑修改,仅供参考!感谢您的支持,我们努力做得更好!谢谢感谢您的支持,我们努力做得更好!谢谢