<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Writing and reading float numbers in the flash memory</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/90127/writing-and-reading-float-numbers-in-the-flash-memory</link><description>I want to write numbers in my flash memory so I used this function &amp;quot;nrf_nvmc_write_words&amp;quot; but in it couldn&amp;#39;t save float numbers in my flash memory 
 it is like that in nrf_nvmc.c file: 
 void nrf_nvmc_write_words(uint32_t address, const float * src, uint32_t</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 19 Jul 2022 17:00:22 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/90127/writing-and-reading-float-numbers-in-the-flash-memory" /><item><title>RE: Writing and reading float numbers in the flash memory</title><link>https://devzone.nordicsemi.com/thread/377706?ContentTypeID=1</link><pubDate>Tue, 19 Jul 2022 17:00:22 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:64bc14e0-e42e-46e1-be44-87e2ab6c6b13</guid><dc:creator>gizgiz</dc:creator><description>&lt;p&gt;I wrote this code to save gyroscope and accelerometer data but it gives me errors in the outputs&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;#include &amp;quot;app_error.h&amp;quot;&lt;br /&gt;#include &amp;quot;app_util_platform.h&amp;quot;&lt;br /&gt;#include &amp;quot;boards.h&amp;quot;&lt;br /&gt;#include &amp;quot;math.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_delay.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_drv_twi.h&amp;quot;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/p&gt;
&lt;p&gt;#include &amp;quot;LSM9DS1.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_drv_rtc.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_log.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_log_ctrl.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_log_default_backends.h&amp;quot;&lt;/p&gt;
&lt;p&gt;#include &amp;lt;stdbool.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;quot;nrf.h&amp;quot;&lt;br /&gt;#include &amp;quot;bsp.h&amp;quot;&lt;br /&gt;#include &amp;quot;app_error.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_nvmc.h&amp;quot;&lt;br /&gt;#include &amp;quot;nordic_common.h&amp;quot;&lt;/p&gt;
&lt;p&gt;#include &amp;quot;nrf_log.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_log_ctrl.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_log_default_backends.h&amp;quot;&lt;/p&gt;
&lt;p&gt;#include &amp;quot;app_timer.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_drv_clock.h&amp;quot;&lt;/p&gt;
&lt;p&gt;#include &amp;quot;nrf_cli.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_cli_uart.h&amp;quot;&lt;br /&gt;#include &amp;quot;nrf_delay.h&amp;quot;&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt; * @brief Function for application main entry.&lt;br /&gt; */&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;// static void create_timers() {&lt;br /&gt;// ret_code_t err_code;&lt;/p&gt;
&lt;p&gt;// Create timers&lt;br /&gt;// err_code = app_timer_create(&amp;amp;m_repeated_timer_id,&lt;br /&gt; // APP_TIMER_MODE_REPEATED,&lt;br /&gt; // repeated_timer_200);&lt;br /&gt; // APP_ERROR_CHECK(err_code);&lt;br /&gt; // err_code = app_timer_create(&amp;amp;timer400,&lt;br /&gt; // APP_TIMER_MODE_REPEATED,&lt;br /&gt; // repeated_timer_400);&lt;br /&gt; //APP_ERROR_CHECK(err_code);&lt;br /&gt; //err_code = app_timer_create(&amp;amp;imutimer,&lt;br /&gt; // APP_TIMER_MODE_REPEATED,&lt;br /&gt; // imutimerhandler);&lt;br /&gt; //err_code = app_timer_create(&amp;amp;pressuretimer,&lt;br /&gt; // APP_TIMER_MODE_REPEATED,&lt;br /&gt; // pressuretimerhandler);&lt;br /&gt;//}&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;const nrf_drv_rtc_t rtc = NRF_DRV_RTC_INSTANCE(2);&lt;/p&gt;
&lt;p&gt;static void rtc_handler(nrf_drv_rtc_int_type_t int_type) {&lt;br /&gt; if (int_type == NRF_DRV_RTC_INT_COMPARE0) {&lt;br /&gt; //NRF_LOG_INFO(&amp;quot;Compare event &amp;quot;);&lt;br /&gt; } else if (int_type == NRF_DRV_RTC_INT_TICK) {&lt;br /&gt; //NRF_LOG_INFO(&amp;quot; Tick Event &amp;quot;);&lt;br /&gt; }&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;/** @brief Function starting the internal LFCLK XTAL oscillator.&lt;br /&gt; */&lt;br /&gt;static void lfclk_config(void) {&lt;br /&gt; //ret_code_t err_code = nrf_drv_clock_init();&lt;br /&gt; //APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;nrf_drv_clock_lfclk_request(NULL);&lt;br /&gt; NRF_LOG_INFO(&amp;quot; Low Frequency Configuration done &amp;quot;);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;static void rtc_config(void) {&lt;br /&gt; uint32_t err_code;&lt;/p&gt;
&lt;p&gt;//Initialize RTC instance&lt;br /&gt; nrf_drv_rtc_config_t config = NRF_DRV_RTC_DEFAULT_CONFIG;&lt;br /&gt; config.prescaler = 4;&lt;br /&gt; err_code = nrf_drv_rtc_init(&amp;amp;rtc, &amp;amp;config, rtc_handler);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;//Enable tick event &amp;amp; interrupt&lt;br /&gt; // nrf_drv_rtc_tick_enable(&amp;amp;rtc,true);&lt;/p&gt;
&lt;p&gt;//Set compare channel to trigger interrupt after COMPARE_COUNTERTIME seconds&lt;br /&gt; // err_code = nrf_drv_rtc_cc_set(&amp;amp;rtc,0,COMPARE_COUNTERTIME * 8,true);&lt;br /&gt; // APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;//Power on RTC instance&lt;br /&gt; nrf_drv_rtc_enable(&amp;amp;rtc);&lt;br /&gt; NRF_LOG_INFO(&amp;quot;RTC Configuration done&amp;quot;);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;//end of timer stuff&lt;/p&gt;
&lt;p&gt;uint64_t micros() {&lt;br /&gt; uint64_t timer;&lt;br /&gt; timer = nrfx_rtc_counter_get(&amp;amp;rtc);&lt;br /&gt; return timer * 125;&lt;br /&gt; //return timer * 125; TRUE VALUE&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;static void log_init(void) {&lt;br /&gt; ret_code_t err_code = NRF_LOG_INIT(NULL);&lt;br /&gt; APP_ERROR_CHECK(err_code);&lt;/p&gt;
&lt;p&gt;NRF_LOG_DEFAULT_BACKENDS_INIT();&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;int number=100; &lt;br /&gt;int main(void) { //me&lt;br /&gt; nrf_gpio_cfg_output(NRF_GPIO_PIN_MAP(1, 0));&lt;br /&gt; nrf_gpio_pin_set(NRF_GPIO_PIN_MAP(1, 0));&lt;/p&gt;
&lt;p&gt;nrf_gpio_cfg_output(NRF_GPIO_PIN_MAP(0, 22));&lt;br /&gt; nrf_gpio_pin_set(NRF_GPIO_PIN_MAP(0, 22));&lt;/p&gt;
&lt;p&gt;log_init();&lt;br /&gt; twi_init2();&lt;/p&gt;
&lt;p&gt;rtc_config();&lt;br /&gt; lfclk_config();&lt;br /&gt; nrf_delay_ms(10);&lt;br /&gt; begin();&lt;/p&gt;
&lt;p&gt;//Testing thing&lt;br /&gt; char Texttesting[] = &amp;quot;Baha:50 &amp;quot;;&lt;/p&gt;
&lt;p&gt;NRF_LOG_INFO(&amp;quot;Hello&amp;quot;);&lt;/p&gt;
&lt;p&gt;//ITS ON!&lt;br /&gt; //nrf_delay_ms(100);&lt;br /&gt; //yellowledoff();&lt;/p&gt;
&lt;p&gt;//gyroscope Calibration :&lt;br /&gt; setGyroFS(2);&lt;br /&gt; setGyroODR(5);&lt;br /&gt; setGyroOffset(-0.033844, 0.557159, -0.420441);&lt;br /&gt; setGyroSlope(1.111426, 1.188752, 1.148356);&lt;/p&gt;
&lt;p&gt;//magnatometer calibration :&lt;br /&gt; setMagnetFS(0);&lt;br /&gt; setMagnetODR(8);&lt;br /&gt; setMagnetOffset(55.104370, -0.712280, -7.662354);&lt;br /&gt; setMagnetSlope(1.295429, 1.251174, 1.354278);&lt;/p&gt;
&lt;p&gt;//accelometer calibration :&lt;br /&gt; setAccelFS(3);&lt;br /&gt; setAccelODR(5);&lt;br /&gt; setAccelOffset(-0.011773, -0.000467, -0.011638);&lt;br /&gt; setAccelSlope(1.011914, 1.000468, 0.988496);&lt;/p&gt;
&lt;p&gt;/* Configure board. */&lt;br /&gt; bsp_board_init(BSP_INIT_LEDS); //me&lt;/p&gt;
&lt;p&gt;/* Toggle LEDs. */&lt;br /&gt; //me&lt;br /&gt;float gx,gy,gz,ax,ay,az,mx,my,mz;&lt;br /&gt; uint32_t t[100];&lt;br /&gt; float r[100];&lt;br /&gt;int j=0;&lt;br /&gt;int i;&lt;/p&gt;
&lt;p&gt;while (j&amp;lt;100) {&lt;br /&gt; if (gyroAvailable()) // alias IMU.gyroscopeAvailable&lt;br /&gt; {&lt;br /&gt; readGyro(&amp;amp;gx, &amp;amp;gy, &amp;amp;gz);&lt;br /&gt; r[j]= gx*1000;&lt;br /&gt;j=j+1;&lt;/p&gt;
&lt;p&gt;r[j]= gy*1000;&lt;br /&gt;j=j+1;&lt;/p&gt;
&lt;p&gt;r[j]= gz*1000;&lt;br /&gt;j=j+1;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;}&lt;br /&gt; if (accelAvailable()) // alias IMU.accelerationAvailable in library version 1.01&lt;br /&gt; {&lt;br /&gt; readAccel(&amp;amp;ax, &amp;amp;ay, &amp;amp;az); // alias IMU.readAcceleration in library version 1.01&lt;br /&gt; &lt;br /&gt; r[j]= ax*1000;&lt;br /&gt;j=j+1;&lt;/p&gt;
&lt;p&gt;r[j]= ay*1000;&lt;br /&gt;j=j+1;&lt;/p&gt;
&lt;p&gt;r[j]= az*1000;&lt;br /&gt;j=j+1;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; NRF_LOG_INFO(&amp;quot;Gyroscope Information &amp;quot;);&lt;br /&gt; NRF_LOG_FLUSH();&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot; gx: &amp;quot; NRF_LOG_FLOAT_MARKER , NRF_LOG_FLOAT(gx));&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot; gy: &amp;quot; NRF_LOG_FLOAT_MARKER , NRF_LOG_FLOAT(gy));&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot; gz: &amp;quot; NRF_LOG_FLOAT_MARKER , NRF_LOG_FLOAT(gz));&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot;\n\r&amp;quot;);&lt;/p&gt;
&lt;p&gt;NRF_LOG_INFO(&amp;quot;Acceleration Information &amp;quot;);&lt;br /&gt; NRF_LOG_FLUSH();&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot; ax: &amp;quot; NRF_LOG_FLOAT_MARKER, NRF_LOG_FLOAT(ax));&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot; ay: &amp;quot; NRF_LOG_FLOAT_MARKER, NRF_LOG_FLOAT(ay));&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot; az: &amp;quot; NRF_LOG_FLOAT_MARKER, NRF_LOG_FLOAT(az));&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot;\n\r&amp;quot;);&lt;/p&gt;
&lt;p&gt;NRF_LOG_INFO(&amp;quot; Index: %d&amp;quot;,j);&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;for (int i=0; i&amp;lt;100;i++)&lt;br /&gt;{ if(r[i]&amp;gt;=0)&lt;br /&gt; t[i]=r[i];&lt;br /&gt; else&lt;br /&gt; t[i]=(r[i]*(-1000));&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot; r[i]: &amp;quot; NRF_LOG_FLOAT_MARKER, NRF_LOG_FLOAT(r[i]));&lt;br /&gt; NRF_LOG_RAW_INFO(&amp;quot; t[i]: &amp;quot; NRF_LOG_FLOAT_MARKER, NRF_LOG_FLOAT(t[i]));&lt;/p&gt;
&lt;p&gt;&lt;br /&gt; NRF_LOG_FLUSH();&lt;br /&gt; nrf_delay_us(1500);&lt;br /&gt; }&lt;/p&gt;
&lt;p&gt;//t[i]=r[i];&lt;/p&gt;
&lt;p&gt;float k[100];&lt;br /&gt;for(int i=0;i&amp;lt;number;i++)&lt;br /&gt;k[i]=t[i];&lt;/p&gt;
&lt;p&gt;NRF_LOG_INFO(&amp;quot;Application started&amp;quot;);&lt;br /&gt;uint32_t f_addr = 0x000f7000;&lt;br /&gt;uint32_t * p_addr = (uint32_t *)f_addr;&lt;br /&gt;nrf_nvmc_page_erase(f_addr);&lt;br /&gt;NRF_LOG_INFO(&amp;quot;writing the value to the given address&amp;quot;);&lt;br /&gt;nrf_nvmc_write_words(f_addr, k, 100);&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;for(int i=0; i&amp;lt;100; i++)&lt;br /&gt;{&lt;br /&gt;NRF_LOG_INFO(&amp;quot;The Data read from flash is: %d&amp;quot;, (* p_addr+i));&lt;br /&gt;nrf_delay_us(1500);&lt;br /&gt;NRF_LOG_FLUSH();&lt;br /&gt;}&lt;br /&gt; nrf_delay_ms(100);&lt;br /&gt; }&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt; *@}&lt;br /&gt; **/&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Writing and reading float numbers in the flash memory</title><link>https://devzone.nordicsemi.com/thread/377697?ContentTypeID=1</link><pubDate>Tue, 19 Jul 2022 15:18:06 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8ac3cd92-e403-4bc9-90d5-ab0a7c8feaf8</guid><dc:creator>tesc</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;For the purpose of writing and reading bytes to and from flash, the type doesn&amp;#39;t really matter. Casting the pointer will not change the value pointed to. You can treat the uint32_t pointer used by that flash API as a pointer to an arbitrary 4 byte data type. Casting any pointer to a 4 byte data type, such as a pointer to a float, to a pointer to uint32_t, will allow you to store the bits verbatim to flash using this API.&lt;/p&gt;
&lt;p&gt;Regards,&lt;br /&gt;Terje&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Writing and reading float numbers in the flash memory</title><link>https://devzone.nordicsemi.com/thread/377691?ContentTypeID=1</link><pubDate>Tue, 19 Jul 2022 15:04:33 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:5979ee9c-5cc8-4fd1-b961-bbc6389d595c</guid><dc:creator>gizgiz</dc:creator><description>&lt;p&gt;but I want to save float numbers and tread them&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Writing and reading float numbers in the flash memory</title><link>https://devzone.nordicsemi.com/thread/377600?ContentTypeID=1</link><pubDate>Tue, 19 Jul 2022 11:40:21 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:6090cbd6-53f4-42db-8453-d76fa52c7f02</guid><dc:creator>tesc</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Instead of modifying the SDK to change the function to float, instead cast the pointer you send in to the function to an uint32_t pointer (in your application code.) Do the same when reading the values out again.&lt;/p&gt;
&lt;p&gt;Regards,&lt;br /&gt;Terje&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>