XCORE资源与硬件配置 `xs1.h`
该文档包含了用于访问XS1-XS3系列硬件的函数库xs1.h。其中提供的函数能够执行对时钟、端口、通道、节点、Tile、逻辑核心以及外围设备等低级硬件组件的操作。
要使用这些函数,请在程序中添加:
#include <xs1.h>
时钟配置函数
以下函数用于配置时钟和端口,以实现嵌入式系统中的同步和时钟输出。
void configure_port_clock_output()
配置一个1位端口以输出时钟信号。如果端口不是1位端口,则会引发异常。在此模式下配置端口后进行输入或输出会导致不确定的行为。
参数:
void port p- 要配置的1位端口。const xcore_clock_t clk- 要输出的时钟。
void start_port()
激活一个端口并清除该端口使用的缓冲区。
参数:
void port p- 要激活的端口。
另请参阅:
void stop_port()
停用一个端口,并将其重置为非就绪状态。
参数:
void port p- 要停用的端口。
另请参阅:
void configure_clock_src()
配置时钟使用1位端口作为其源,允许端口的I/O操作与外部时钟信号同步。如果端口不是1位端口,则会引发异常。
参数:
xcore_clock_t clk- 要配置的时钟。void port p- 用作时钟源的1位端口。
另请参阅:
configure_clock_refconfigure_clock_xcoreconfigure_clock_rateconfigure_clock_rate_at_leastconfigure_clock_rate_at_most
void configure_clock_src_divide()
此函数用于配置时钟,使其能够以1位端口作为时钟源,并设置分频因子。
该函数负责设置一个时钟块,让它从1位端口派生其时钟信号,并可以选择性地设置分频因子。如果divide参数设置为零,则1位端口将直接为时钟块提供时钟信号。若divide参数非零,则由1位端口提供的时钟信号会被分频。此函数仅适用于XS2设备,若端口不是1位端口,则会抛出异常。
参数说明:
xcore_clock_t clk- 需要配置的时钟。void port p- 作为时钟源的1位端口。unsigned char divide- 时钟信号的分频因子。
参考链接:
configure_clock_refconfigure_clock_xcoreconfigure_clock_rateconfigure_clock_rate_at_leastconfigure_clock_rate_at_most
void configure_clock_ref()
此函数用于将某个时钟的源配置为参考时钟。
通过调用此函数,可以将时钟源指定为参考时钟。如果divide参数被设置为零,则会直接采用参考时钟的频率。如果不为零,则采用的频率为参考时钟频率除以。默认情况下,参考时钟被设置为运行在100 MHz的频率。
参数说明:
xcore_clock_t clk- 需要配置的时钟。unsigned char divide- 时钟分频系数。
参见:
configure_clock_srcconfigure_clock_xcoreconfigure_clock_rateconfigure_clock_rate_at_leastconfigure_clock_rate_at_most
void configure_clock_xcore()
此函数用于将时钟的源配置为xCORE Tile 时钟。
所使用的频率为xCORE Tile 时钟的频率除以。若divide参数被设置为零,则会抛出异常。
参数说明:
xcore_clock_t clk- 需要配置的时钟。unsigned char divide- 时钟分频系数。
参见:
configure_clock_refconfigure_clock_srcconfigure_clock_rateconfigure_clock_rate_at_leastconfigure_clock_rate_at_most
void configure_clock_rate()
此函数用于配置时钟,使其以 MHz的速率运行。
通过此函数可以设置时钟运行在特定的速率,即a除以b的商值,单位为MHz 。如果硬件不支持指定的速率,将会抛出异常。支持的速率包括参考时钟频率(ref MHz)以及形式为 MHz或 MHz的速率,这里的ref代表参考时钟频率,tileclk代表xCORE Tile 频率,而n的取值范围为1至255(含)。
参数说明:
xcore_clock_t clk- 需要配置的时钟。unsigned a- 期望速率的分子。unsigned b- 期望速率的分母。
参见:
configure_clock_srcconfigure_clock_refconfigure_clock_xcoreconfigure_clock_rate_at_leastconfigure_clock_rate_at_most
void configure_clock_rate_at_least()
此函数用于将时钟配置为至少达到指定的MHz速率,同时不超过硬件支持的最慢速率。
它将时钟clk的运行速率设置为硬件所能支持的最慢速率,但这个速率不低于a与b MHz的比值。如果找不到符合这一条件的速率,将会抛出异常。
参数说明:
xcore_clock_t clk- 需要配置的时钟。unsigned a- 期望速率的分子。unsigned b- 期望速率的分母。
参见:
configure_clock_srcconfigure_clock_refconfigure_clock_xcoreconfigure_clock_rateconfigure_clock_rate_at_most
void configure_clock_rate_at_most()
此函数用于将时钟配置为不超过指定的MHz速率的最快非零速率,同时是硬件所能支持的速率。
它将时钟clk的运行速率设置为硬件所能支持的最快非零速率,但这个速率不高于a与b MHz的比值。如果找不到符合这一条件的速率,将会抛出异常。
参数说明:
xcore_clock_t clk- 需要配置的时钟。unsigned a- 期望速率的分子。unsigned b- 期望速率的分母。
参见:
configure_clock_srcconfigure_clock_refconfigure_clock_xcoreconfigure_clock_rateconfigure_clock_rate_at_least
void set_clock_src()
将时钟源设置为1位端口。
此函数使用SETCLK指令来配置时钟源,要求指定的端口是1位端口。如果端口不是1位的,或者如果时钟之前被配置为非零除数,则会引发异常。通常建议使用configure_clock_src()代替,因为它没有除数问题。
参数:
xcore_clock_t clk- 要配置的时钟。void port p- 作为时钟源的1位端口。
另请参阅:
void set_clock_ref()
将时钟源设置为参考时钟。
此函数使用SETCLK指令将时钟源配置为参考时钟,并保持时钟除数不变。
参数:
xcore_clock_t clk- 要配置的时钟。
另请参阅:
void set_clock_xcore()
将时钟源设置为xCORE Tile 时钟。
这对应于在时钟上使用SETCLK指令。时钟除数保持不变。
参数:
xcore_clock_t clk- 要配置的时钟。
另请参阅:
configure_clock_rateconfigure_clock_rate_at_leastconfigure_clock_rate_at_mostconfigure_clock_xcore
void set_clock_div()
设置时钟的分频值。
这对应于使用SETD指令。如果时钟源不是参考时钟或XS1设备上的xCORE Tile 时钟,或者当源是xCORE Tile 时钟且分频值设置为零时,会引发异常。非零分频意味着源频率被2 * divide除。
参数:
xcore_clock_t clk- 要配置的时钟。unsigned char div- 要使用的分频值。
另请参阅:
configure_clock_rateconfigure_clock_rate_at_leastconfigure_clock_rate_at_mostconfigure_clock_refconfigure_clock_xcore
void set_clock_rise_delay()
设置时钟上升沿的延迟。
时钟的每个上升沿都会延迟n个处理器时钟周期。延迟必须设置在0到512(含)的范围内。
参数:
xcore_clock_t clk- 要配置的时钟。unsigned n- 延迟时钟上升沿的处理器时钟周期数。
另请参阅:
void set_clock_fall_delay()
设置时钟下降沿的延迟。
时钟的每个下降沿都会延迟n个处理器时钟周期。延迟可以设置在0到512(含)的范围内。
参数:
xcore_clock_t clk- 要配置的时钟。unsigned n- 延迟时钟下降沿的处理器时钟周期数。
另请参阅:
void set_port_clock()
将时钟附加到指定端口。
此函数对应于在端口上使用SETCLK指令。时钟的边沿用于采样和输出数据。通常建议使用configure_*_port_*函数,因为这些函数能保证端口配置的变更,按照正确的顺序完成。
参数:
void port p- 要配置的端口。const xcore_clock_t clk- 要附加的时钟。
另请参阅:
configure_in_port_handshakeconfigure_out_port_handshakeconfigure_in_port_strobed_masterconfigure_out_port_strobed_masterconfigure_in_port_strobed_slaveconfigure_out_port_strobed_slaveconfigure_in_portconfigure_out_port
void set_port_ready_src()
此函数将一个1位端口设置为另一个端口的就绪输出(ready-out)。这相当于在端口上执行SETRDY指令。如果就绪输出端口不是1位端口,则会抛出异常。就绪输出端口的作用是指示相应端口已准备好进行数据传输。
通常,推荐使用configure_*_port_*系列函数来进行端口配置,因为它们可以确保所有必要的配置更改都按照正确的顺序完成,以达到预期的模式。
参数:
void port ready- 作为就绪输出信号的1位端口。void port p- 需要配置的端口。
另请参阅:
configure_in_port_handshakeconfigure_out_port_handshakeconfigure_in_port_strobed_masterconfigure_out_port_strobed_master
void set_clock_ready_src()
此函数设置时钟,以使用1位端口作为就绪输入(ready-in)信号。这相 当于在时钟上执行SETRDY指令。如果端口不是1位端口,则会抛出异常。就绪输入端口负责控制何时从引脚采集数据。
通常,推荐使用configure_*_port_*系列函数来进行端口配置,因为它们可以确保所有必要的配置更改都按照正确的顺序完成,以达到预期的模式。
参数:
xcore_clock_t clk- 需要配置的时钟。void port ready- 作为就绪输入信号的1位端口。
另请参阅:
configure_in_port_handshakeconfigure_out_port_handshakeconfigure_in_port_strobed_slaveconfigure_out_port_strobed_slave
void set_clock_on()
此函数用于开启一个时钟。时钟会被初始化为默认状态。如果时钟已经处于开启状态,那么它会被重置为默认状态。
参数:
xcore_clock_t clk- 需要开启的时钟。
另请参阅:
void set_clock_off()
此函数用于关闭一个时钟。如果时钟已经是关闭状态,那么不会执行任何操作。在时钟关闭时尝试使用它 ,将会抛出异常。
参数:
xcore_clock_t clk- 需要关闭的时钟。
另请参阅:
void start_clock()
此函数将时钟置于运行状态。只有在置于此状态之后,时钟才会开始产生时钟边沿。所有连接到此时钟的端口的计数器都会被重置为0。
参数:
xcore_clock_t clk- 需要置于运行状态的时钟。
另请参阅:
void stop_clock()
此函数会等待时钟变为低电平,然后将其置于停止状态。在停止状态下,时钟不会产生任何边沿。
参数:
xcore_clock_t clk- 需要置于停止状态的时钟。
另请参阅:
定时器函数
void elate()
如果指定时间小于参考时间,则引发ET_ECALL异常。
参数:
unsigned int time– [输入] 时间值。
XS2A/XS3A特殊处理:
#if defined(__XS2A__) || defined(__XS3A__)
#define elate(t) __builtin_elate(t)
#endif
端口配置函数
以下函数用于配置XS1和XS2设备上端口行为的各个方面。
void configure_in_port_handshake()
此函数用于将缓冲端口设置为握手模式的时钟输入端口。
该函数的作用是初始化缓冲端口,使其能够在握手模式下工作。如果ready-in或ready-out端口不是单比特端口,系统将抛出异常。当端口缓冲区未满时,ready-out端口会在时钟的下降沿被激活。只有当ready-in和ready-out端口同时被激活时,端口才会在其采样边沿对引脚进行采样。
默认情况下,端口的采样边沿是时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。
参数说明:
void port p- 需要设置的缓冲端口。in port readyin- 作为就绪输入信号的单比特端口。out port readyout- 作为就绪输出信号的单比特端口。xcore_clock_t clk- 用于配置端口的时钟信号。
相关函数:
configure_out_port_handshakeconfigure_in_port_strobed_masterconfigure_out_port_strobed_masterconfigure_in_port_strobed_slaveconfigure_out_port_strobed_slaveconfigure_in_portconfigure_out_portset_port_no_sample_delayset_port_sample_delay
void configure_out_port_handshake()
此函数用于将缓冲端口设置为握手模式的时钟输出端口。
如果ready-in或ready-out端口不是单比特端口,将会抛出异常。端口会持续在其引脚上输出初始值,直至有输出语句改变这一输出值。在缓冲端口的采样时钟边沿,会读取ready-in端口的值。如果在前一个时钟周期内ready-in端口的值为高,则在下一个时钟的下降边沿输出数据。同时,在时钟的下降边沿,如果有数据输出,则ready-out端口会被置为高电平,否则为低电平。
默认情况下,端口的采样边沿是时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。
参数说明:
void port p- 需要配置的缓冲端口。in port readyin- 用作ready-in信号的单比特端口。out port readyout- 用作ready-out信号的单比特端口。xcore_clock_t clk- 用于配置端口的时钟源。unsigned initial- 端口上的初始输出值。
参见:
configure_in_port_handshakeconfigure_in_port_strobed_masterconfigure_out_port_strobed_masterconfigure_in_port_strobed_slaveconfigure_out_port_strobed_slaveconfigure_in_portconfigure_out_portset_port_no_sample_delayset_port_sample_delay
void configure_in_port_strobed_master()
此函数用于将缓冲端口设置为strobed master模式的时钟输入端口。
如果ready-out端口不是单比特端口,将会抛出异常。当端口缓冲区未满时,ready-out端口会在时钟的下降边沿被置为有效状态。在ready-out端口有效后的下一个采样边沿,端口会采样其引脚上的信号。
默认情况下,端口的采样边沿是时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。
参数说明:
void port p- 需要配置的缓冲端口。out port readyout- 用作ready-out信号的单比特端口。const xcore_clock_t clk- 用于配置端口的时钟源。
参见:
configure_in_port_handshakeconfigure_out_port_handshakeconfigure_out_port_strobed_masterconfigure_in_port_strobed_slaveconfigure_out_port_strobed_slaveconfigure_in_portconfigure_out_portset_port_no_sample_delayset_port_sample_delay
void configure_out_port_strobed_master()
配置缓冲端口为脉冲主模式的时钟输出端口。
此函数将缓冲端口设置为脉冲主模式,用于输出时钟信号。如果ready-out端口不是单比特端口,将会抛出异常。端口将在其引脚上输出初始值,直至输出操作更改该值。输出值将在下一个时钟周期的下降沿被更新。在时钟的下降沿,如果输出操作发生在该边沿,则ready-out端口将输出高电平,否则输出低电平。
参数说明:
void port p- 需要配置的缓冲端口。out port readyout- 用于输出就绪信号的单比特端口。const xcore_clock_t clk- 用于配置端口的时钟源。unsigned initial- 端口上的初始输出值。
参见:
configure_in_port_handshakeconfigure_out_port_handshakeconfigure_in_port_strobed_masterconfigure_in_port_strobed_slaveconfigure_out_port_strobed_slaveconfigure_in_portconfigure_out_port
void configure_in_port_strobed_slave()
配置缓冲端口为脉冲从模式的时钟输入端口。
此函数将缓冲端口设置为脉冲从模式,用于输入时钟信号。如果ready-in端口不是单比特端口,将会抛出异常。当ready-in信号为高电平时,端口将在其采样边沿采样引脚状态。默认情况下,采样边沿为时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。
参数说明:
void port p- 需要配置的缓冲端口。in port readyin- 用于输入就绪信号的单比特端口。xcore_clock_t clk- 用于配置端口的时钟源。
参见:
configure_in_port_handshakeconfigure_out_port_handshakeconfigure_in_port_strobed_masterconfigure_out_port_strobed_masterconfigure_out_port_strobed_slaveconfigure_in_portconfigure_out_portset_port_no_sample_delayset_port_sample_delay
void configure_out_port_strobed_slave()
配置缓冲端口为脉冲从模式的时钟输出端口。
此函数将缓冲端口设置为脉冲从模式,用于输出时钟信号。如果ready-in端口不是单比特端口,将会抛出异常。端口将在其引脚上输出初始值,直至输出操作更改该值。ready-in端口的状态将在端口的采样边沿被读取,而输出操作将在下一个时钟周期的下降沿更新,前提是ready-in端口在该边沿读取的值为高电平。默认情况下,采样边沿为时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。
参数说明:
void port p- 需要配置的缓冲端口。in port readyin- 用于输入就绪信号的单比特端口。xcore_clock_t clk- 用于配置端口的时钟源。unsigned initial- 端口上的初始输出值。
参见:
configure_in_port_handshakeconfigure_out_port_handshakeconfigure_in_port_strobed_masterconfigure_out_port_strobed_masterconfigure_in_port_strobed_slaveconfigure_in_portconfigure_out_portset_port_no_sample_delayset_port_sample_delay
void configure_in_port()
配置端口为无就绪信号的时钟输入端口。
此函数用于将端口(无论是缓冲还是非缓冲)设置为无需就绪信号即可操作的时钟输入端口。端口将在其采样边沿上采样引脚状态。如果端口是非缓冲的,可以通过执行输出操作来改变其方向,这将在下一个时钟周期的下降沿发生。之后,端口将作为无就绪信号的输出端口操作。
默认情况下,端口的采样边沿为时钟的上升沿,但可以通过set_port_sample_delay()函数进行修改。
参数说明:
void port p- 需要配置的端口。const xcore_clock_t clk- 用于配置端口的时钟源。
参见:
configure_in_port_handshakeconfigure_out_port_handshakeconfigure_in_port_strobed_masterconfigure_out_port_strobed_masterconfigure_in_port_strobed_slaveconfigure_out_port_strobed_slaveconfigure_out_portset_port_no_sample_delayset_port_sample_delay
void configure_in_port_no_ready()
configure_in_port()的同义函数。
参见:
void configure_out_port()
配置端口为无就绪信号的时钟输出端口。
此函数用于将端口(无论是缓冲还是非缓冲)设置为无需就绪信号即可操作的时钟输出端口。端口将在其引脚上输出初始值,直至输入或输出操作更改该值。输出将在下一个时钟周期的下降沿更新,且每个端口宽度的数据位将保持一个时钟周期。如果端口是非缓冲的,在任何待处理的输出保持一个时钟周期后,可以执行输入操作来改变方向。之后,端口将作为无就绪信号的输入端口操作。
参数说明:
void port p- 需要配置的端口。const xcore_clock_t clk- 用于配置端口的时钟源。unsigned initial- 端口上的 初始输出值。
参见:
configure_in_port_handshakeconfigure_out_port_handshakeconfigure_in_port_strobed_masterconfigure_out_port_strobed_masterconfigure_in_port_strobed_slaveconfigure_out_port_strobed_slaveconfigure_in_port
void configure_out_port_no_ready()
configure_out_port()的同义函数。
参见:
void set_port_use_on()
此函数用于开启一个端口。端口会被初始化为其类型默认的状态。如果端口已经是开启状态,那么它会被重置为默认状态。
参数:
void port p- 需要开启的端口。
另请参阅:
void set_port_use_off()
此函数用于关闭一个端口。如果端口已经是关闭状态,那么不会执行任何操作。在端口关闭时尝试使用它,将会抛出异常。
参数:
void port p- 需要关闭的端口。
另请参阅:
void set_port_mode_data()
此函数将端口配置为数据端口。这是端口的默认状态。端口的输出操作用于控制其输出信号。
参数:
void port p- 需要配置的端口。
另请参阅:
void set_port_mode_clock()
此函数用于将单比特端口配置为时钟输出端口。该端口会输出其所连接的时钟信号。如果该端口不是单比特端口,将会抛出异常。若要将端口恢复到其默认状态,可以使用set_port_mode_data()函数。
参数:
void port p- 需要配置的端口。
参见:
void set_port_mode_ready()
此函数用于将单比特端口配置为就绪信号输出端口。端口将输出通过set_port_ready_src()设置的相关端口的就绪信号。如果该端口不是单比特端口,将会抛出异常。若要将端口恢复到其默认状态,可以使用set_port_mode_data()函数。
通常,推荐使用configure_*_port_*系列函数进行端口配置,因为这些函数能保证所有必要的配置更改都按照正确的顺序完成,以达到预期的模式。
参数:
void port p- 需要配置的端口。
参见:
set_port_mode_dataset_port_mode_clockset_port_ready_srcconfigure_in_port_handshakeconfigure_out_port_handshakeconfigure_in_port_strobed_masterconfigure_out_port_strobed_master
void set_port_drive()
此函数用于将端口配置为驱动模式。在此模式下,端口输出的值会直接驱动到引脚上。这是端口的默认驱动状态。调用set_port_drive()会副作用地禁用端口的上拉或下拉电阻。
参数:
void port p- 需要配置的端口。
参见:
void set_port_drive_low()
此函数用于将端口配置为低电平驱动模式。在此模式下,当向引脚输出0时,它会被驱动为低电平;输出1时,则不驱动任何电平。对于XS1设备,如果端口不是单比特端口,向该端口输出的结果是未定义的。在XS2和XS1-G设备上,调用set_port_drive_low()会副作用地启用端口的内部上拉电阻。而在XS1-L设备上,调用set_port_drive_low()会启用端口的内部下拉电阻。
参数:
void port p- 需要配置的端口。
参见:
void set_port_drive_high(void port p)
配置端口为高驱动模式。当向引脚输出1时,它被驱动为高电平;当输出0时,不产生任何输出。在XS2设备上,此函数还会启用端口的内部下拉电阻。此函数在XS1设备上不可用。
void port p: 要配置的端口。
另请参阅:
void set_port_pull_up(void port p)
启用端口的内部上拉电阻,确保当没有任何信号驱动引脚时,端口采样到的值为1。在XS2和XS1-G设备上,这也会将端口配置为低驱动模式。在XS1-L设备上,上拉电阻不可用,如果调用此函数将会引发异常。
void port p: 要配置的端口。
另请参阅:
void set_port_pull_down(void port p)
启用端口的内部下拉电阻,确保当没有任何信号驱动引脚时,端口采样到的值为0。在XS2设备上,这会将端口配置为高驱动模式。在XS1-G设备上,下拉电阻不可用,如果调用此函数将会引发异常。在XS1-L设备上,这也会将端口配置为低驱动模式。
void port p: 要配置的端口。
另请参阅:
void set_port_pull_none(void port p)
禁用端口的上拉或下拉电阻,这会导致端口配置为驱动模式。
void port p: 要配置的端口。
另请参阅:
void set_port_master(void port p)
将端口设置为主模式。通常使用值XS1_SETC_MS_MASTER和SETC指令来完成此操作。通常最好使用函数configure_in_port_strobed_master()和configure_out_port_strobed_master(),因为它们确保所有必需的配置更改按正确顺序进行。
void port p: 要配置的端口。
另请参阅:
void set_port_slave(void port p)
将端口设置为从模式。通常使用值XS1_SETC_MS_SLAVE和SETC指令来完成此操作。通常最好使用函数configure_in_port_strobed_slave()和configure_out_port_strobed_slave(),因为它们确保所有必需的配置更改按正确顺序进行。
void port p: 要配置的端口。
另请参阅:
void set_port_no_ready(void port p)
配置端口不使用准备信号。通常使用值XS1_SETC_RDY_NOREADY和SETC指令来完成此操作。通常最好使用函数configure_in_port()和configure_out_port(),因为它们确保所有必需的配置更改按正确顺序进行。
void port p: 要配置的端口。
另请参阅:
void set_port_strobed(void port p)
将端口设置为 strobed 模式。通常使用值XS1_SETC_RDY_STROBED和SETC指令来完成此操作。通常最好使用configure_*_port_strobed_*函数,因为它们确保所有必需的配置更改按正确顺序进行。
void port p: 要配置的端口。
另请参阅:
configure_in_port_strobed_masterconfigure_out_port_strobed_masterconfigure_in_port_strobed_slaveconfigure_out_port_strobed_slave
void set_port_handshake(void port p)
将端口设置为握手模式。通常使用值XS1_SETC_RDY_HANDSHAKE和SETC指令来完成此操作。通常最好使用configure_*_port_handshake函数,因为它们确保所有必需的配置更改按正确顺序进行。
void port p: 要配置的端口。
另请参阅: