bf531快速应用.docx

上传人:b****6 文档编号:7089442 上传时间:2023-01-17 格式:DOCX 页数:16 大小:527.34KB
下载 相关 举报
bf531快速应用.docx_第1页
第1页 / 共16页
bf531快速应用.docx_第2页
第2页 / 共16页
bf531快速应用.docx_第3页
第3页 / 共16页
bf531快速应用.docx_第4页
第4页 / 共16页
bf531快速应用.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

bf531快速应用.docx

《bf531快速应用.docx》由会员分享,可在线阅读,更多相关《bf531快速应用.docx(16页珍藏版)》请在冰豆网上搜索。

bf531快速应用.docx

bf531快速应用

目录

目录2

第1章TIMERS3

1.1通用定时器3

1.2通用定时器寄存器3

1.2.1TIMER_ENABLE寄存器3

1.2.2TIMER_DISABLE寄存器4

1.2.3TIMER_STATUS寄存器4

1.2.4TIMERx_CONFIG寄存器4

1.2.5TIMERx_COUNTER寄存器5

1.2.6TIMERx_PERIOD和TIMERx_WIDTH寄存器5

1.3定时器的使用6

1.3.1PWM_OUT模式6

1.3.2WDTH_CAP模式7

1.3.3外部事件模式8

1.3.4定时器与PPI结合使用9

1.3.5中断9

1.3.6非法状态9

1.4内核定时器9

1.4.1TCNTL寄存器10

1.4.2TCOUNT寄存器10

1.4.3TPERIOD寄存器10

1.4.4TSCALE寄存器11

1.5看门狗定时器11

1.5.1看门狗定时器的操作11

1.5.2WDOG_CNT寄存器11

1.5.3WDOG_STAT寄存器12

1.5.4WDOG_CTL寄存器12

附录A图、表目录13

第1章TIMERS

DSP具有三个等同的32位通用定时器,一个内核定时器和一个看门狗定时器。

通用定时器可以配置为如下三种模式:

Ø脉宽调制模式(PWM_OUT);

Ø脉宽计数和捕获模式(WDTH_CAP);

Ø外部事件计数模式。

内核定时器用于产生各种系统定时功能的周期性中断。

看门狗定时器用来实现软件看门狗功能。

如果在软件更新前定时器计数结束,软件看门狗产生一个事件到DSP内核,从而提高系统性能。

1.1通用定时器

每个通用定时器都有一个专用双向管脚TMRx。

PWM_OUT模式下,作为输出管脚,WDTH_CAP和EXT_CLK模式下,作为输入管脚。

当使用内部时钟时,时钟源是系统时钟(SCLK)。

1.2通用定时器寄存器

每个定时器具备四个寄存器:

TIMERx_CONFIG[15:

0]-定时器配置寄存器;

TIMERx_WIDTH[31:

0]-定时器脉冲宽度寄存器;

TIMERx_PERIOD[31:

0]-定时器周期寄存器;

TIMERx_COUNTER[31:

0]-定时器计数寄存器。

定时器共享三个寄存器

TIMER_ENABLE[15:

0]-定时器使能寄存器;

TIMER_DISABLE[15:

0]-定时器禁止寄存器;

TIMER_STATUS[15:

0]-定时器状态寄存器。

TIMER_ENABLE和TIMER_DISABLE都支持读取,以检查定时器使能状态。

定时器在TIMENx位置位后三个系统时钟后开始计数。

TIMER_STATUS包含每个定时器的中断锁存位(TIMILx)和溢出/错误提示位(TOVF_ERRx)。

这些黏性位由定时器硬件设置,可以被软件查询。

需要通过软件清除。

为使能定时器中断,设置TIMERx_CONFIG的IRQ_ENA位,并通过设置IMASK和SIC_IMASK的相应位为定时器中断解除屏蔽。

清除IRQ_ENA位,定时器并不清除TIMILx位。

为了在不允许定时器中断的情况下查询TIMILx位,程序可以设置IRQ_ENA位,屏蔽定时器中断。

当定时器中断使能,确认ISR在执行RTI指令前清除了TIMILx锁存,以保证中断不被重复使用。

在EXT_CLK模式下,为保证不错过任何定时器事件,锁存位需在中断服务程序的最初开始处重置。

