writel(readl(&pwm_timer->tcfg0) | 0xff, &pwm_timer->tcfg0);

时间:2023-03-09 03:16:17
writel(readl(&pwm_timer->tcfg0) | 0xff, &pwm_timer->tcfg0);

解析这句代码什么意思!

神说:选定预分频器0

为什么?

神说:因为实验中选的是timer1,在预分频器0下;

writel(readl(&pwm_timer->tcfg0) | 0xff, &pwm_timer->tcfg0);

若选择timer4,该如何写这句代码?

首先看tcfg0中选择预分频器1,在看tcfg1里面的timer4,以及选择相应的MUX

总结:在初始化寄存器时,首先得看寄存器表,寄存器表中可能分为许多【位】,我们需要哪位,就给哪位写入值(这个值是对应相应的功能来写的)。

分频器1:

对应的代码:

①  选择预分频1:

writel(readl(&pwm_timer->tcfg0) | 0xff << 8, &pwm_timer->tcfg0);

在书上说明了预分频的取值范围是1~255(神告诉我,值越大,频率越大,蜂鸣器响的越快)。

所以在这里我们不必关心值是多少,我们只需要让这个值不是初始值,并且在TCFG0的[15:8]这个地方,左移8位,就可以到达这个地方;

writel(readl(&pwm_timer->tcfg0) | 0xff, &pwm_timer->tcfg0);

② 选择MUX4,频率为1/16:

从图中,可以知道MUX4对应TCFG1[19:16],选择频率是1/16,对应二进制位0100,可以让0x4 << 16,得到。

但是为了让[15:0]都不起作用,给他们都赋值1(这里不太清楚,自己猜的,大概就是这样吧!),即1111,1111,1111,1111

可以通过0xf左移16位,并且取反,在与[0x4 << 16]取与&

代码为:

writel((readl(&pwm_timer->tcfg1) & ~(0xf<<16)) | (0x4<<16), &pwm_timer->tcfg1);

writel(readl(&pwm_timer->tcfg0) | 0xff, &pwm_timer->tcfg0);