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
The example below shows how to configure TIM1 to interface with a quadrature encoder:
- Configure PE9 and PJ11 as encoder input pins, e.g. 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
The STM32CubeMX tool can be used to configure the STM32MPU device and get the corresponding platform configuration device tree files.
The STM32CubeMX may not support all the properties described in the above DT bindings documentation paragraph. If so, the tool inserts user sections in the generated device tree. These sections can then be edited to add some properties and they are preserved from one generation to another. Refer to STM32CubeMX user manual for further information.
References
Please refer to the following links for additional information:
- ↑ 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