TIM device tree configuration
目录
Article purpose
本文的目的是解释'在将外围设备分配给 Linux® OS,如何配置“Timer(Tim)”[1] ':
- 配置定时器peripheral以启用PWM,触发或正交编码器。
- 配置board,例如 TIM引脚。
使用设备树机制[2]执行配置。
TIM Linux driver 使用它在PWM 和 IIO 框架中注册相关信息。
如果外围设备已分配给另一个执行上下文,请参阅 How to assign an internal peripheral to a runtime context 文章,以获取有关外围设备分配和配置的准则。
DT bindings documentation
“ TIM内部外围设备”[1] 是多功能设备(MFD)。
每个功能由单独的DT绑定文档表示:
- STM32 TIM MFD设备树绑定[3] 文档涉及核心资源(例如寄存器,时钟,DMA)
DT configuration
该硬件描述是STM32微处理器和电路板设备树文件的组合。 有关设备树文件分割的更多说明,请参见Device tree. STM32CubeMX可用于生成板卡设备树。 请参阅[[#How_to_configure_the_DT_using _STM32CubeMX|How to configure the DT using STM32CubeMX]].
DT configuration (STM32 level)
TIM节点在stm32mp157c.dtsi [6].
DT根节点(例如timers1 ...)和DT子节点描述了TIM features ,例如:
- 触发和正交编码器
它们还描述了硬件参数,例如寄存器地址,时钟和DMA。
timers1: timer@address { /* timer common resources */ compatible = "st,stm32-timers"; ... pwm { /* PWM*/ compatible = "st,stm32-pwm"; }; timer@0 { /* trigger and quadrature encoder */ compatible = "st,stm32h7-timer-trigger"; /* trigger identifier (e.g. 0 for TIM1 triggers, 1 for TIM2... */ reg = <0>; }; };
该设备树部分与STM32微处理器有关。 它必须保持原样,而不能由最终用户修改。 |
DT configuration (board level)
该部分用于配置和启用板上使用的TIM硬件
- 通过设置为正在使用的TIM实例(例如timers1 ...)启用'DT根节点'status = "okay";
- 通过设置 status = "okay"'''为使用中的功能(PWM输入/输出,触发和正交编码器)启用'''DT子节点'''。;
- 通过pinctrl 到 pinctrl-0, pinctrl-1 和pinctrl-names.
要在板上启用PWM捕获(可选),必须配置DMA:
- 通过设置dmas = <...>, <...>; 启用与PWM输入对应的DMA通道 匹配 dma-names = "ch1", "ch3";.
不使用PWM捕获时,建议默认情况下禁用DMA通道,以将其备用以用于其他用途:
- 通过设置/delete-property/dmas 和 /delete-property/dma-names来禁用DMA通道
DT configuration examples
TIM configured in PWM mode
下面的示例显示了如何配置TIM1通道1作为:
- PE9上的PWM输出,例如 TIM1_CH1(See pinctrl device tree configuration and GPIO internal peripheral)
- 设备树使用者(例如“ pwm-leds”[7]).这是从 ecosystem release ≥ v1.1.0{{#set:Ecosystem release=revision of a previous flow 1.1.0}} 开始提供的
/* select TIM1_CH1 alternate function 1 on 'PE9' */ pwm1_pins_a: pwm1-0 { pins { pinmux = <STM32_PINMUX('E', 9, AF1)>; bias-pull-down; drive-push-pull; slew-rate = <0>; }; }; /* configure 'PE9' as analog input in low-power mode */ pwm1_sleep_pins_a: pwm1-sleep-0 { pins { pinmux = <STM32_PINMUX('E', 9, ANALOG)>; }; };
PWM输出不需要任何DMA通道。 如果它们在.dtsi文件中默认配置,请禁用它们。 |
/* PWM DT provider on TIM1: "pwm1" */ &timers1 { status = "okay"; /* spare all DMA channels since they are not needed for PWM output */ /delete-property/dmas; /delete-property/dma-names; /* define pwm1 label */ pwm1: pwm { /* configure PWM pins on TIM1_CH1 */ pinctrl-0 = <&pwm1_pins_a>; pinctrl-1 = <&pwm1_sleep_pins_a>; pinctrl-names = "default", "sleep"; /* enable PWM on TIM1 */ status = "okay"; }; };
以下的PWM DT用户示例来自ecosystem release ≥ v1.1.0{{#set:Ecosystem release=revision of a previous flow 1.1.0}}
TIM PWM DT用户说明符编码3个单元:
|
/ { ... /* PWM DT user on TIM1_CH1: "pwm1", example with "pwm-leds"[7] */ pwmleds { compatible = "pwm-leds"; example { label = "stm32-pwm-leds-example"; /* Use pwm1 channel 0 (e.g. TIM1_CH1) */ /* period in nanoseconds (500000), normal polarity (0) */ pwms = <&pwm1 0 500000 0>; max-brightness = <127>; }; }; };
TIM configured in PWM mode and trigger source
The example below shows how to configure TIM1 channel 1 to act as:
- PWM output on PE9, e.g. TIM1_CH1 (See pinctrl device tree configuration and GPIO internal peripheral)
- trigger source (synchronous with PWM) for other internal peripheral such as STM32 ADC
/* select TIM1_CH1 alternate function 1 on 'PE9' */ pwm1_pins_a: pwm1-0 { pins { pinmux = <STM32_PINMUX('E', 9, AF1)>; bias-pull-down; drive-push-pull; slew-rate = <0>; }; }; /* configure 'PE9' as analog input in low-power mode */ pwm1_sleep_pins_a: pwm1-sleep-0 { pins { pinmux = <STM32_PINMUX('E', 9, ANALOG)>; }; };
The PWM output doesn't require any DMA channel. Disable them if they are configured by default in the .dtsi file. |
&timers1 { status = "okay"; /* spare all DMA channels since they are not needed for PWM output */ /delete-property/dmas; /delete-property/dma-names; pwm { /* configure PWM on TIM1_CH1 */ pinctrl-0 = <&pwm1_pins_a>; pinctrl-1 = <&pwm1_sleep_pins_a>; pinctrl-names = "default", "sleep"; /* enable PWM on TIM1 */ status = "okay"; }; timer@0 { /* enable trigger on TIM1 */ status = "okay"; }; };
TIM configured in PWM input capture mode
The example below shows how to configure TIM1 channel 1 in PWM input capture mode (e.g. period and duty cycle):
- Configure PWM input on PE9, e.g. TIM1_CH1 (See pinctrl device tree configuration and GPIO internal peripheral)
/* select TIM1_CH1 alternate function 1 on 'PE9' */ pwm1_in_pins_a: pwm1-in-0 { pins { pinmux = <STM32_PINMUX('E', 9, AF1)>; bias-disable; }; }; /* configure 'PE9' as analog input in low-power mode */ pwm1_in_sleep_pins_a: pwm1-in-sleep-0 { pins { pinmux = <STM32_PINMUX('E', 9, ANALOG)>; }; };
A DMA channel is required and must be configured depending on the PWM input channel:
- Select DMA channel 1, "ch1", to capture PWM input channel 1 and/or 2
- Select DMA channel 3, "ch3", to capture PWM input channel 3 and/or 4
- Select both "ch1" and "ch3" dmas to enable capture on all PWM input channels
&timers1 { status = "okay"; /* Enable DMA "ch1" for PWM input on TIM1_CH1 */ dmas = <&dmamux1 11 0x400 0x5>; dma-names = "ch1"; pwm { /* configure PWM input pins, e.g. TIM1_CH1 */ pinctrl-0 = <&pwm1_in_pins_a>; pinctrl-1 = <&pwm1_in_sleep_pins_a>; pinctrl-names = "default", "sleep"; /* enable PWM on TIM1 */ status = "okay"; }; };
DMA channels 1 and/or 3 for each TIM can be picked from the "dmas" list in stm32mp157c.dtsi[6] file |
TIM configured as quadrature encoder interface
下面的示例显示了如何配置TIM1以与正交编码器接口:
- 将PE9和PJ11配置为编码器输入引脚,例如 TIM1_CH1,TIM1_CH2(see pinctrl device tree configuration and GPIO internal peripheral)
tim1_in_pins_a: tim1-in-pins-0 { pins { pinmux = <STM32_PINMUX('E', 9, AF1)>, /* TIM1_CH1 */ <STM32_PINMUX('J', 11, AF1)>; /* TIM1_CH2 */ bias-disable; }; }; tim1_in_pins_sleep_a: tim1-in-pins-sleep-0 { pins { pinmux = <STM32_PINMUX('E', 9, ANALOG)>, /* TIM1_CH1 */ <STM32_PINMUX('J', 11, ANALOG)>; /* TIM1_CH2 */ }; };
&timers1 { status = "okay"; /delete-property/dmas; /* spare all DMA channels since they are not required for quadrature encoder interface */ /delete-property/dma-names; timer@0 { pinctrl-0 = <&tim1_in_pins_a>; /* configure TIM1_CH1 and TIM1_CH2 as encoder input pins */ pinctrl-1 = <&tim1_in_pins_sleep_a>; pinctrl-names = "default", "sleep"; status = "okay"; /* enable Encoder interface mode on TIM1 */ }; };
How to configure the DT using STM32CubeMX
STM32CubeMX 工具可用于配置STM32MPU设备并获取相应的platform configuration device tree 文件
STM32CubeMX可能不支持以上DT bindings documentation 段中描述的所有属性。 如果是这样,该工具会在生成的设备树中插入“用户部分”。 然后可以编辑这些部分以添加一些属性,并将它们一代一代地保留下来。 有关更多信息,请参见STM32CubeMX 用户手册。
References
请参考以下链接以获取更多信息:
- ↑ 1.01.1 TIM internal peripheral
- ↑ Device tree
- ↑ Documentation/devicetree/bindings/mfd/stm32-timers.txt | |}} Documentation/devicetree/bindings/mfd/stm32-timers.txt , STM32 TIM MFD device tree bindings
- ↑ Documentation/devicetree/bindings/pwm/pwm-stm32.txt | |}} Documentation/devicetree/bindings/pwm/pwm-stm32.txt , STM32 TIM PWM device tree bindings
- ↑ Documentation/devicetree/bindings/iio/timer/stm32-timer-trigger.txt | |}} Documentation/devicetree/bindings/iio/timer/stm32-timer-trigger.txt , STM32 TIM trigger/encoder device tree bindings
- ↑ 6.06.1 arch/arm/boot/dts/stm32mp157c.dtsi | |}} stm32mp157c.dtsi , STM32.dtsi file
- ↑ 7.07.1 Documentation/devicetree/bindings/leds/leds-pwm.txt| |}} Documentation/devicetree/bindings/leds/leds-pwm.txt , PWM LEDs device tree bindings