为使能定时器中断,设置相应TIMERx_CONFIG的IRQ_ENA位。

注意:

寄存器读写的大小是强制性的。

32位读取TIMERx_CONFIG或者16位读取定时器脉冲宽度、定时器周期、定时器计数寄存器将导致MMR错误。

可以采用16位或者32位读取定时器使能、定时器禁止和定时器状态寄存器。

采用32位读取如上三个寄存器,最高16位全返回0。

1.2.1TIMER_ENABLE寄存器

使能位写1表示使能定时器,写0无效。

支持W1S(write1toset)。

所有不使用的位读取时全返回0。

图63定时器使能寄存器

1.2.2TIMER_DISABLE寄存器

使能位写1表示禁止定时器,写0无效。

支持W1S(write1toset)。

图64定时器禁止寄存器

注意:

在PWM_OUT模式下,TIMER_DISABLE禁止位置1并不立即停止相应定时器,直到当前周期(PERIOD_CNT=1)或脉冲(PERIOD_CNT=0)结束时,定时器才停止。

如果必要,PWM_OUT模式下,DSP通过TIMER_DISABLE相关位写1,然后将TIMER_STATUS的相关TRUNx写1,强行停止定时器。

在WDTH_CAP和EXT_CLK模式下,TIMER_DISABLE写1,相应定时器立即停止。

1.2.3TIMER_STATUS寄存器

定时器中太寄存器用于显示三个定时器的状态。

状态位为黏性位,支持W1C。

在PWM_OUT模式下,定时器在周期结束时停止,TRUNx位可以自清除。

在TIMERx_CONFIG寄存器相应IRQ_ENA位置位后,每个定时器都可产生单一的中断请求信号。

TIMER_STATUS锁存中断,用户可以确定中断源,而不需要参考此单一中断信号。

中断位为黏性位,必须由ISR清除。

结合TIMILx位与TIMERx_CONFIG的IRQ_ENA位确定中断请求。

如果中断条件或者错误发生,IRQ_ENA位置位,然后TIMILx位置位,到内核的中断被确认。

中断可通过系统中断定时器屏蔽,如果中断条件或者错误发生时,IRQ_ENA位被清除,TIMILx位不置位,中断不被确认。

如果TIMILx已经设置,IRQ_ENA为0,TIMILx保持设置,中断等待被确认。

在所有模式中,TRUNx反映定时器使能状态,TRUNx置位,表示其运行,TRUNx清除,表示其停止,反映定时器是否真实运行。

图65定时器状态寄存器

1.2.4TIMERx_CONFIG寄存器

定时器配置寄存器用于指定每个寄存器的运行模式。

当定时器不运行时,TIMERx_CONFIG为只读。

在PWM_OUT模式下禁止定时器后,检查TIMER_STATUS的TRUNx位确认定时器已停止,才可重新设置定时器配置寄存器。

定时器配置寄存器可以在任意时刻读取,ERR_TYP为只读,在重置活和定时器使能时清除。

每当TOVF_ERRx置位,ERR_TYP[1:

0]载入显示所检测到的错误类型代码,其错误类型见下表。

其值直到下个错误发生或者定时器使能时才改变。

图66定时器配置寄存器

1.2.5TIMERx_COUNTER寄存器

定时器计数寄存器为只读寄存器,可在任意时刻读取,定时器使能时由硬件根据配置和模式初始化。

依赖于操作模式,递增计数器可由四个时钟源驱动:

SCLK、TMRx管脚、PF1、PPI_CLK。

当DSP内核由外部仿真调试器读取时,所有代码运行停止。

默认情况下,TIMERx_COUNTER也终止其计数,以保持与软件同步。

当计数停止是,在PWM_OUT下,TMRx波形拓展(电平保持);在WDTH_CAP模式下,测量值不正确;EXT_CLK模式下,TMRx管脚的输入事件可能被遗漏。

所有其它定时器功能,例如寄存器读和写,已确认的中断(除非清除),在WDTH_CAP模式下,TIMERx_PERIOD和TIMERx_WDTH的载入在仿真暂停时保持有效。

某些应用要求定时器在仿真暂停DSP内核时继续计数,设置TIMERx_CONFIG的EMU_RUN位使能这种特性。

图67定时器计数寄存器

1.2.6TIMERx_PERIOD和TIMERx_WIDTH寄存器

