APP 学习笔记
APP的启用
1 选择APP
在DAVE的右侧选择APP,双击创建APP
2 查看已经创建的APP,在DAVE左下角可以查看已经创建的APP
3 查看APP的说明文档,可以通过help中的help contents查看APP说明文档
4 APP的文件结构,以ADC002作为解释
1) 可以看出ADC002包括ADC002_Conf.h, ADC002.h, ADC002_Conf.c 和ADC002.c4个文件
ADC002_Conf.h: ADC结构体的声明
ADC002.h, 带有ADC数据结构的定义等
ADC002_Conf.c ADC结构体的初始化,根据GUI的输入产生
ADC002.c 带有ADC的可执行函数
IO_001
基本功能:作为模拟IO输入使用,可以连接其他上层ADC、DAC单元,
使用:一般情况下,加载了ADC、DAC模块后会自动连接相应IO_001
IO_002
基本功能:作为数字IO输入使用,可以连接其他上层APP,
使用:一般情况下,加载了相应模块后会自动连接相应IO_002,或者,在某些模块没有直接连出的信号,可以通过信号连接把IO_002连接上。
IO_003
基本功能:可以同时设定多个连续的pin作为IO通道。
IO_004
基本功能:作为数字IO输入使用,主要是通过软件写入或读取pin脚状态
使用:
1) 读取IO004_ReadPin(Handle)
2) 设定输出IO004_SetPin(Handle), IO004_SetOutputValue(Handle, Value), IO004_ResetPin(Handle), IO004_TogglePin(Handle)
UART_001
基本功能:通过UART模块进行串行数据的输入输出操作
使用:
1) 相关串行速度、奇偶校验、停止位等在UI中设定
2) UART001_ReadData(Handle):读取接收到的数据
3) UART001_WriteData(Handle, Data),写入数据,只能写入8位数据,若数据长度不一致,则会写入低8位
4) UART的初始化通过UART001_Init,这会在DAVE.h中调用
5) 接收FIFO和发送FIFO的大小都可以通过UI设定,其中Trigger Limit可以设定在FIFO达到什么值后产生中断。需要注意的是接收FIFO的值要是没有及时读出,数据仍旧会接收,造成接收错误中断的产生。
USIC SPI APP (Master 模式)
1 SPI001配置
SPI的配置主界面如下,在这里可以选择波特率,格式,工作模式(半/全双工、单线、双线、四线等),
一般可以选择默认,其他按照需要更改。
其中需要注意的是,APP只能把SPI设定为Master 模式,无法设定为Slave模式。如要设定为Slave模式,需要用户手动更改寄存器或用自己的代买实现。
同时需要注意的是,该APP把DX2反转,且无法通过UI更改。如果要连接其他的Slave模块,要注意这一点。
2 关键函数
其中比较常用的函数如下,其他Init、Configure等函数一般由UI来完成。
SPI001_ReadData()读取函数
SPI001_WriteData()写入函数
SPI001_GetFlagStatus 读取标志位状态
SPI001_ClearFlag 清除标志位状态
EnableStartOfFrame开始帧
EnableEndOfFrame 终止帧
ADC_001
基本功能:
使用Background Source方式进行ADC转换(后台)
使用:
1) 初始化 ADC001_Init(),这个会在DAVE.h中调用
2) ADC001_GenerateLoadEvent(),每次需要转换前,需要调用该函数,才会启动转换,如果在UI里头启用了Auto Scan,则可以不用调用这个函数
3) 通过调用ADC001_GetResult(),来读取结果,结果中包括组号、通道号和结果;如果启用了wait-for-read方式,则必须调用这个函数,下一个结果才能写入
4)GroupA中必须至少选择1个通道
5) 如果在UI里没有使能Arbitration Slot,则需要ADC001_EnableArbitrationSlot()来启用
ADC_002
基本功能:
使用Queue Source方式进行ADC转换(队列)
使用:
1) 注意在DAVE.h中调用ADC002_Init()后,仍然要手动在main中调用ADC002_InitializeQueue(),ADC才会工作。
2 )如果在UI里没有使能Arbitration Slot,则需要ADC002_EnableArbitrationSlot()来启用
3) 结果通过ADCCH001_GetResult()读取
ADC_003
基本功能:
使用Scan Source方式进行ADC转换(扫描)
使用:
1) 初始化 ADC003_Init(),这个会在DAVE.h中调用
2) ADC001_GenerateLoadEvent(),每次需要转换前,需要调用该函数,才会启动转换,如果在UI里头启用了Auto Scan,则可以不用调用这个函数
3) 通过调用ADC003_GetResult(),来读取结果,结果中包括组号、通道号和结果;如果启用了wait-for-read方式,则必须调用这个函数,下一个结果才能写入
4)GroupA中必须至少选择1个通道
5) 如果在UI里没有使能Arbitration Slot,则需要ADC001_EnableArbitrationSlot()来启用
ERU_APP
ERU的APP实现实际是通过两个不同的ERU APP来实现的,ERU001和ERU002需要共同配合使用,ERU的输入输出要参考ERU的输入输出表,事实上,其逻辑已经在APP中体现了。
1) ERU001
基本功能:实现了ERU模块中的ERS和ETL功能,注意UI中A标示通道A,A’标示A的取反
使用:
2) ERU002
基本功能:实现ERU模块中的OGU功能
使用:
DACWG001:
该APP用于输出简单的RAMP波形、正弦波形,或自定义的周期波形,同时也可以根据需要产生指定的电平输出。
1 模式选择
2 自定义波形输入
3 放大比例
NVIC_001
基本功能:中断控制器,可以被多至5个不同的中断所共享
使用:当5个中的一个中断产生时候,会调用所有的中断定义接口,这时候要根据Flag状态判定具体哪个中断要使用
NVIC_002
基本功能:中断控制器,只能连接一个中断
使用:相比NVIC_001,它的中断例程不会被其他中断例程影响,所以适合优先级更高的中断使用。
PWMMP001
基本功能:通过CCU8产生多相(2、3、4)的PWM波,已经预设为中心对齐+非对称模式
使用
1 PWM的开始由SCU_GLCCST8x决定
2 通过SetPeriod() and SetCompare() and SetPeriodAndCompare():
或SetPwmFreq() and SetDutyCycle() and SetPWMFreqAndDutyCycle():
等改变PWM周期或占空比。
PWMSP001
基本功能:通过CCU4产生单相的PWM波
使用:
1) 可以通过UI设定频率、占空比等基本参数
2) 如果没哟选择“Start During Initializaton”,则需要在main中调用PWMSP001_Start()
3) 可以在程序中调用PWMSP001_SetCompare(),PWMSP001_SetDutyCycle(),PWMSP001_SetPeriod(),PWMSP001_SetPwmFreq()等函数改变CCU的基本参数等值。
PWMSP002
基本功能:通过CCU8产生单相的PWM波,可设置
使用:
4) 可以通过UI设定频率、占空比等基本参数
5) 如果没哟选择“Start During Initializaton”,则需要在main中调用PWMSP001_Start()
6) 可以在程序中调用PWMSP001_SetCompare(),PWMSP001_SetDutyCycle(),PWMSP001_SetPeriod(),PWMSP001_SetPwmFreq()等函数改变CCU的基本参数等值。
设计实例一:
1 目标: 设计一个实例使用ADC、DAC、PWM、UART、IO、NVIC等APP联合工作的实例
2 功能:
DAC输出RAMP波形或Partern波形,
在CCU4的Period Match中断中用ADC采样DAC的输出
ADC采样结果分成2个字写入UART
UART接收结果分成2个字写入下一个DAC模块,
DAC模块在Single Value模式下输出
3 结果各模块按照要求输出
4 CCU4的Period Match中断后改为UART的接收FIFO中断,每接收2个字节产生中断,验证功能正常
5 遗留问题:
1) 无法把通过APP的方法把DAC的输出直接通过ADC读入
2) 出现过几次自动生成代码不完整的错误,具体原因不详。
设计实例二:
1 目标: 设计一个可在线更改占空比的PWM发生器
2 功能
ADC采样输入,把ADC的值作为PWM占空比的参考值
3 各模块按照要求输出。
RTC001 APP
功能: 用于系统记录一个实时时钟,可记录YY/MM/DD/HH/MM/SS格式的时钟,且可以通过时间计数器按秒、分、时、天、月、年产生中断。
使用
1 可通过图形化的方式初始化RTC模块,
2 若未在UI中使能、初始化RTC,则可以通过
1) RTC001_Enable() 、RTC001_Disable()分别使能、禁用时钟
2) RTC001_Clock_SetTime() 、 RTC001_Clock_GetTime()分别设定和读取当前时钟。
3 启用中断。
2 Ethernet APP学习
1) ETH002
ETH002 是用于实现Ethernet物理层的APP。在这个APP上,主要配置如速度、协商方式。
2) ETH001
ETH001是用于实现Ethernet MAC层的APP。在这个APP上,主要配置如MAC地址、通讯接口方式(MII、RMII)等。
ETH001 要配合ETH002使用,若选择生成一个ETH001,则会自动生成ETH002的APP。
3) ETH003
ETH003是用于实现在实时系统下的TCP/IP等协议的APP。
若选择ETH003,则会自动生成相应的ETH002和ETH001,同时因为是基于实时系统的ETH,它还会生成实时系统、文件系统、存储管理系统相关的APP。
ETH003的APP结构如下图
第二篇:学习笔记-1
? 如何将光层的通道服务模式发展为光层和电层的统一调度模式,也是光网络
发展的一大困扰。长期以来,骨干网被分为两层:骨干路由器IP承载网(IP)的骨干光传送网(光层)。两层一直分别独立地发展,主要关联点集中在光层为IP层提供静态配置的物理链路资源,而其他联系却很少。IP层看不到光层的网络拓扑和保护能力,光层也无法了解IP层的动态业务需求。随着业务的迅速增长,IP层的路由器面临着巨大的扩容与处理压力。如何通过光层与电层的统一调度来降低IP层路由器的处理压力,进而降低网络成本和功耗是当前网络亟待解决的一个问题。
? 多业务和用户驱动的本质可以概括为传送网由封闭到开放、由他控到自律的
发展模式问题。要在充分利用光网络的现有资源来满足业务动态化需求的同时,又可以保证传送网本身的可控、可管,以达到业务网与传送网的融合,是未来光网络发展的难点。
? 例如子网掩码是M.N.P.Q,可以套入这么一个公式:(256-M)*(256-N)*(256-P)
*(256-Q),得到的结果,即是这个网段一共有多少个IP地址。在本例中
【255.255.255.248】中,(256-255)*(256-255)*(256-255)*(256-248)=8,那么你就知道这个网段一共8个IP地址。
248 = 128 + 64 + 32 + 16 + 8 = (1111 1000)2
IP地址为211.99.34.33所在的网段一共有8个地址,计算该网段的子网(默认网关)?
把0-255分组,每8个连续的地址编号作为一组,看33在哪个组里面即可。0-7是第一组,8-15是第二组,以此类推,32-39是第五组,而33正在32-39.我们一般说的“网段”,就是指这样的组。于是得出结论,211.99.34.33在子网211.99.34.32,掩码为255.255.255.248的网段中。
书写IP地址的时候,只写地址,不写子网掩码,就无法判断这个地址属于哪个网段。
子网掩码还有一种简单的书写方法,就是在IP地址后面加上”/n”,如果你知
道这个网段有X个IP地址,假设2Y = X,那么n = 32 - Y。比如上面例子中的网段有8个IP地址,23 = 8,那么n = 32 - 3 = 29;上述例子的211.99.34.33就可以表示为:
211.99.34.33/29
私有IP地址网段:
10.0.0.0/8: 10.0.0.0 - 10.255.255.255
172.16.0.0/12 172.16.0.0 - 172.31.255.255
192.168.0.0/16 192.168.0.0 - 192.168.255.255
? CSO:Cross Storey Optimization(跨层优化) A类地址 B类地址 C类地址