{"id":44462745,"url":"https://github.com/ThundeRatz/STM32RF24","last_synced_at":"2026-02-25T02:00:54.047Z","repository":{"id":43182284,"uuid":"212893266","full_name":"ThundeRatz/STM32RF24","owner":"ThundeRatz","description":":sparkles: Library for handling the nRF24L01 radio frequency module.","archived":false,"fork":false,"pushed_at":"2023-11-18T23:00:22.000Z","size":2007,"stargazers_count":5,"open_issues_count":5,"forks_count":1,"subscribers_count":4,"default_branch":"main","last_synced_at":"2023-11-19T22:45:28.963Z","etag":null,"topics":["communication","embedded-systems","iot","nrf24","nrf24l01","radio-communications","receiver","robotics","stm32","transmitter"],"latest_commit_sha":null,"homepage":"https://thunderatz.org","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ThundeRatz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-10-04T19:59:59.000Z","updated_at":"2023-11-19T22:45:28.963Z","dependencies_parsed_at":"2023-11-18T23:00:15.948Z","dependency_job_id":null,"html_url":"https://github.com/ThundeRatz/STM32RF24","commit_stats":null,"previous_names":[],"tags_count":2,"template":null,"template_full_name":null,"purl":"pkg:github/ThundeRatz/STM32RF24","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThundeRatz%2FSTM32RF24","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThundeRatz%2FSTM32RF24/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThundeRatz%2FSTM32RF24/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThundeRatz%2FSTM32RF24/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ThundeRatz","download_url":"https://codeload.github.com/ThundeRatz/STM32RF24/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThundeRatz%2FSTM32RF24/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29808864,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-24T22:43:48.403Z","status":"online","status_checked_at":"2026-02-25T02:00:07.329Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["communication","embedded-systems","iot","nrf24","nrf24l01","radio-communications","receiver","robotics","stm32","transmitter"],"created_at":"2026-02-12T19:12:09.240Z","updated_at":"2026-02-25T02:00:54.041Z","avatar_url":"https://github.com/ThundeRatz.png","language":"C","funding_links":[],"categories":["Libraries"],"sub_categories":[],"readme":"[![forthebadge](https://forthebadge.com/images/badges/made-with-c.svg)](https://forthebadge.com)\n[![forthebadge](https://forthebadge.com/images/badges/built-with-love.svg)](https://forthebadge.com)\n\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\n\n# 📡 STM32RF24\n\nPara a versão em PT-BR 🇧🇷 desse documento, [veja aqui](./README.pt-br.md).\n\n## 📜 Index\n\n- [🎉 Intro](#-intro)\n- [➕ Requirements](#-requirements)\n- [📦 Git Submodules](#-git-submodules)\n  - [💥 Adding a submodule](#-adding-a-submodule)\n  - [✅ Initializing an existing submodule](#-initializing-a-existing-submodule)\n- [📁 Repository Structure](#-repository-structure)\n- [📝 Documentation](#-documentation)\n- [🎨 Formatting](#-formatting)\n- [🏗️ Code Structure](#-code-structure)\n- [🔌 Hardware Configuration](#-hardware-configuration)\n  - [🤔 Getting to know the module](#-getting-to-know-the-module)\n  - [🔧 Configuring the microcontroller](#-configuring-the-microcontroller)\n- [📚 Using the library](#-using-the-library)\n  - [🏁 Initializing](#-initializing)\n  - [📤 Using as a transmitter](#-using-as-a-transmitter)\n  - [📩 Using as a receiver](#-using-as-a-receiver)\n  - [🐛 Debugging](#-debugging)\n- [👥 Contributing](#-contributing)\n- [✨ Contributors](#-contributors)\n\n## 🎉 Intro\n\nThis repository contains a library to handle Nordic Semiconductor's radio frequency module nRF24L01, whose datasheet can be viewed [here](docs/Nordic_Semiconductor-NRF24L01-datasheet.pdf), when using the microcontrollers of the [STM32](https://www.st.com/en/microcontrollers-microprocessors/stm32-32-bit-arm-cortex-mcus.html) family.\n\nThis library was made to be used as a submodule in the [STM32ProjectTemplate](https://github.com/ThundeRatz/STM32ProjectTemplate).\n\n\n## ➕ Requirements\n\nThis library does not require any extra requirements to function, in addition to those already listed [STM32ProjectTemplate requirements](https://github.com/ThundeRatz/STM32ProjectTemplate#requisitos).\n\nHowever, if you want to generate the documentation, as described in the section [📝 Documentation](#-documentation), it is necessary to install Doxygen. In Ubuntu, it is possible to install it with the following command:\n\n```bash\nsudo apt install doxygen\n```\n\nFor other operating systems, you can see download options on the [official Doxygen page](https://www.doxygen.nl/download.html).\n\nBesides that, for formatting `uncrustify` is used, as described in the section [🎨 Formatting](#-formatting). To install it, on Ubuntu, run the following command on the terminal:\n\n```bash\nsudo apt install uncrustify\n```\n\nOn Windows, download the `.zip` from [SourceForge](https://sourceforge.net/projects/uncrustify/files/). Add the location of the executable in the `PATH` environment variable.\n\n\n## 📦 Git Submodules\n\nAs stated, this library functions as a submodule. In this way, it is easier to choose the version of the library that will be used in the project, also allowing its development in parallel.\n\n### 💥 Adding a submodule\n\nCreate a directory called `lib`, if it does not exist:\n\n```bash\nmkdir lib\n```\n\nAnd add the submodule by doing:\n\n* With HTTPS:\n```bash\ngit submodule add --name STM32RF24 https://github.com/ThundeRatz/STM32RF24.git lib/STM32RF24\n```\n\n* With SSH:\n```bash\ngit submodule add --name STM32RF24 git@github.com:ThundeRatz/STM32RF24.git lib/STM32RF24\n```\n\n### ✅ Initializing an existing submodule\n\nWhen cloning a repository that already has submodules, it is necessary to clone the repositories of that submodule. This can be done in two ways, by cloning together with the project repository or after you have already cloned.\n\nExample:\n\nTo clone together, run the following command, switching to the repository link of your project:\n\n```bash\ngit clone --recurse-submodules git@github.com:ThundeRatz/STM32ProjectTemplate.git\n```\n\nTo clone having already cloned the project repository, within it, you should do:\n\n```bash\ngit submodule update --init\n```\n\n## 📁 Repository Structure\n\nThe repository contains the following folders:\n\n- **assets/** → Images and `.css` files for documentation\n- **docs/** → Documentation files\n- **inc/** → Header files\n- **src/** → Source files\n\nAt the root of the repository, in addition to the files containing the code of conduct, contribution guidelines, README and license, there is the `sources.mk` file, which is responsible for making it possible for the library files to be found when compiling the code. There is also a `Doxyfile` to generate the documentation. Another relevant file is `uncrustify.cfg` which is used to format the files.\n\n## 📝 Documentation\n\nThis library is documented using Doxygen. To generate the documentation, run the following command at the root of your repository:\n\n```bash\ndoxygen\n```\n\nThe settings are in the file [Doxyfile](./Doxyfile).\n\n## 🎨 Formatting\n\nBesides a good documentation, it is necessary that the code is always well formatted, which facilitates its understanding. For that, `uncrustify` was used. With `uncrustify` installed, to format a file that has changed, run the following command:\n\n```bash\nuncrustify -c uncrustify.cfg --replace --no-backup path_to_file/file_name\n```\n\n## 🏗️ Code Structure\n\nThe code is structured as follows:\n\n- `nrf24l01_registers.h` → types and constants related to the module registers.\n- `rf24_platform.c/.h` → lower-level types and functions that use HAL.\n- `rf24.c/.h` → highest level types and functions for user use.\n- `rf24_debug.c/.h` → useful functions to validate the module's operation.\n\n## 🔌 Hardware Configuration\n\n### 🤔 Getting to know the module\n\nTo configure your hardware, you must first analyze the pinout of the nRF24L01 module, as shown below:\n\n![nRF24L01 Module's Pinout](./assets/img/nrf24l01_pinout.png)\n\nThe module uses SPI (Serial Protocol Interface) to communicate with the microcontroller (to learn more about SPI, we recommend this article [here](https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/all) from Sparkfun), so four pins are required for this communication, SCK, MISO, MOSI and CSN. The CSN is a GPIO pin, while the others are dedicated pins.\n\nIn addition, a GPIO pin connected to the CE (Chip Enable) is needed, which is used to control the module, enabling the transition between the states of the module's finite state machine.\n\nThe module also has an IRQ (Interruption Request) pin, allowing the module to function through interruptions. This pin must be connected to a pin that supports interruptions in the microcontroller if you want to use this feature, otherwise, you must connect it to the 3.3V, since the pin is active low.\n\n### 🔧 Configuring the microcontroller\n\nTo configure the microcontroller, the [STM32CubeMX](https://www.st.com/en/development-tools/stm32cubemx.html), one of the requirements of the [STM32ProjectTemplate](https://github.com/ThundeRatz/STM32ProjectTemplate), will be used. Besides that, it will be necessary to have a project configured in Cube, if you don't have it, see the [STM32ProjectTemplate README](https://github.com/ThundeRatz/STM32ProjectTemplate#stm32-project-template) and for more details see the [STM32Guide](https://github.com/ThundeRatz/STM32Guide).\n\nWith the project open, go to _Connectivity_ and then select an available SPI, as seen in the image below:\n\n![Configuring the SPI - 1](./assets/img/spi_config_1.jpg)\n\nAfter doing this, a tab will open, where you can select the SPI mode, then select the _Full-Duplex Master_ mode:\n\n![Configuring the SPI - 2](./assets/img/spi_config_2.jpg)\n\nThan, as can be seen below in \"1\", some pins will be automatically set in some positions, but it is possible to move them to others if they are available. To see other available positions, hold the _Ctrl_ button and click on the pin you want to move, if there is another pin that supports the function of the pin you want to move, the color of the alternative one will change.\n\nA configuration screen will also appear, in which you will need to make some changes. As can be seen on page 45, item 8.1 of the [datasheet](docs/Nordic_Semiconductor-NRF24L01-datasheet.pdf), the module works with a 4-wire SPI serial interface from 0Mbps to 8Mbps and 8-bit commands. Therefore, as can be seen below in \"2\", the _Data Size_ must be set to 8 bits and in \"3\" a value of _Prescaler_ must be defined in order to obtain a _Baud Rate_ of up to 8Mbps.\n\n![Configuring the SPI - 3](./assets/img/spi_config_3.jpg)\n\nAfter that it will be necessary to configure the CSN pin, for that, click on the pin you want to use for this function and then select the _GPIO_Output_ option, as seen in the image below (for this tutorial the CSN will be on the PC6 pin). The same should be done for the CE pin, since it is also a _GPIO_Output_ (for this tutorial the CSN will be on the PC8 pin).\n\n![Configuring the CE](./assets/img/ce_config.jpg)\n\nFinally, to configure the IRQ pin, click on the pin you want to use and select the _GPIO_EXTIx_ option, where x depends on the chosen pin number. Below, the PC7 pin was used as an example, so having to choose _GPIO_EXTI7_:\n\n![Configuring the IRQ - 1](./assets/img/irq_config_1.jpg)\n\nSince the IRQ pin is active low, it is necessary to configure it like this. For this, as seen below, go to _System Core_\u003e _GPIO_, then in the GPIO configuration tab select your IRQ pin, than a pin configurations list will appear, in which, in _GPIO Mode_, select _External mode must be chosen. Interrupt Mode with Falling edge trigger detection_.\n\n![Configuring the IRQ - 2](./assets/img/irq_config_2.jpg)\n\nAfter setting everything, save the project and close it. To generate the Cube files, follow the instructions in the [STM32ProjectTemplate README](https://github.com/ThundeRatz/STM32ProjectTemplate#gerando-arquivos).\n\n## 📚 Using the library\n\nThe library has different functions for configuring module parameters, receiving and transmitting in different ways. This section will show a basic way to initialize the module, use it as a receiver or as a transmitter.\n\nThe communication between two modules can be with or without _acknowledgment_ (ACK). Using ACK helps to prevent the loss of packets sent. When ACK is enabled, your receiver, upon receiving a valid package, will send an ACK package to the transmitter, otherwise it will not send anything. On the other hand, the transmitter, after sending a packet, will be waiting to receive an ACK packet for a certain time, if the time runs out without receiving the ACK, it will send the packet it had sent again. Several different transaction diagrams can be seen starting on page 40, item 7.9 of the [datasheet](docs/Nordic_Semiconductor-NRF24L01-datasheet.pdf). This tutorial will show you how to communicate two modules with ACK, it will also be considered that there is only one transmitter and one receiver, but it is possible to have more modules.\n\nIn addition to what will be shown in the subsections below, for the library to function, it is necessary, in one of its `.c` files that includes the` rf24.h` file, to define the following function:\n\n```C\n/**\n * @brief Library delay function.\n *\n * @note This function must be implemented by the user.\n *\n * @param ms Delay in milliseconds.\n *\n * @return @ref rf24_status.\n */\nrf24_status_t rf24_delay(uint32_t ms);\n```\n\nIt is a _delay_ function used within the library, which receives a time in milliseconds. It can be defined in different ways, however, in general, it is possible to define it simply with the `HAL_Delay(uint32_t Delay)` function (it is necessary to include the `main.h` file generated by Cube for this):\n\n```C\nrf24_status_t rf24_delay(uint32_t ms) {\n    HAL_Delay(ms);\n\n    return RF24_SUCCESS;\n}\n```\n\n### 🏁 Initializing\n\nBefore starting the module itself, it is necessary to initialize the SPI that was configured in the Cube. The function name depends on which SPI was chosen, for the one chosen in the [🔌 Hardware Configuration](#-hardware-configuration) section above, it would be the following function:\n\n```C\nMX_SPI2_Init(); /* The SPI2 was chosen in Cube */\n```\n\nTo use the above function, it is necessary to include the file `spi.h` generated by Cube. In addition, it is recommended to put a delay of something around 100 ms after the SPI initialization.\n\nThen, it is necessary to define in the code which pins and SPI instance were chosen, in addition to other configurations. For this, the pins chosen in the [🔌 Hardware Configuration](#-hardware-configuration) section will be considered and also that a 15-byte message will be sent, that is, _payload size_ of 15.\n\nFirst, you need to create a module instance and a pointer to it:\n\n```C\nrf24_dev_t device; /* Module instance */\nrf24_dev_t* p_dev = \u0026device; /* Pointer to module instance */\n```\n\nThen, to configure the module, it can be done as follows:\n\n```C\n/* Device config */\n\n/* Get default configuration */\nrf24_get_default_config(p_dev);\n\n/* The SPI2 was chosen in Cube */\np_dev-\u003eplatform_setup.hspi = \u0026hspi2;\n\n/* CSN on pin PC6 */\np_dev-\u003eplatform_setup.csn_port = GPIOC;\np_dev-\u003eplatform_setup.csn_pin = GPIO_PIN_6;\n\n/* IRQ on pin PC7 */\np_dev-\u003eplatform_setup.irq_port = GPIOC;\np_dev-\u003eplatform_setup.irq_pin = GPIO_PIN_7;\n\n/* CE on pin PC8 */\np_dev-\u003eplatform_setup.ce_port = GPIOC;\np_dev-\u003eplatform_setup.ce_pin = GPIO_PIN_8;\n\np_dev-\u003epayload_size = 15;\n```\n\nFinally, it is possible to initialize the module, passing the pointer of the module instance to the following function:\n\n```C\nrf24_init(p_dev);\n```\n\nThis function will return `RF24_SUCCESS` if initialization is successful and error values otherwise. For more details on the possible error values, see the code documentation.\n\n### 📤 Using as a transmitter\n\nTo use a module as a transmitter it is necessary to know the address of the receiver to which the message will be sent, this information needs to be shared between the two, otherwise it is not possible to make the communication. In addition, as it will be shown here how to communicate with ACK, the transmitter will behave for a period as a receiver waiting for the ACK packet, so it is also necessary that it has a receiver address, this address must also be a information that two modules have.\n\nFor both the example of transmitter and receiver, the address vector below will be used, where the first is the address for the transmitter to receive the ACK packet and the second is the address of the receiver, to which the transmitter will send. Address sizes are configurable, but 5-byte addresses will be used.\n\n```C\nuint8_t addresses[2][5] = {{0xE7, 0xE7, 0xE7, 0xE7, 0xE8}, {0xC2, 0xC2, 0xC2, 0xC2, 0xC1}};\n```\n\nFor the configuration part of the transmitter it is also interesting to choose the output power of the module with the following function:\n\n```C\n/**\n * @brief Set device output power.\n *\n * @param p_dev         Pointer to rf24 device.\n * @param output_power  Selected output power.\n *\n * @return @ref rf24_status.\n */\nrf24_status_t rf24_set_output_power(rf24_dev_t* p_dev, rf24_output_power_t output_power);\n```\n\nNow, to receive and send according to the right addresses, it is necessary to open a writing _pipe_ for the address `addresses[1]` and a reading _pipe_ for `addresses[0]`, which can be done as follows:\n\n```C\nrf24_status_t device_status; /* Variable to receive the statuses returned by the functions */\n\ndevice_status = rf24_open_writing_pipe(p_dev, addresses[1]);\ndevice_status = rf24_open_reading_pipe(p_dev, 1, addresses[0]);\n```\n\nWith that done, it's now possible to send messages! Say you want to send the following message stored in a vector:\n\n```C\nuint8_t buffer[] = {'V', 'i', 'r', 't', 'u', 'a', 'l', ' ', 'h', 'u', 'g', 's', '!', '\\r', '\\n'};\n```\n\nTo send it with ACK, it can be done as follows:\n\n```C\ndevice_status = rf24_write(p_dev, buffer, 15, true);\n```\n\nThis function will return `RF24_SUCCESS` if the transmitter was able to send the message and, as the communication is done with ACK, if the receiver has received the message.\n\n### 📩 Using as a receiver\n\nAs mentioned in [transmitter's subsection](#-using-as-a-transmitter), the address to which the transmitter will send the data must be the same as that registered in the receiver's code, as well as the address to which the receiver will send the ACK packet needs to be the same as the one on the transmitter, so the same addresses as the transmitter tutorial will be used:\n\n```C\nuint8_t addresses[2][5] = {{0xE7, 0xE7, 0xE7, 0xE7, 0xE8}, {0xC2, 0xC2, 0xC2, 0xC2, 0xC1}};\n```\n\nIn the case of the receiver, to receive and send according to the right addresses, it is necessary to open a writing _pipe_ for the address `addresses[0]` and a reading _pipe_ for `addresses[1]`, as is done below:\n\n```C\nrf24_status_t device_status; /* Variable to receive the statuses returned by the functions */\n\ndevice_status = rf24_open_writing_pipe(p_dev, addresses[0]);\ndevice_status = rf24_open_reading_pipe(p_dev, 1, addresses[1]);\n```\n\nBesides that, in order for the receiver to start receiving packets, it is necessary to call the following function:\n\n```C\ndevice_status = rf24_start_listening(p_dev);\n```\n\nAfter that, it is already possible to receive packages! It is possible to check for a new package with the following function:\n\n```C\n/**\n * @brief Checks if a new payload has arrived.\n *\n * @param p_dev         Pointer to rf24 device.\n * @param pipe_number   Pipe where the available data is.\n *\n * @note To don't ready a pipe, pass NULL as pipe_number argument.\n *\n * @return @ref rf24_status.\n */\nrf24_status_t rf24_available(rf24_dev_t* p_dev, uint8_t* pipe_number);\n```\n\nAnd it is possible to read packages with the following function:\n\n```C\n/**\n * @brief Reads the payload avaible in the receiver FIFO.\n *\n * @note Interruption flags related to the receiver are cleared.\n *\n * @param p_dev Pointer to rf24 device.\n * @param buff Pointer to a buffer where the data should be written\n * @param len Maximum number of bytes to read into the buffer\n *\n * @return @ref rf24_status.\n */\nrf24_status_t rf24_read(rf24_dev_t* p_dev, uint8_t* buff, uint8_t len);\n```\n\nSo, to check for packages in the queue and read the last package, you can do it as follows:\n\n```C\nrf24_status_t device_status;\nrf24_status_t read_status;\n\nuint8_t buffer[15] = {0};\n\nif ((device_status = rf24_available(p_dev, NULL)) == RF24_SUCCESS) {\n    while ((device_status = rf24_available(p_dev, NULL)) == RF24_SUCCESS) {\n        read_status = rf24_read(p_dev, buffer, p_dev-\u003epayload_size);\n    }\n\n    /* Do something with the read package */\n}\n```\n\n### 🐛 Debugging\n\nTo debug your code it is possible to use the functions of the file `rf24_debug.c/.h`, but for this it is also necessary to define a `printf` function. For ease of use, we recommend adding the [SEGGER_RTT](https://github.com/ThundeRatz/SEGGER_RTT) to the project. After adding it, having called the debugging functions in your code, to see what is being \"printed\" by the functions, run in the terminal, being at the root of your project:\n\n```C\nmake rtt\n```\n\n## 👥 Contributing\n\nAny help in the development of robotics is welcome, we encourage you to contribute to the project! To learn how, see the contribution guidelines [here](CONTRIBUTING.md).\n\n## ✨ Contributors\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/LucasHaug\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/39196309?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLucas Haug\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/ThundeRatz/STM32RF24/commits?author=LucasHaug\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/ThundeRatz/STM32RF24/commits?author=LucasHaug\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"https://github.com/ThundeRatz/STM32RF24/commits?author=LucasHaug\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"#translation-LucasHaug\" title=\"Translation\"\u003e🌍\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/lucastrschneider\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/50970346?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eLucas Schneider\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/ThundeRatz/STM32RF24/commits?author=lucastrschneider\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/ThundeRatz/STM32RF24/commits?author=lucastrschneider\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"https://github.com/ThundeRatz/STM32RF24/commits?author=lucastrschneider\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"#translation-lucastrschneider\" title=\"Translation\"\u003e🌍\u003c/a\u003e \u003ca href=\"https://github.com/ThundeRatz/STM32RF24/pulls?q=is%3Apr+reviewed-by%3Alucastrschneider\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/d-nery\"\u003e\u003cimg src=\"https://avatars2.githubusercontent.com/u/12468184?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eDaniel Nery\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/ThundeRatz/STM32RF24/commits?author=d-nery\" title=\"Code\"\u003e💻\u003c/a\u003e \u003ca href=\"https://github.com/ThundeRatz/STM32RF24/pulls?q=is%3Apr+reviewed-by%3Ad-nery\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/FelipeGdM\"\u003e\u003cimg src=\"https://avatars3.githubusercontent.com/u/1054087?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eFelipe Gomes de Melo\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#ideas-FelipeGdM\" title=\"Ideas, Planning, \u0026 Feedback\"\u003e🤔\u003c/a\u003e \u003ca href=\"https://github.com/ThundeRatz/STM32RF24/pulls?q=is%3Apr+reviewed-by%3AFelipeGdM\" title=\"Reviewed Pull Requests\"\u003e👀\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://github.com/Berbardo\"\u003e\u003cimg src=\"https://avatars0.githubusercontent.com/u/48636340?v=4?s=100\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eBernardo Coutinho\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"https://github.com/ThundeRatz/STM32RF24/commits?author=Berbardo\" title=\"Tests\"\u003e⚠️\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-restore --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n---------------------\n\n\u003cimg src=\"https://static.thunderatz.org/teamassets/logo-simples.png\" width=\"200px\" /\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FThundeRatz%2FSTM32RF24","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FThundeRatz%2FSTM32RF24","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FThundeRatz%2FSTM32RF24/lists"}