注意:

当定时器使能且运行,软件写新的值到定时器周期和定时器脉冲计数器,写入的数存在缓冲中,并不直接更新寄存器,直到当前周期停止(当定时器计数寄存器值等于定时器周期寄存器值)。

定时器周期寄存器和定时器脉冲宽度寄存器随不同工作模式而不同:

Ø在PWM_OUT模式下,此两个寄存器可在运行时更改,因为定时器周期和定时器脉冲宽度(占空比)两个寄存器的值可同时改变。

Ø在WDTH_CAP模式下,定时器周期和定时器脉冲宽度在恰当时刻被捕获。

定时器周期和定时器脉冲宽度寄存器根据相关缓冲同时更新,在此模式下,定时器为只读。

Ø在EXT_CLK模式下,定时器周期寄存器可写,可在运行时更改。

定时器脉冲宽度寄存器不用。

当定时器周期寄存器或者定时器脉冲宽度寄存器未被写入新值,采用前一周期的值。

写入定时器周期寄存器或者定时器脉冲宽度寄存器的值总是存储存储在缓冲寄存器。

读取定时器周期寄存器或者定时器脉冲宽度寄存器总是返回当前值,有效的周期或者脉冲宽度。

写入的值在变为有效值前不能被读取。

当定时器使能,在当前周期结束后,定时器周期和定时器脉冲宽度寄存器才会从其缓冲更新。

当定时器被禁止,写入缓冲寄存器的值立即拷入定时器周期或者定时器脉冲宽度寄存器,这样可以在第一定时器周期时被读取。

例如,改变定时器周期或者定时器脉冲宽度寄存器的值,以便在定时器使能后的前三个定时器周期内采用不同的设置,采用如下过程:

每组设定在定时器中断被接收时进行。

图68定时器周期寄存器

图69定时器宽度寄存器

注意:

在PWM_OUT模式下,对于非常小的周期(小于10次计数),没有足够的时间从缓冲寄存器更新定时器周期寄存器和定时器脉冲宽度寄存器。

下一个周期可能会采用一个老值和一个新值。

为了避免脉冲宽度大于脉冲周期,在值降低时,先写定时器脉冲计数器,后写定时器周期寄存器。

当值增加时,先写定时器周期寄存器,后写定时器脉冲宽度寄存器。

1.3定时器的使用

在使能定时器前,一般先配置TIMERx_CONFIG。

定时器配置寄存器设置了定时器的运行模式、TMRx管脚的极性和定时器中断特性,在运行时不可更改行模式。

定时器被禁止后,定时器计数寄存器保持原状态,当定时器重新使能后,定时器计数寄存器根据当前运行模式重新初始化。

定时器计数寄存器为只读,软件不能直接覆盖或者预设定时器计数值。

1.3.1PWM_OUT模式

当定时器配置寄存器的TMODE(TIMERx_CONFIG)被设置为b#01时,定时器处于PWM_OUT模式,TMRx管脚为输出。

可采用定时器配置寄存器OUT_DIS位禁止其输出,此时TRMx处于三态。

一旦定时器被使能后,定时器计数寄存器载入一个初始值。

如果CLK_SEL=0,定时器计数从0x1开始。

如果CLK_SEL=1,在EXT_CLK模式下,它被设置位0x0。

定时器向上计数到定时器周期寄存器的值。

无论CLK_SEL被设置为何值,当定时器计数等于定时器周期时,定时器计数在下个时钟被设置为0x1。

在PWM_OUT模式,PERIOD_CNT位控制定时器是否产生一个脉冲或多个脉冲。

当PERIOD_CNT被清除(PWM_OUT单脉冲模式),定时器使用TIMERx_WIDTH寄存器,产生一个判定和非判定边缘,然后产生一个中断(如果使能)并终止。

当PERIOD_CNT被设置(PWM连续脉冲模式),定时器采用TIMERx_PERIOD和TIMERx_WIDTH寄存器产生重复波形(可能为调制)。

它在每个周期结束产生一个中断(如果使能),仅仅在禁止时停止。

设置PERIOD_CNT=0,计数到脉冲结束。

PERIOD_CNT=1,计数到周期结束。

1.3.1.1输出管脚禁止

PWM_OUT模式下,输出管脚可以通过设置定时器配置寄存器的OUT_DIS位禁止,此时TMRx为三态。

