cancel
Showing results for 
Search instead for 
Did you mean: 

QDEC on STM32H563RG with Zephyr

Lukas4
Associate

Hi all,

 

I was able to make the qdec on timer1 run and read pulses from an external encoder. Now I wanna generate an interrupt after let's say 100 pulses. That interrupt should toggle a led

I mean the timer has interrupts, but i don't know how to use them in Zephyr.

 

That is my timerconfig in the devicetree:

tim&timers1 {
    compatible = "st,stm32-timers";
    reg = <0x40012c00 0x400>;
    clocks = <&rcc STM32_CLOCK(APB211U)>;
    resets = <&rctl STM32_RESET(APB211U)>;
    interrupts = <44 0>;
    interrupt-names = "cc";
    st,prescaler = <0>;
    status = "okay";

    qdec: qdec {
        compatible = "st,stm32-qdec";
        status = "okay";
        pinctrl-0 = <&tim1_ch1_pe9 &tim1_ch2_pe11>;
        pinctrl-names = "default";
        st,input-polarity-inverted;
        st,input-filter-level = <15>;     // FDIV32_N8-->15: Fs = F_clk/32, N=8
        st,counts-per-revolution = <700>;
        st,encoder-mode = <1>;   //???????
    };
};
 
Code to read the pulses:
const struct device *const dev = DEVICE_DT_GET(DT_ALIAS(qdec0));
const struct qdec_stm32_dev_cfg *dev_cfg = (const struct qdec_stm32_dev_cfg *)dev->config;
position = LL_TIM_GetCounter(dev_cfg->timer_inst);
printk("Number of pulses: %" PRIi32 "\n", position);
 
Is cc interrupt the correct one or should I use the "update interrupt"?
 
Do I have to use the counter-module? Zephyr API Documentation: Counter Interface
 
Thank you for your help

Best regards and greetings from Austria
Lukas
0 REPLIES 0