Holy crap that was simple. I just switched over the Espressif framework from Arduino and I've been messing around with their GPIO driver for a couple of hours now. Considering all I needed to do was toggle the internal LED, this saves so much hassle.
Nice video. Please note that GPIO_OUT_W1TS_REG and GPIO_OUT_W1TC_REG are exposed in soc/gpio_reg.h so a simple #include is sufficient, no need to define these registers inside your code. Please also note that GPIO pin numbers are exposed in hal/gpio_types.h. Same comment, no need to define GPIO5 macro again.
Great stuff, arw you willing to continue the series? I am looking for a bate metal approach to the ESP32 instead of the typical arduino core use. What topics are you looking to cover?
this is not bare metal as the dev uses esp-idf which incorporates bootloader, start linker script and so on. a bare metal approach would be to write a main, assembly file and use clang directly.
The moment you included the RTOS and linked against IDF's libraries, it's no longer bare metal. All you did was bypass the GPIO functions. What a waste if time.
I tried reading the same document to see how you came about your awesome simplicity. What made you decide to avoid setting the GPIO_FUNCx_OUT_SEL register?
For simply toggling an LED, GPIO_OUT_W1TS_REG and GPIO_OUT_W1TC_REG are generally easier to set up and offer greater flexibility. But if you have a specific hardware event that you want to use to trigger the LED, and you want to minimize CPU overhead, then GPIO_FUNCx_OUT_SEL might be more appropriate.
@@EV_engineer Hello, Thank you for the video, it is very informative. Actually, I had the same question as well. So imagine I have two LEDs one is blinking the whole time and then the second LED will only blink when I turn the potentiometer (let's say that generates an interrupt). So, in the second case I will have to use GPIO_FUNCx_OUT_SEL?
I gave up on ESP32 MCUs because I found it impossible to toggle any port pins fast enough and also to stop the OS from interrupting every 1ms. Do you know how to do this ? Or in other words, how many clock cycles does it take for you to toggle an I/O pin ?
When this code is executed on ESP32, Is there some FreeRTOS tasks at under kernel ? I am trying to check a gpio from external source and send to serial, and the FreeRTOS under IDF sometimes run task like IPC and move the context of execution. I watched the video and I dont understand why you move to linux. Does it possible under windows create a Real Bare Bone code ? Thanks in Advance.
Man this was dope, explanation was great. Most people just blow right over stuff like this like its nothing.
I really liked your step by step and clear explanation. You gained a new subscriber here. Thank you!
Holy crap that was simple. I just switched over the Espressif framework from Arduino and I've been messing around with their GPIO driver for a couple of hours now. Considering all I needed to do was toggle the internal LED, this saves so much hassle.
Nice video. Please note that GPIO_OUT_W1TS_REG and GPIO_OUT_W1TC_REG are exposed in soc/gpio_reg.h so a simple #include is sufficient, no need to define these registers inside your code. Please also note that GPIO pin numbers are exposed in hal/gpio_types.h. Same comment, no need to define GPIO5 macro again.
Your videos are great!!!
Thanx a lot for your time and effort!!!
Great stuff, arw you willing to continue the series? I am looking for a bate metal approach to the ESP32 instead of the typical arduino core use. What topics are you looking to cover?
this is not bare metal as the dev uses esp-idf which incorporates bootloader, start linker script and so on. a bare metal approach would be to write a main, assembly file and use clang directly.
Very useful: thanks. Great for ULP programming where there's no other option.
Can anyone give insight on how to read GPIO pin such as button and control LED foe ESP32.
If you using FreeRTOS, it’s not bare metal, right? 😂
The moment you included the RTOS and linked against IDF's libraries, it's no longer bare metal. All you did was bypass the GPIO functions. What a waste if time.
man writing code like its native language
😂😂😂
great video..but please try to explain more about things going
I tried reading the same document to see how you came about your awesome simplicity. What made you decide to avoid setting the GPIO_FUNCx_OUT_SEL register?
For simply toggling an LED, GPIO_OUT_W1TS_REG and GPIO_OUT_W1TC_REG are generally easier to set up and offer greater flexibility. But if you have a specific hardware event that you want to use to trigger the LED, and you want to minimize CPU overhead, then GPIO_FUNCx_OUT_SEL might be more appropriate.
@@EV_engineer Hello, Thank you for the video, it is very informative.
Actually, I had the same question as well. So imagine I have two LEDs one is blinking the whole time and then the second LED will only blink when I turn the potentiometer (let's say that generates an interrupt). So, in the second case I will have to use GPIO_FUNCx_OUT_SEL?
I gave up on ESP32 MCUs because I found it impossible to toggle any port pins fast enough and also to stop the OS from interrupting every 1ms. Do you know how to do this ? Or in other words, how many clock cycles does it take for you to toggle an I/O pin ?
When this code is executed on ESP32, Is there some FreeRTOS tasks at under kernel ? I am trying to check a gpio from external source and send to serial, and the FreeRTOS under IDF sometimes run task like IPC and move the context of execution. I watched the video and I dont understand why you move to linux. Does it possible under windows create a Real Bare Bone code ? Thanks in Advance.
Thanks bro
The next step is write your own linker script
Windows….yuck. I can’t watch a windows terminal 🤢