这样可以在输出信号未用的情况下节省功耗。

1.3.1.2单脉冲的生成

如果PERIOD_CNT位被清除,PWM_OUT模式产生单个脉冲,此模式可以被用作精确延时。

脉冲宽度由定时器脉冲宽度确定,定时器周期寄存器不用。

在脉冲结束时,中断锁存位TIMILx被设置,定时器自动终止。

1.3.1.3脉冲宽度调制波形的生成

若设置PERIOD_CNT位,内部时钟定时器产生定义了周期和占空比的方波,在实时信号处理时,这种模式也可产生周期中断。

32位定时器周期(TIMERx_PERIOD)和定时器脉冲宽度(TIMERx_WIDTH)寄存器可以设置为定时器的计数周期和脉冲宽度调制脉冲输出。

为确定TMRx管脚的输出电平极性,TIMERx_CONFIG的PULSE_HI位置位,则高电平被确认,反之,则低电平被确认。

当定时器被禁止后,在PWM_OUT模式下,TMRx管脚处于位置电平。

如果使能,定时器中断在每个周期结束产生。

ISR必须清除TIMILx,且可能改变周期或者宽度值。

在PWM应用中,软件需要在定时器运行时更新周期和脉冲宽度值。

当然机更新周期或者脉冲宽度值,新的值在本周期结束时从特定缓冲寄存器载入。

当定时器计数值等于定时器周期值时,新值被载入。

当前周期结束前,读取定时器周期和定时器脉冲宽度值时,返回的为旧值。

在TIMERx_WIDTH等于TIMERx_PERIOD值时,尽管会报硬件错误,却仍是一种实现100%占空比PWM模式的有效方法。

如果这么作,软件必须忽略TOVL_ERRx标志。

不推荐脉冲宽度值大于周期值。

TIMERx_WIDTH=0为非法操作,不支持占空比为0%。

1.3.1.4PWM_OUT模式下停止定时器

当被禁止后,定时器自动完成当前波形,然后停止。

这样避免了当前波形被截断,以及TMRx管脚出现非法PWM模式。

DSP通过查询TIMEr_STATUS的TRUNx位来确定定时器是否停止或等待最后中断。

在定时器停止,且TRUNx变为0之前,不能重新配置定时器。

在PWM_OUT单脉冲模式(PERIOD_CNT=0)下,不需要写TIMER_DISABLE来停止定时器。

在脉冲结束时,定时器自动停止,TIMER_ENABLE相应位自动清除,相应TRUNx位也自动清除。

为产生多个脉冲,在TIMER_ENABLE写入1,当定时器停止时,重新写入1。

如果需要,PWM_OUT模式下,处理器可强行停止定时器。

首先在TIMER_DISABLE相应位写入1,然后在TIMER_STATUS的相应TRUNx写入1。

这个特性可以在错误发生时立即重新获取对定时器的控制。

要小心使用此特征,因为这可能破坏PWM模式。

定时器默认由内部SCLK作为时钟。

若设置CLK_SEL位,则定时器将PWM_CLK作为时钟,PWM_CLK通常采用PF1管脚作为输入,当然,当配置与PPI协同工作,也可能采用PPI_CLK管脚。

在PWM_OUT连续脉冲模式(PERIOD_CNT=1),每个定时器在每个周期结束时采样其TIMENx位。

当TIMENx为低电平时,脉冲在第一个周期结束时停止。

软件禁止PWM_OUT定时器后,等待其自行停止。

定时器总是在第一个周期结束时停止(PERIOD_CNT=0)。

1.3.1.5外部时钟PWM_OUT

定时器默认由内部SCLK作为时钟。

若设置CLK_SEL位,则定时器将PWM_CLK作为时钟,PWM_CLK通常采用PF1管脚作为输入,当然,当配置与PPI协同工作,也可能采用PPI_CLK管脚。

PWM_CLK不需要为50%占空比,但其最小周期必须为1个SCLK。

PF1管脚只有在PF1为输入时才能作为定时器时钟驱动。

对于任意定时器,PWM_OUT模式下,CLK_SEL=1和TIN_SEL=0时,FIO_DIR的PF1位被忽略,PF1强制成为输入管脚。

1.3.2WDTH_CAP模式

