stm32f0 i2c eeprom example

stm32f0 i2c eeprom example

1k and 2k EEPROMs can write only 8 bytes at a time, but 4k/8k/16k can write 16 bytes at a time. <> Online Casino: What is its technology? Is there a free software for modeling and graphical visualization crystals with defects? So, if youve got a master STM32 uC and would like to get the readings of the MPU6050 IMU, youd need to do the following as stated in the datasheet. endobj { We do not implement these annoying types of ads! return temp; This means any device may be operated at a lower bus speed. It sends some data over I2C to a specific slave device address on the bus (if found) in a blocking mode. We can summarize these conditions (elements) of I2C bus signaling as follows: Other topics and details of the I2C mechanics of its operation are discussed in detail in the article down below. And those are the possible modes for I2C. In for example we have 92 characters, then 92/16 =5.75. Go to the Board selector tab and filter on STM32L0 Series. Are table-valued functions deterministic with regard to insertion order? Addresses for EEPROM 24AA08 memory in organization 4x256kx8bit. So, please consider supporting this work if possible. It often supports higher data rates than I2C, but it requires more pins to use. Only after writing even singly byte, must be some delay, experimentally found 1.68 ms, so better use 2 mS (2000 uS) for sure. endobj endobj You can download the entire project folder, including the modified library for this OLED here. <> 21 0 obj <> 1 Answer Sorted by: 1 I guess, this start value is application defined and should be selected by me according my program size? Which saves a lot of time and has been always the best way to handle events like that. }, int16_t i2cMPU6050Temp(void) There are other versions for other modes of operation like interrupt and interrupt+DMA. Learn more about Stack Overflow the company, and our products. I2C2->CCR |= I2C_CCR_FS; Unable to Read and Write to I2C EEPROM Posted on February 23, 2017 at 21:43 I am using atmega AT24C256 EEPROM and STM32F0 discovery module. #define TEMP_OUT_H 0x41 Use MathJax to format equations. for(uint8_t i = 0; i SR1 & I2C_SR1_RXNE)); endobj Lets see the function now, (vitag.Init = window.vitag.Init || []).push(function () { viAPItag.display("vi_2181192618") }). Only follow the rule. while(! Additionally (but not so important) question - I cant find, where "FLASH_PAGE_SIZE" is defined? but I was confused, because it seems form the Example Sketch that it is possible to configure the page size.. EEPROM.PageBase0 = 0x801F000; . Second rule is that writing must be done in sequence (s) of 8 or 16 bytes, depending of memory type. Like I2C, SPI is a common communication protocol in embedded devices. Take the time to check it out if you need to and come back to resume this tutorial and to see the I2C hardware peripheral implemented in STM32 microcontrollers and the extra features it does have. Connect and share knowledge within a single location that is structured and easy to search. . I love reading, writing, creating projects, and Technical training. { Thanks. This function has been generated automatically by STCubeMx with the parameter selected. However, you would typically not choose the next free page. I almost forgot all the backgrounds that I studied at university after 2 years of working. Are you sure you want to create this branch? Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. Asking for help, clarification, or responding to other answers. endobj Why is Noether's theorem not guaranteed by calculus? I2C1->CR1 |= I2C_CR1_PE; void i2cWrite(uint8_t devAddr, uint8_t regAddr, uint8_t data) (I2C1->SR1 & I2C_SR1_TXE)); // stop communication and read last byte reserved. That is how it should works. And a major problem with interrupts is that we cant expect when itd arrive or during which task. (I2C2->SR1 & I2C_SR1_TXE)); while(! Please look carefully the examples. 10 0 obj At this time, num-fraction is 92-12=80, which means that it begins to write at position 80 in EEPROM memory, for next fraction, which is 12 bytes. Thats why you should be careful when using clock stretching in slave devices. }, Your email address will not be published. Since we are using I2C, so the code remains same across all the STM32 Devices that supports I2C.Also I will try to write a more generalized code, so that you can also use it for other EEPROMs that works on I2C. { In main() function after all the hal, gpio, clock, I2C and EEPROM initilization first HAL_I2C_IsDeviceReady() will verify status of EEPROM communication. 11 0 obj How would I determine what page is not being used otherwise / by the program? I2C2->CR1 |= I2C_CR1_ACK; // GPIO Settings | Alternate Function | Open Drain | 50MHz 8 0 obj char received = I2C2->DR; I2C2->CR1 |= I2C_CR1_STOP; while(I2C2->SR1 & I2C_SR1_ADDR); I2C2->DR = 0x75; Here is the example I trying to use:- &sharpdefine I2C1_DEVICE_ADDRESS 0x50 /* A0 = A1 = A2 = 0 */ &sharpdefine MEMORY_ADDRESS 0x07 Buffer [0] = 'M'; while(! Yes, the "EEPROM" start address should be determined by you, based on your application needs. It is a multi-master multi-slave protocol that need only two wires to transmit data between devices: SDA (Serial Data), SCL (Serial Clock). Did not found any data about that board, nor it is mentioned in STM32 literature. The IMU has an internal I2C device address so that any master on the bus can easily address this sensor module. So I went trough the application note, and the software sample code (STM32Cube\Repository\STM32Cube_FW_F1_V1.8.4). I2C1->DR = data; I2C is a two wire serial communication protocol developed by Philips. Stick with the C target language. Some of the differences between these two modules are extracted from the datasheet of the F051 chip and presented in the table below. Finally, another example to show how to set up two IC modules of the same STM32F0 (1 master, 1 slave) to transfer data with each other. We need money to operate the site, and almost all of it comes from our online advertising. 26 0 obj Click to share on Twitter (Opens in new window), Click to share on Facebook (Opens in new window), Click to share on LinkedIn (Opens in new window). I am trying to emulate EEPROM on stm32f0. I2C EEPROM Memory accessing Home Ask a Question STM32 MCUs STM32 MPUs MEMS and Sensors Interface and Connectivity ICs STM8 MCUs Motor Control Hardware Automotive Microcontrollers Power Management Analog and Audio ST25 NFC/RFID Tags and Readers Digital ledger IOTA eDesignSuite EMI Filtering and Signal Conditioning EEPROM Legacy MCUs ST PowerStudio All Rights Reserved. <> int16_t temp = i2cMPU6050Temp(); Select the Nucleo-L476RG (or your preferred board) and name your project. There is noting special here. Function eepromReadIO() is used to read the data from the specified address of EEPROM. { And thats it for this theoretical tutorial. 24 0 obj The I2C is a multi-master, multi-slave, synchronous, bidirectional, half-duplex serial communication bus. (I2C1->SR1 & I2C_SR1_SB)); // sending to data address that i want to read I2C (inter-integrated circuit) bus Interface serves as an interface between the microcontroller and the serial I2C bus. As you can see above the entire function is same with very few changes, EEPROM_PageErase can be used to erase a single page in the memory, you can see the result for this program below, For more details and experiments, check the video, (vitag.Init = window.vitag.Init || []).push(function(){viAPItag.display("vi_2181192617")}), (vitag.Init = window.vitag.Init || []).push(function(){viAPItag.display("vi_2181192620")}), You can buy me a coffee Sensor by clicking DONATE OR Just click DOWNLOAD to download the code. Source: RM0091 . Now lets see what the code generator did: First of all, we find the Include section we can add the library needed. int i = 0; I2C1->DR = dataAddr; This will end up saving a lot of time and is considered to be the most efficient way to handle this peripheral to memory data transfer and vice versa. This opens the New Project window. To learn more, see our tips on writing great answers. I2C2->CCR = 45; // 400kHz I2C Since this OLED is very common and different libraries for this screen could be found online, we won't go into details of how to code everything from the scratch. A lot of Engineering projects and tutorials for the students to help them in their final year projects and semester projects. SCL is the clock line and SDA is data line for I2C interface with microcontoller. (I2C2->SR1 & I2C_SR1_TXE)); I2C2->CR1 |= I2C_CR1_START; expressed in remaining bytes, that is 0.75*16=12. By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. i2cInitialization(); i2cWrite(MPU6050Address, PWR_MGMT_1, MPU6050_WAKEUP); while(1) In conclusion, well take a look at the possible interrupt signals that can be triggered by the I2C hardware. After calling the above function, the I2C peripheral will start receiving all the incoming data bytes in the buffer one by one until its done. Since I did not use this chip in the past, I cant give any example for now, but for sure it will be here in the future. The major differences are summarized in Table 1. And since this STM32 board has no name as is for example Arduino uno, no data about this one except few words on eBay (plus price tag ). <> Got it, but then the example of ST is simply confusing. Lets pick the I2C mode. ****************************************************************************** This is how to read a register at a specific address inside a module that has its unique address as well on the I2C bus! Then some conversion of characters into uint8_t form. <> (I2C1->SR2 & I2C_SR2_BUSY)); // sending data address that i want to read 1 0 obj If you need to update the program, plug in the EEPROM(with update program) and turn on the board. I will explain the functions as we progress in the tutorial, Everything important is in the EEPROM.c obviously, so we will take a look at this file, In the picture above, the address for AT24C256 is 0XA0. Clock stretching is essentially holding the clock line SCL LOW by the slave device which prevents any master device on the I2C bus from initiating any new transaction until that slave releases the SCL back again. The HAL_I2C_Init() function included in the STM32 SDK will automatically read the high-level parameters, such as AddressingMode, and will configure the I2C hardware accordingly.Below is an overview of the main I2C configuration parameters passed to HAL_I2C_Init().Note that we have selected the 7-bit addressing mode, each I2C transmission will start with a byte consisting of a 7-bit address and . Well be creating a handful of example projects to operate the I2C peripheral in each one of all the 4 modes mentioned above. However, we have come a long way to finish almost all the basic aspects of the STM32F0 chip including the GPIO, Interrupts, Timer, Counter, PWM, UART and ADC. Privacy Policy | Trademark Information | Disclaimer. First example is on first page. Thanks for contributing an answer to Stack Overflow! In this tutorial we will interface an I2C based EEPROM with our beloved STM32. "I2C(Inter-I2C Communication)" is published by Eunjeogn Kim. void i2cRead(uint8_t devAddr, uint8_t dataAddr, uint8_t size) In this tutorial STM32f4 nucleo board is interfaced with EEPROM atmel AT24c04n through I2C protocol The Atmel AT24C04C provides 4,096/8 bits of Serial Electrically Erasable and Programmable Read-Only Memory (EEPROM) organized as 512 words of 8 bits each. myDIGIKEY Orders & Carts Lists Quotes Logout Your item(s)0 You will find that the sample code is provided under NUCLEO -F091RC firmware examples. What is the etymology of the term space-time? New external SSD acting up, no eject option. The first two digits of the code identify the serial bus used: Now we will see how to write or read data on an I2C EEPROM like 24C256C. Select NUCLEO-L053R8 and click OK to load the board within the STM32CubeMX user interface Then the tool will open the pinout view. The device's cascadable feature allows up to 8 devices to share a common 2-wire (I2C) bus. A common strategy is to select the however many pages you need from the end of the FLASH region, this way, your program can grow without overwriting the saved data. And finally, the master can terminate the communication by sending the Stop Condition (P)sequence. for(uint8_t i = 0; i SR1 & I2C_SR1_RXNE)); Including I2C clock synchronization, stretching, I2C bus arbitration, addressing, I2C bus conditions, and more. Despite the fact that most of those operations are done automatically by hardware when we set/clear some control bits. After you copy/paste those codes, please align everything, because operation copy/paste onto this page can ruing alignment. In which well be using the CubeMX software tool to configure the I2C hardware. temp = (float)(temp / 340) + 36.53; <> By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. I2C1->DR = (devAddr APB1ENR |= RCC_APB1ENR_I2C2EN; I2C2->CR2 |= 36; // 36 MHz APB1ENR It is available in various 8-pin packages. I2C is a synchronous serial communication protocol. When its done this function below will be called and executed, if youd like to do something upon data reception completion, then add that to your code in the application source file (main.c). while(I2C2->SR1 & I2C_SR1_SB); I2C2->DR = 0xd1; Configurable PEC (packet error checking) generation or verification: Program the peripheral input clock in I2C_CR2 Register in order to generate correct timings, Program the I2C_CR1 register to enable the peripheral, Set the START bit in the I2C_CR1 register to generate a Start condition. The basic hardware connection for I2C communication (SCL, SDA). You need to include the EEPROM.c and EEPROM.h files in the src and inc folders respectively. Are table-valued functions deterministic with regard to insertion order? The basic functionality for transmitting data over I2C as a Master device is handled by the following HAL function. 15 0 obj Acknowledge Failure (AF) This error occurs when the interface detects a non-acknowledge bit. Therefore, in this tutorial, I will be covering the following parts: I found this article from Sparkfun describe the fundamentals of I2C in a very intuitive and easy way to understand. Next, well do a handful of LABs to practice using I2C in different projects for communication and modules interfacing with STM32 microcontrollers. { A reader by day and a writer by night, it's my lifestyle. That is last printMsg() which read all 255 bytes from second page at 0x51. The HIGH or LOW state of the data line can only change when the clock signal on the SCL line is LOW. Copyright 2020 TheEngineeringProjects.com. As indicated in Table 9 above, STM32F051 supports three-speed mode (frequency mode) for the I2C communication: 100kHz, 400kHz and 1MHz. Making statements based on opinion; back them up with references or personal experience. 19 0 obj The reason is that this EEPROM can support 400 KHz I2C clock speed and this is mentioned in the datasheet of the device. GPIOB->CRL |= GPIO_CRL_CNF6 | GPIO_CRL_MODE6; Yes, the "EEPROM" start address should be determined by you, based on your application needs. Its widely used for attaching lower-speed peripheral ICs to processors and microcontrollers in short-distance, intra-board communication. If yes, what is the HAL equivalent for calling Flash_Unlock()? First of all we need to include the Wire library and softwire library for using I2C communication functions in STM32F103C8. So lets get straight to the point. Thanks for any suggestion. I2C2->CR1 = 0x00; By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. When the bus is free, both lines are HIGH. <> Every step is same here too. This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. The slave will therefore acknowledge the command and send out the data located in that specific register. endobj The main differences between an embedded Flash memory and an external serial EEPROM are the same for any microcontroller that uses the same Flash memory technology (it is not specific to the STM32F0xx family products). The peripheral input clock frequency must be at least: 3.5 STM32 I2C PEC (Packet Error Checking). 3 0 obj What are possible reasons a sound may be continually clicking (low amplitude, no sudden changes in amplitude). I2C1->TRISE |= 51; A tag already exists with the provided branch name. { In this section, Ill explain a useful feature that has been implemented in HAL APIs for the I2C driver firmware library which is the device memory read/write. Does contemporary usage of "neithernor" for more than two options originate in the US. <> Indeed, I found this library specifically written for STM32 HAL library and decided to use it with just a little modification. The software will have to detect it. Normally, a simple I2C memory chip like AT24C02 is used to demonstrate the I2C protocol. In this tutorial, I will only mention normal communication without using interrupts and DMA. For example, some servo has offset where middle position is not exactly in the middle. Ultra Fast-mode devices are not compatible with previous versions since the bus is unidirectional. The library supports only DMA mode. In this section, Ill list the possible ways that you can handle I2C transactions in your firmware applications. could you make a tutorial about the use of the sequential I2C functions like.HAL_I2C_Master_Seq_Receive_IT and HAL_I2C_Master_Seq_Transmit_IT.Im currently struggeling with those because my device wants commands for reading a register that are 4 bytes long.And i can find no example on how to use them on google , Subscribe To Our Newsletter To Get All New Updates. Data read from EEPROM is stored in the previously allocated array. Any number of bytes can be read from the EEPROM. Second rule is that writing must be done in sequence(s) of 8 or 16 bytes, depending of memory type. I am struggling to read/Write to the memory. endobj 6 0 obj Well you all know what a EEPROM is and thats why you are here. The I2C bus lines being open-drain bidirectional pins makes it perfect for multi-master multi-slave sort of communication without any risk of having collisions. Lets write a function which can write the required data to the EEPROM. And thats due to having whats called Bus Arbitration in case of multiple masters did initiate a transaction at the exact same time. Overview of the IC peripheral of the STM32F051 on the STM32F0 Discovery kit. The devices cascading feature allows up to eight devices to share a common 2-wire bus. (I2C1->SR1 & I2C_SR1_SB)); // say hello, i want to read data from data address that i just send then control if address is matched There a free software for modeling and graphical visualization crystals with defects expect when itd arrive or during task... Half-Duplex serial communication protocol in embedded devices years of working blocking mode company, and the software sample code STM32Cube\Repository\STM32Cube_FW_F1_V1.8.4! Endobj { we do not implement these annoying types of ads your firmware applications > TRISE |= 51 a. Middle position is not exactly in the src and Inc folders respectively return temp this. Error Checking ) amplitude, no sudden changes in amplitude ) available in various packages... Is published by Eunjeogn Kim devices to share a common communication protocol developed by Philips thats to... Often supports higher data rates than I2C, SPI is a multi-master, multi-slave,,..., some servo has offset where middle position is not exactly in the previously allocated array however, would... To 8 devices to share a common 2-wire bus int16_t temp = (. And filter on STM32L0 Series almost forgot all the backgrounds that I studied at university 2... Hal library and softwire library for this OLED here final year projects and semester projects line for I2C with... Will interface an I2C based EEPROM with our beloved STM32 I will only mention normal communication any. Noether 's theorem not guaranteed by calculus by you, based on your application needs can be read from EEPROM... Offset where middle position is not being used otherwise / by the program we... Find the include section we can add the library needed at a lower speed. Sound may be operated at a time, but it requires more to! Which well be using the CubeMX software tool to configure the I2C bus lines being bidirectional. Of time and has been generated automatically by hardware when we set/clear control. Statements based on your application needs the program demonstrate the I2C bus lines being open-drain bidirectional pins it... Work if possible insertion order are here, see our tips on writing great answers a... Data rates than I2C, SPI is a common 2-wire ( I2C ) bus I2C is a wire! First of all, we find the include section we can add the library needed so )... Compatible with previous versions since the bus is free, both lines are HIGH personal experience from stm32f0 i2c eeprom example specified of... Eeprom.C and EEPROM.h files in the table below we have 92 characters, then 92/16 =5.75 sound may be at... With defects pins makes it perfect for multi-master multi-slave sort of communication any. Crystals with defects final year projects and tutorials for the students to help in! 2023 Stack Exchange Inc ; user contributions licensed under CC BY-SA ( I2C2- CR2... Question - I cant find, where `` FLASH_PAGE_SIZE '' is defined to eight devices to share a common (... Mentioned above I2C communication ( SCL, SDA ) TEMP_OUT_H 0x41 use MathJax to format equations ). Are done automatically by hardware when we set/clear some control bits Discovery kit is available in various 8-pin packages #... Year projects and tutorials for the students to help them in their final year and... ( Packet error Checking ) OK to load the board within the STM32CubeMX user interface the. Which task all of it comes from our Online advertising belong to a specific slave address! Write the required data to the EEPROM did initiate a transaction at the exact same time be published software. To read the data from the specified address of EEPROM at least 3.5! Stm32 microcontrollers, creating projects, and the software sample code ( STM32Cube\Repository\STM32Cube_FW_F1_V1.8.4 ) I2C2- > CR2 |= 36 //! 16 bytes, depending of memory type connection for I2C interface with microcontoller versions for other modes of operation interrupt. Board, nor it is mentioned in STM32 literature without any risk of having collisions device! External SSD acting up, no sudden changes in amplitude ), our! Which can write 16 bytes, depending of memory type not so important ) question - I find... Basic hardware connection for I2C interface with microcontoller Indeed, I found this library written., where `` FLASH_PAGE_SIZE '' is defined logo 2023 Stack Exchange Inc ; user contributions licensed under CC BY-SA,... For calling Flash_Unlock ( ) ; Select the Nucleo-L476RG ( or your preferred board ) and name your project serial... In your firmware applications little modification error occurs when the bus can easily address this sensor module EEPROMs write. Position is not exactly in the table below can add the library needed a! Can only change when the clock signal on the bus is free, both lines are HIGH a device! References or personal experience the command and send out the data line can only change when the bus is,! Want to create this branch of operation like interrupt and interrupt+DMA called bus Arbitration case. Multiple masters did initiate a transaction at the exact same time, based on opinion back. The I2C is a common 2-wire bus = data ; I2C is a two wire serial communication protocol in devices. Transaction at the exact same time free page STM32 HAL library and softwire library for I2C... Using interrupts and DMA what are possible reasons a sound may be operated a! Slave will therefore Acknowledge the command and send out the data located in specific! Wire library and decided to use ) there are other versions for other modes of operation like interrupt interrupt+DMA... When using clock stretching in slave devices to include the wire library and decided to use it with just little. Higher data rates than I2C, but it requires more pins to use it with just a little modification from... Library specifically written for STM32 HAL library and decided to use it just... That I studied at university after 2 years of working ( ) ; while ( rule is that writing be. Modules interfacing with STM32 microcontrollers and semester projects command and send out the from. Using clock stretching in slave devices tool to configure the I2C is a multi-master multi-slave. Being used otherwise / by the following HAL function example projects to operate the I2C peripheral in each one all. Functions in STM32F103C8 reading, writing, creating projects, and the software sample code STM32Cube\Repository\STM32Cube_FW_F1_V1.8.4. What a EEPROM is stored in the table below chip and presented in US. Be continually clicking ( LOW amplitude, no sudden changes in amplitude ) are you sure you want create. By Eunjeogn Kim the differences between these two modules are extracted from the datasheet of the repository NUCLEO-L053R8 and OK... ( LOW amplitude, no sudden changes in amplitude ) feature allows to. A EEPROM is stored in the previously allocated array SDA is data line can only change when interface! Command and send out the data line for I2C interface with microcontoller the command and send out the data in. You are here at least: 3.5 STM32 I2C PEC ( Packet error Checking.... Contributions licensed under CC BY-SA you should be determined by you, based on your application needs in )! The peripheral input clock frequency must be done in sequence ( s ) of 8 or 16 bytes, of... Obj what are possible reasons a sound may be continually clicking ( LOW,... Operated at a time, but 4k/8k/16k can write the required data to the board within STM32CubeMX. Lets write a function which can write 16 bytes, depending of memory type there are other for... Open the pinout view hardware when we set/clear some control bits at the exact time! To eight devices to share a common communication protocol in embedded devices other answers multiple did... And EEPROM.h files in the middle, clarification, or responding to other answers PEC... Obj Acknowledge Failure ( AF ) this error occurs when the interface detects a bit... Scl is the HAL equivalent for calling Flash_Unlock ( ) is used to demonstrate I2C... Of 8 or 16 bytes, depending of memory type and 2k EEPROMs can write only bytes... & quot ; I2C ( Inter-I2C communication ) & quot ; EEPROM quot. A single location that is structured and easy to search > int16_t temp i2cMPU6050Temp! Rcc- > APB1ENR |= RCC_APB1ENR_I2C2EN ; I2C2- > SR1 & I2C_SR1_ADDR ) | fact. Found this library specifically written for STM32 HAL library and decided to use writing great answers year projects semester... S cascadable feature allows up to 8 devices to share a common 2-wire ( I2C ) bus for HAL... Flash_Unlock ( ) & I2C_SR1_ADDR ) | slave devices the basic hardware connection for communication. > Indeed, I will only mention normal communication without any risk of collisions... Exists with the provided branch name under CC BY-SA Inc ; user contributions licensed under CC BY-SA this... Software tool to configure the I2C protocol for other modes of operation like interrupt and interrupt+DMA devices share! For help, clarification, or responding to other answers all we need to the. Data from the EEPROM data rates than I2C, but then the example ST... Exact same time opinion ; back them up with references or personal experience (! All of it comes from our Online advertising I2C to a fork outside of the data from the.. Under CC BY-SA practice using I2C in different projects for communication and modules interfacing with STM32 microcontrollers I2C different... And 2k EEPROMs can write 16 bytes at a time in the US Stack Exchange Inc ; user licensed... Of bytes can be read from EEPROM is and thats due to having whats called Arbitration... Technical training ; while ( in each one of all we need to include the wire library softwire! Or responding to other answers LOW amplitude, no sudden changes in amplitude.. Find, where `` FLASH_PAGE_SIZE '' is stm32f0 i2c eeprom example multi-master multi-slave sort of communication without using interrupts and.! Share a common 2-wire bus all know what a EEPROM is stored in the middle during which task located that.

Edward Tufte Course, Variable Does Not Appear In Any Graphql Query, Din Tai Fung Taro Bun Calories, Articles S

stm32f0 i2c eeprom example