公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

TC275调试日志——最小系统搭建:时钟输出函数

TC275调试日志——最小系统搭建:时钟输出函数

凌风2018_版主_
Level 4

今天我们来介绍一下外部时钟输出,就是通过EXTCLK0和/EXTCLK1两个引脚输出系统或者其他模块的时钟,其结构见图如图1所示:

时钟输出简图.png

图1:时钟输出简图

我们以下的讨论以EXTCLK0为例。如图所示通过调整位域EXTCON.SEL0 可以选择输出的时钟源,包括SPB、SRI、PLL、OSC、ETH等。然后位EXTCON.EN0 用来使能外部时钟输出,位EXTCON.NSEL则用来确定输出是否翻转。

寄存器EXTCON的illd定义如下:

typedef union

{

    unsigned int U;//这个是定义成无符号整型;

    signed int I;//这个是定义成有符号整型;

    Ifx_SCU_EXTCON_Bits B;//位及位域定义;

} Ifx_SCU_EXTCON;

       有些读者问过说联合结构体里面整型有一个就够了,为什么这里要定义为两个?这里的区别就是一个是有符号的一个是无符号的,也就是说I相比于U其首位是符号,具体的实际应用还不清楚,等我们遇到的时候再说。

       

typedef struct _Ifx_SCU_EXTCON_Bits

{

    unsigned int EN0:1;   //EXTCON0使能;

    unsigned int reserved_1:1; //保留位

    unsigned int SEL0:4; //EXTCLK0输出时钟源选择(0-15)

    unsigned int reserved_6:10; //保留位

    unsigned int EN1:1; //EXTCON1使能;

    unsigned int NSEL:1;   //输出翻转

    unsigned int SEL1:4;  //EXTCLK1输出时钟源选择(0-15)

    unsigned int reserved_22:2; //保留位

    unsigned int DIV1:8;  //当输出为SPB时的时钟分频fOUT = fSPB/(DIV1+1) (0-255)

} Ifx_SCU_EXTCON_Bits;

以上这些便是时钟输出寄存器的代码配置,这些事ILLD给出来的,但是时钟输出函数我没有找到,所以接下来我们将自行编写。

(1)数据类型定义,包括时钟选择,SPB分频因子,输出翻转选择。

首先我们定义输出时钟选择,定义为枚举类型,如下:

typedef enum

{

    IfxScuCcu_EXTCLK_fout     = 0,

    IfxScuCcu_EXTCLK_fpll     = 1,

    IfxScuCcu_EXTCLK_fPLLERAY   = 2,

    IfxScuCcu_EXTCLK_fosc0     = 3,

    IfxScuCcu_EXTCLK_fETH     = 5,

    IfxScuCcu_EXTCLK_fSRI     = 8,

    IfxScuCcu_EXTCLK_fSPB     = 9,

    IfxScuCcu_EXTCLK_fSTM     = 11,

    IfxScuCcu_EXTCLK_fMT0     = 15

} IfxScuCcu_EXTCLK_SEL;

IfxScuCcu_EXTCLK_SEL IfxScuCcu_EXTCLK_sel;


然后定义SPB的分频因子:

uint8 IfxScuCcu_EXTCLK_SpbDiv;


接下来定义输出类型选择,定义为枚举类型:

typedef enum

{

    IfxScuCcu_EXTCLK_NSEL_INV     = 0,

    IfxScuCcu_EXTCLK_NSEL_NINV     = 1,

} IfxScuCcu_EXTCLK_NSEL;

IfxScuCcu_EXTCLK_NSEL IfxScuCcu_EXTCLK_nsel;


(2)编写函数体

现在我们可以编写函数体了

void IfxScuCcu_CLKout(IfxScuCcu_EXTCLK_SEL extclksel, uint8 spbdiv, IfxScuCcu_EXTCLK_NSEL extclknsel)

{

              uint16 password = IfxScuWdt_getSafetyWatchdogPassword();

               IfxScuWdt_clearSafetyEndinit(password);

              

               Ifx_SCU_EXTCON EXTCON; 

               EXTCON.B.SEL0   = extclksel;

               EXTCON.B.DIV1   = spbdiv;

               EXTCON.B.NSEL   = extclknsel;

               EXTCON.B.EN0    = 1;


               IfxScuWdt_setSafetyEndinit(password);

}

其实函数写起来很简单,就是将对应的寄存器配置好而已。

最后在主函数0中增加一行代码:

IfxScuCcu_CLKout(IfxScuCcu_EXTCLK_fSPB,10,IfxScuCcu_EXTCLK_NSEL_NINV);

编程部分就结束了,烧入程序进行测试即可。

因为我的HIGHTEC又出现了LICENSE错误。。。这次就不再演示了估计问题不大。

0 点赞
3382 次查看
4 评论