在WDTH_CAP模式下,TMRx为输入管脚。

内部时钟用作计算外部方波的的周期和脉冲宽度。

将TIMERx_CONFIG寄存器中MODE_FIELD设置为b#10将使能该模式。

使能改模式时,定时器重置TIMERx_COUNTER为0x00000001,检测到TMRx管脚的有效沿开始递增计数。

当检测到后沿,定时器将TIMERx_COUNTER寄存器的值写入宽度缓冲寄存器中。

在此模式下,软件可同时测量波形的脉冲宽度和周期。

为了控制前沿和后沿的定义,设定或者清除TIMERx_CONFIG寄存器的PULSE_HI位。

当PULSE_HI被清除时,从下降沿开始测量,在上升沿定时器计数寄存器被捕获到定时器脉冲宽度计数器,定时器周期在下一个下降沿被捕获。

当PULSE_HI被设置时,上升沿开始测量,下降沿定时器计数寄存器被捕获到定时器脉冲宽度计数器,定时器周期在下一个上升沿被捕获。

在WDTH_CAP模式下,同一单元在同意时刻总是发生如下三个事件:

1、TIMERx_PERIOD寄存器由周期缓冲寄存器更新。

2、TIMERx_WIDTH寄存器从宽度缓冲寄存器更新。

3、定时器中断锁存位(TIMILx)获取设定,但不产生错误。

TIMLx和TOVF_ERRx位为黏性位,必须用软件清除。

1.3.2.1自动波特率检测模式

任一通用定时器皆可为UART提供自动波特率检测。

在WDTH_CAP模式下,定时器配置寄存器输入选择位TIN_SEL使得定时器采样UART接受数据管脚(RX),而非TMRx管脚。

注意:

不要使能UART,直到自动波特率检测完毕。

软件程序可以测量串行数据线(RX)上接收到的串行数据位的宽度。

因为定时器的采样基线与UART操作同步(都是从PLL引出),脉冲宽度可以用来计算UART波特率的分频比:

为了增加定时器计数,从而提高捕获信号的分辨率,不建议测量单个字节,而是测量更多的字节。

典型的采用NULL字符(ASCII0x00)作为自动波特率检测。

图70自动波特率检测字符0x00

由于上图包含了8位数据位和1位开始位,采用如下攻势计算:

实际的UARTRX信号通常具有不对称上升和下降沿,采样逻辑电平并不恰好在信号电压范围的中间。

在高字节速率,如基于脉冲宽度自动波特率检测在没有足够模拟信号条件的情况下可能无法返回足够的结构。

测量信号周期可以解决此问题。

例如,预定义ASCII符号’@’(40h)作为波特率检测字符,测量两个子下降沿的周期,如下图,在开始位的下降沿和第6bit的下降沿作为测量周期,因为包含8个字符,采用如下公式:

图71自动波特率检测字符0x40

1.3.3外部事件模式

在外部事件模式下,TMRx作为输入管脚。

定时器用作任意外部时钟的计数器。

外部时钟可以与系统时钟异步。

此时,TIMERx_COUNTER的当前计数值为检测到的事件的有效沿。

当TIMERx_CONFIG寄存器的TMODE被设置为b#11时,定时器处于该模式。

TIMERx_PERIOD寄存器设置为计时器外部计数最大值。

TMRx管脚的波形不需占空比为50%,但是TMRx最小低电平事件为一个SCLK周期,最小高电平事件为一个SCLK周期。

这意味着其最大频率为SCLK/2。

在定时器被使能后,定时器计数寄存器被重置为另,然后等待TMRx管脚的第一个有效沿。

该有效沿使得定时器计数寄存器递增为0x1。

随后的每个有效沿使得定时器计数寄存器递增。

当达到周期值时,设置TIMILx位,中断产生。

定时器继续计数,直到其被禁止。

PULSE_HI位确定有效沿是否为上升沿(PULSE_HI设置)还是下降沿(PULSE_HI被清除)。

在该模式下,TIN_SEL和PERIOD_CNT无效。

如果起始时定时器计数器从0xFFFFFFFF回绕为0或者Period=0,或者当定时器计数寄存器反转(从Count=Period到Count=0x1)时,TOVF_ERRx和ERR_TYP位被设置。

此时不用定时器脉冲宽度寄存器。

1.3.4定时器与PPI结合使用

采用两个定时器在PPI模式下产生帧同步信号。

详细细节请看11-28。

1.3.5中断

三个定时器任一个可以产生单个中断。

TIMER_STATUS寄存器所存定时器中断,为软件提供中断源判别。

必须在RTI前清除,避免中断重复使用。

系统中断控制器采用灵活中断处理。

所有定时器可以采用或不采用相同中断通道,这样单个中断服务程序可响应多于一个定时器。

在PWM模式下,多个定时器采用相同的周期设置运行,同时发布其中断请求。

在此情况下,服务程序清除所有TIMILx位。

如果中断使能,在RTI指令执行前,确保ISR清除了TIMILx位。

记住,写系统定时器具有延时。

如果少量指令从RTI指令前清除TIMILx,在其前面假如SSYNC指令。

在EXT_CLK模式下,每次ISR最初始处清除TIMILx位(TIMERx_STATUS),避免丢失任何定时器事件。

1.3.6非法状态

细节见表15-1,定义如下:

Ø启动:

在通过写TIMER_ENABLE使能定时器后,定时器计数器运行的第一个时钟周期。

ØROLLOVER:

当前计数与TIMERx_PERIOD匹配时,计数器重置位1。

Ø溢出:

当计数器计数值可能达到最大值0xFFFFFFFF,计数器计数值继续增加,而不是ROLLOVER。

计数值继续递增时,不可能变为更大的值,故错误地重新载入新的值0x00000000。

Ø未改变:

无新的错误。

✓当ERR_TYP不变,如果在定时器使能后未发生新的错误,表明为前一个错误码或者00。

✓当TOVF_ERR不便,如果定时器使能后为发生新的错误或者软件采用W1C清除以前的错误,其读数为0。

如果以前的错误不被软件确认,TOVF_ERR读数为1。

1.4内核定时器

内核定时器是一个可编程的定时器,它能产生周期性的中断。

内核定时器工作在内核时钟下。

1.4.1TCNTL寄存器

当定时器通过设置TCNTL的TMREN使能,TCOUNT寄存器每TSCALE+1个时钟周期递减1。

当TCOUNT变为0,中断产生,TCNTL的TINT位置位。

如果TCNTL的TAUTORLD位置位,TCOUNT从TPERIOD寄存器载入新值,计数重新开始。

清除TMPWR位可以使得内核定时器进入低功耗模式。

采用此定时器前,设置TMPWR位。

这将还原定时器单元。

当TMPWR置位,,可通过设置TMREN位使能内核定时器。

如果在TMPWR=0时设置TMREN,硬件特性未知。

图72内核定时器控制寄存器

1.4.2TCOUNT寄存器

内核定时器计数寄存器(TCOUNT)每TSCALE+1时钟循环递减。

当TCOUNT变为0时,中断产生,并设置TCNTL寄存器位TINT。

图73内核定时器计数寄存器

1.4.3TPERIOD寄存器

当允许自动载入,无论TCOUNT是否为零,TCOUNT寄存器自动载入TPERIOD的值。

注意:

为了保证TPERIOD寄存器有效,TPERIOD和TCOUNT寄存器在第一次写其中任一寄存器时,同时初始化。

如果在第一计数周期需要写入不同的值,先写TPERIOD,后写TCOUNT。

图74内核定时器周期寄存器

1.4.4TSCALE寄存器

TSCALE存储标度值,此值小于TCOUNT的TCOUNT递减一次所需的循环数。

如,当TSCALE=0,计数寄存器每个时钟周期递减,如果SCALE=1,计数器每两个时钟周期递减。

图75内核定时器标度寄存器

1.5看门狗定时器

DSP包含一个32位的,可用于实现软件看门狗功能的定时器。

在软件刷新之前,若定时器计数满,软件看门狗可发送一个事件给DSP内核,从而提高系统的可靠性。

根据看门狗定时器的编程,产生的时间可以是复位、非可屏蔽或者通用中断。

看门狗定时器工作在系统时钟下。

1.5.1看门狗定时器的操作

使用看门狗定时器需遵循如下步骤:

Ø通过写WDOG_CNT的值设置看门狗定时器的计数值。

注意,当看门狗未使能时,WDOG_CNT的载入将同时载入WDOG_STA

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1