<pre id="tr9tv"><ruby id="tr9tv"><var id="tr9tv"></var></ruby></pre>

    <p id="tr9tv"></p>

    <p id="tr9tv"></p><ruby id="tr9tv"></ruby>

        <pre id="tr9tv"></pre>

          <ruby id="tr9tv"></ruby>

          <p id="tr9tv"><cite id="tr9tv"></cite></p>
          <track id="tr9tv"><b id="tr9tv"><thead id="tr9tv"></thead></b></track>

              <p id="tr9tv"></p>

                          <del id="tr9tv"></del>
                            <pre id="tr9tv"></pre><p id="tr9tv"></p>

                            <pre id="tr9tv"><del id="tr9tv"><mark id="tr9tv"></mark></del></pre>
                            <ruby id="tr9tv"></ruby>
                            <p id="tr9tv"></p>
                                <del id="tr9tv"><mark id="tr9tv"><progress id="tr9tv"></progress></mark></del>

                                      <p id="tr9tv"></p>
                                      <p id="tr9tv"><del id="tr9tv"><dfn id="tr9tv"></dfn></del></p> <big id="tr9tv"></big>
                                      <p id="tr9tv"><del id="tr9tv"><thead id="tr9tv"></thead></del></p>

                                        <p id="tr9tv"></p>

                                          <ruby id="tr9tv"></ruby>

                                          <output id="tr9tv"></output>
                                          <track id="tr9tv"></track>

                                            <p id="tr9tv"></p>

                                            <p id="tr9tv"></p>

                                                <pre id="tr9tv"><del id="tr9tv"></del></pre>
                                                <pre id="tr9tv"><del id="tr9tv"><thead id="tr9tv"></thead></del></pre>

                                                <p id="tr9tv"></p>
                                                <p id="tr9tv"></p><pre id="tr9tv"><cite id="tr9tv"></cite></pre>

                                                <ruby id="tr9tv"><mark id="tr9tv"><progress id="tr9tv"></progress></mark></ruby>

                                                      <p id="tr9tv"></p>
                                                      <ruby id="tr9tv"><mark id="tr9tv"><form id="tr9tv"></form></mark></ruby>

                                                        <p id="tr9tv"></p><pre id="tr9tv"><del id="tr9tv"></del></pre>

                                                        <p id="tr9tv"><cite id="tr9tv"></cite></p>

                                                              <pre id="tr9tv"><b id="tr9tv"><var id="tr9tv"></var></b></pre>
                                                                <pre id="tr9tv"><b id="tr9tv"></b></pre>

                                                                      <pre id="tr9tv"></pre><pre id="tr9tv"><del id="tr9tv"></del></pre>
                                                                        <p id="tr9tv"></p>

                                                                            <pre id="tr9tv"><ruby id="tr9tv"></ruby></pre>

                                                                                  <p id="tr9tv"></p>

                                                                                      <pre id="tr9tv"><del id="tr9tv"><mark id="tr9tv"></mark></del></pre>

                                                                                          <p id="tr9tv"><cite id="tr9tv"></cite></p>
                                                                                            <p id="tr9tv"><dfn id="tr9tv"></dfn></p>
                                                                                            <p id="tr9tv"></p>
                                                                                                <pre id="tr9tv"><ruby id="tr9tv"><var id="tr9tv"></var></ruby></pre>

                                                                                                  <pre id="tr9tv"><ruby id="tr9tv"><mark id="tr9tv"></mark></ruby></pre>

                                                                                                        <pre id="tr9tv"><del id="tr9tv"><mark id="tr9tv"></mark></del></pre>
                                                                                                        0
                                                                                                        • 聊天消息
                                                                                                        • 系統消息
                                                                                                        • 評論與回復
                                                                                                        登錄后你可以
                                                                                                        • 下載海量資料
                                                                                                        • 學習在線課程
                                                                                                        • 觀看技術視頻
                                                                                                        • 寫文章/發帖/加入社區
                                                                                                        會員中心
                                                                                                        創作中心

                                                                                                        完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

                                                                                                        3天內不再提示

                                                                                                        e2studio開發磁力計LIS2MDL(1)----輪詢獲取磁力計數據

                                                                                                        嵌入式單片機MCU開發 ? 來源:嵌入式單片機MCU開發 ? 作者:嵌入式單片機MCU開 ? 2024-05-16 16:54 ? 次閱讀

                                                                                                        概述

                                                                                                        本文將介紹如何使用 LIS2MDL 傳感器來讀取數據。主要步驟包括初始化傳感器接口、驗證設備ID、配置傳感器的數據輸出率和濾波器,以及通過輪詢方式持續讀取磁力數據和溫度數據。讀取到的數據會被轉換為適當的單位并通過串行通信輸出。 這個傳感器常用于多種電子設備中,以提供精確的磁場強度數據,從而用于指南針應用、位置追蹤或者動作檢測等功能。

                                                                                                        最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。

                                                                                                        視頻教學

                                                                                                        [https://www.bilibili.com/video/BV16K4y1B7MQ/]

                                                                                                        樣品申請

                                                                                                        [https://www.wjx.top/vm/OhcKxJk.aspx#]

                                                                                                        源碼下載

                                                                                                        [https://download.csdn.net/download/qq_24312945/88722848]

                                                                                                        速率

                                                                                                        該模塊支持的速度為普通模式(100k)、快速模式(400k)、快速模式+(1M)、高速模式(3.4M)。

                                                                                                        新建工程

                                                                                                        工程模板

                                                                                                        保存工程路徑

                                                                                                        芯片配置

                                                                                                        本文中使用R7FA4M2AD3CFL來進行演示。

                                                                                                        工程模板選擇

                                                                                                        時鐘設置

                                                                                                        開發板上的外部高速晶振為12M.

                                                                                                        需要修改XTAL為12M。

                                                                                                        UART配置

                                                                                                        點擊Stacks->New Stack->Driver->Connectivity -> UART Driver on r_sci_uart。

                                                                                                        UART屬性配置

                                                                                                        設置e2studio堆棧

                                                                                                        printf函數通常需要設置堆棧大小。這是因為printf函數在運行時需要使用??臻g來存儲臨時變量和函數調用信息。如果堆棧大小不足,可能會導致程序崩潰或不可預期的行為。
                                                                                                        printf函數使用了可變參數列表,它會在調用時使用棧來存儲參數,在函數調用結束時再清除參數,這需要足夠的??臻g。另外printf也會使用一些臨時變量,如果??臻g不足,會導致程序崩潰。
                                                                                                        因此,為了避免這類問題,應該根據程序的需求來合理設置堆棧大小。

                                                                                                        e2studio的重定向printf設置

                                                                                                        嵌入式系統的開發中,尤其是在使用GNU編譯器集合(GCC)時,–specs 參數用于指定鏈接時使用的系統規格(specs)文件。這些規格文件控制了編譯器和鏈接器的行為,尤其是關于系統庫和啟動代碼的鏈接。–specs=rdimon.specs 和 --specs=nosys.specs 是兩種常見的規格文件,它們用于不同的場景。
                                                                                                        –specs=rdimon.specs
                                                                                                        用途: 這個選項用于鏈接“Redlib”庫,這是為裸機(bare-metal)和半主機(semihosting)環境設計的C庫的一個變體。半主機環境是一種特殊的運行模式,允許嵌入式程序通過宿主機(如開發PC)的調試器進行輸入輸出操作。
                                                                                                        應用場景: 當你需要在沒有完整操作系統的環境中運行程序,但同時需要使用調試器來處理輸入輸出(例如打印到宿主機的終端),這個選項非常有用。
                                                                                                        特點: 它提供了一些基本的系統調用,通過調試接口與宿主機通信。
                                                                                                        –specs=nosys.specs
                                                                                                        用途: 這個選項鏈接了一個非?;镜南到y庫,這個庫不提供任何系統服務的實現。
                                                                                                        應用場景: 適用于完全的裸機程序,其中程序不執行任何操作系統調用,比如不進行文件操作或者系統級輸入輸出。
                                                                                                        特點: 這是一個更“裸”的環境,沒有任何操作系統支持。使用這個規格文件,程序不期望有操作系統層面的任何支持。
                                                                                                        如果你的程序需要與宿主機進行交互(如在開發期間的調試),并且通過調試器進行基本的輸入輸出操作,則使用 --specs=rdimon.specs。
                                                                                                        如果你的程序是完全獨立的,不需要任何形式的操作系統服務,包括不進行任何系統級的輸入輸出,則使用 --specs=nosys.specs。

                                                                                                        R_SCI_UART_Open()函數原型

                                                                                                        故可以用 R_SCI_UART_Open()函數進行配置,開啟和初始化UART。

                                                                                                        /* Open the transfer instance with initial configuration. */
                                                                                                            err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
                                                                                                            assert(FSP_SUCCESS == err);
                                                                                                        

                                                                                                        回調函數user_uart_callback ()

                                                                                                        當數據發送的時候,可以查看UART_EVENT_TX_COMPLETE來判斷是否發送完畢。

                                                                                                        可以檢查檢查 "p_args" 結構體中的 "event" 字段的值是否等于 "UART_EVENT_TX_COMPLETE"。如果條件為真,那么 if 語句后面的代碼塊將會執行。

                                                                                                        fsp_err_t err = FSP_SUCCESS;
                                                                                                        volatile bool uart_send_complete_flag = false;
                                                                                                        void user_uart_callback (uart_callback_args_t * p_args)
                                                                                                        {
                                                                                                            if(p_args- >event == UART_EVENT_TX_COMPLETE)
                                                                                                            {
                                                                                                                uart_send_complete_flag = true;
                                                                                                            }
                                                                                                        }
                                                                                                        

                                                                                                        printf輸出重定向到串口

                                                                                                        打印最常用的方法是printf,所以要解決的問題是將printf的輸出重定向到串口,然后通過串口將數據發送出去。 注意一定要加上頭文件#include

                                                                                                        #ifdef __GNUC__                                 //串口重定向
                                                                                                            #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
                                                                                                        #else
                                                                                                            #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
                                                                                                        #endif
                                                                                                        
                                                                                                        PUTCHAR_PROTOTYPE
                                                                                                        {
                                                                                                                err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
                                                                                                                if(FSP_SUCCESS != err) __BKPT();
                                                                                                                while(uart_send_complete_flag == false){}
                                                                                                                uart_send_complete_flag = false;
                                                                                                                return ch;
                                                                                                        }
                                                                                                        
                                                                                                        int _write(int fd,char *pBuffer,int size)
                                                                                                        {
                                                                                                            for(int i=0;i< size;i++)
                                                                                                            {
                                                                                                                __io_putchar(*pBuffer++);
                                                                                                            }
                                                                                                            return size;
                                                                                                        }
                                                                                                        

                                                                                                        通信模式

                                                                                                        對于LIS2MDL,可以使用SPI或者IIC進行通訊。 最小系統圖如下所示。

                                                                                                        在CS管腳為1的時候,為IIC模式

                                                                                                        本文使用的板子原理圖如下所示。

                                                                                                        CS對應到RA4M2板子上的端口為P014。

                                                                                                        配置為輸出管腳。

                                                                                                        R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_HIGH);
                                                                                                        

                                                                                                        IIC屬性配置

                                                                                                        查看手冊,可以得知LIS2MDL的IIC地址為“0011110” ,即0x1E

                                                                                                        IIC配置

                                                                                                        配置RA4M2的I2C接口,使其作為I2C master進行通信。 查看開發板原理圖,對應的IIC為P407和P408。

                                                                                                        點擊Stacks->New Stack->Connectivity -> I2C Master(r_iic_master)。

                                                                                                        設置IIC的配置,需要注意從機的地址。

                                                                                                        R_IIC_MASTER_Open()函數原型

                                                                                                        R_IIC_MASTER_Open()函數為執行IIC初始化,開啟配置如下所示。

                                                                                                        /* Initialize the I2C module */
                                                                                                            err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);
                                                                                                            /* Handle any errors. This function should be defined by the user. */
                                                                                                            assert(FSP_SUCCESS == err);
                                                                                                        

                                                                                                        R_IIC_MASTER_Write()函數原型

                                                                                                        R_IIC_MASTER_Write()函數是向IIC設備中寫入數據,寫入格式如下所示。

                                                                                                        err = R_IIC_MASTER_Write(&g_i2c_master0_ctrl, &reg, 1, true);
                                                                                                            assert(FSP_SUCCESS == err);
                                                                                                        

                                                                                                        R_IIC_MASTER_Read()函數原型

                                                                                                        R_SCI_I2C_Read()函數是向IIC設備中讀取數據,讀取格式如下所示。

                                                                                                        /* Read data from I2C slave */
                                                                                                            err = R_IIC_MASTER_Read(&g_i2c_master0_ctrl, bufp, len, false);
                                                                                                            assert(FSP_SUCCESS == err);
                                                                                                        

                                                                                                        sci_i2c_master_callback()回調函數

                                                                                                        對于數據是否發送完畢,可以查看是否獲取到I2C_MASTER_EVENT_TX_COMPLETE字段。

                                                                                                        /* Callback function */
                                                                                                        i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
                                                                                                        uint32_t  timeout_ms = 100000;
                                                                                                        void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
                                                                                                        {
                                                                                                            i2c_event = I2C_MASTER_EVENT_ABORTED;
                                                                                                            if (NULL != p_args)
                                                                                                            {
                                                                                                                /* capture callback event for validating the i2c transfer event*/
                                                                                                                i2c_event = p_args- >event;
                                                                                                            }
                                                                                                        }
                                                                                                        

                                                                                                        參考程序

                                                                                                        [https://github.com/STMicroelectronics/lis2mdl-pid]

                                                                                                        初始換管腳

                                                                                                        使能CS為高電平,配置為IIC模式。

                                                                                                        R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_HIGH);       
                                                                                                               /* Initialize the I2C module */
                                                                                                               err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);
                                                                                                               /* Handle any errors. This function should be defined by the user. */
                                                                                                               assert(FSP_SUCCESS == err);
                                                                                                        
                                                                                                               /* Initialize mems driver interface */
                                                                                                               stmdev_ctx_t dev_ctx;
                                                                                                               dev_ctx.write_reg = platform_write;
                                                                                                               dev_ctx.read_reg = platform_read;
                                                                                                               dev_ctx.handle = &SENSOR_BUS;
                                                                                                        
                                                                                                               /* Wait sensor boot time */
                                                                                                               platform_delay(BOOT_TIME);
                                                                                                        

                                                                                                        獲取ID

                                                                                                        可以向WHO_AM_I (4Fh)獲取固定值,判斷是否為0x40

                                                                                                        is2mdl_device_id_get為獲取函數。

                                                                                                        對應的獲取ID驅動程序,如下所示。

                                                                                                        /* Wait sensor boot time */
                                                                                                          platform_delay(BOOT_TIME);
                                                                                                          /* Check device ID */
                                                                                                          lis2mdl_device_id_get(&dev_ctx, &whoamI);
                                                                                                            printf("LIS2MDL_ID=0x%x,whoamI=0x%xn",LIS2MDL_ID,whoamI);
                                                                                                          if (whoamI != LIS2MDL_ID)
                                                                                                            while (1) {
                                                                                                              /* manage here device not found */
                                                                                                            }
                                                                                                        

                                                                                                        復位操作

                                                                                                        可以向CFG_REG_A (60h)的SOFT_RST寄存器寫入1進行復位。

                                                                                                        lis2mdl_reset_set為重置函數。

                                                                                                        對應的驅動程序,如下所示。

                                                                                                        /* Restore default configuration */
                                                                                                          lis2mdl_reset_set(&dev_ctx, PROPERTY_ENABLE);
                                                                                                        
                                                                                                          do {
                                                                                                            lis2mdl_reset_get(&dev_ctx, &rst);
                                                                                                          } while (rst);
                                                                                                        

                                                                                                        BDU設置

                                                                                                        在很多傳感器中,數據通常被存儲在輸出寄存器中,這些寄存器分為兩部分:MSB和LSB。這兩部分共同表示一個完整的數據值。例如,在一個加速度計中,MSB和LSB可能共同表示一個加速度的測量值。
                                                                                                        連續更新模式(BDU = ‘0’):在默認模式下,輸出寄存器的值會持續不斷地被更新。這意味著在你讀取MSB和LSB的時候,寄存器中的數據可能會因為新的測量數據而更新。這可能導致一個問題:當你讀取MSB時,如果寄存器更新了,接下來讀取的LSB可能就是新的測量值的一部分,而不是與MSB相對應的值。這樣,你得到的就是一個“拼湊”的數據,它可能無法準確代表任何實際的測量時刻。
                                                                                                        塊數據更新(BDU)模式(BDU = ‘1’):當激活BDU功能時,輸出寄存器中的內容不會在讀取MSB和LSB之間更新。這就意味著一旦開始讀取數據(無論是先讀MSB還是LSB),寄存器中的那一組數據就被“鎖定”,直到兩部分都被讀取完畢。這樣可以確保你讀取的MSB和LSB是同一測量時刻的數據,避免了讀取到代表不同采樣時刻的數據。
                                                                                                        簡而言之,BDU位的作用是確保在讀取數據時,輸出寄存器的內容保持穩定,從而避免讀取到拼湊或錯誤的數據。這對于需要高精度和穩定性的應用尤為重要。
                                                                                                        可以向CTRL3 (12h)的BDU寄存器寫入1進行開啟。

                                                                                                        對應的驅動程序,如下所示。

                                                                                                        /* Enable Block Data Update */
                                                                                                          lis2mdl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
                                                                                                        

                                                                                                        設置速率

                                                                                                        速率可以通過CFG_REG_A (60h)的ODR設置速率。

                                                                                                        設置速率可以使用如下函數。

                                                                                                        /* Set Output Data Rate */
                                                                                                          lis2mdl_data_rate_set(&dev_ctx, LIS2MDL_ODR_10Hz);
                                                                                                        

                                                                                                        啟用偏移消除

                                                                                                        LIS2MDL 磁力計的配置寄存器(CFG_REG_B)的OFF_CANC - 這個位用于啟用或禁用偏移消除。
                                                                                                        這意味著每次磁力計準備輸出新的測量數據時,它都會自動進行偏移校準,以確保數據的準確性。這通常用于校準傳感器,以消除由于傳感器偏移或環境因素引起的任何誤差。

                                                                                                        /* Set / Reset sensor mode */
                                                                                                          lis2mdl_set_rst_mode_set(&dev_ctx, LIS2MDL_SENS_OFF_CANC_EVERY_ODR);
                                                                                                        

                                                                                                        開啟溫度補償

                                                                                                        開啟溫度補償可以通過CFG_REG_A (60h)的COMP_TEMP_EN進行配置。

                                                                                                        /* Enable temperature compensation */
                                                                                                          lis2mdl_offset_temp_comp_set(&dev_ctx, PROPERTY_ENABLE);
                                                                                                        

                                                                                                        設置為連續模式

                                                                                                        LIS2MDL 磁力計 CFG_REG_A (60h) 配置寄存器的MD1 和 MD0 - 這兩個位用于選擇設備的工作模式。
                                                                                                        00 - 連續模式,設備連續進行測量并將結果放在數據寄存器中。
                                                                                                        01 - 單次模式,設備進行單次測量,然后返回到空閑模式。
                                                                                                        10 和 11 - 空閑模式,設備被置于空閑模式,但I2C和SPI接口仍然激活

                                                                                                        /* Set device in continuous mode */
                                                                                                          lis2mdl_operating_mode_set(&dev_ctx, LIS2MDL_CONTINUOUS_MODE);
                                                                                                        

                                                                                                        輪詢讀取數據

                                                                                                        對于數據是否準備好,可以查看STATUS_REG (67h)的Zyxda位,判斷是否有新數據到達。

                                                                                                        uint8_t reg;
                                                                                                            /* Read output only if new value is available */
                                                                                                            lis2mdl_mag_data_ready_get(&dev_ctx, &reg);
                                                                                                        

                                                                                                        數據OUTX_L_REG(68h)-OUTZ_H_REG(6Dh)獲取。

                                                                                                        /* Read magnetic field data */
                                                                                                              memset(data_raw_magnetic, 0x00, 3 * sizeof(int16_t));
                                                                                                              lis2mdl_magnetic_raw_get(&dev_ctx, data_raw_magnetic);
                                                                                                              magnetic_mG[0] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[0]);
                                                                                                              magnetic_mG[1] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[1]);
                                                                                                              magnetic_mG[2] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[2]);
                                                                                                        

                                                                                                        主程序

                                                                                                        #include "hal_data.h"
                                                                                                        
                                                                                                        #include < stdio.h >
                                                                                                        #include "lis2mdl_reg.h"
                                                                                                        
                                                                                                        fsp_err_t err = FSP_SUCCESS;
                                                                                                        volatile bool uart_send_complete_flag = false;
                                                                                                        void user_uart_callback (uart_callback_args_t * p_args)
                                                                                                        {
                                                                                                            if(p_args- >event == UART_EVENT_TX_COMPLETE)
                                                                                                            {
                                                                                                                uart_send_complete_flag = true;
                                                                                                            }
                                                                                                        }
                                                                                                        
                                                                                                        
                                                                                                        /* Callback function */
                                                                                                        i2c_master_event_t i2c_event = I2C_MASTER_EVENT_ABORTED;
                                                                                                        uint32_t  timeout_ms = 100000;
                                                                                                        void sci_i2c_master_callback(i2c_master_callback_args_t *p_args)
                                                                                                        {
                                                                                                            i2c_event = I2C_MASTER_EVENT_ABORTED;
                                                                                                            if (NULL != p_args)
                                                                                                            {
                                                                                                                /* capture callback event for validating the i2c transfer event*/
                                                                                                                i2c_event = p_args- >event;
                                                                                                            }
                                                                                                        }
                                                                                                        
                                                                                                        
                                                                                                        
                                                                                                        #ifdef __GNUC__                                 //串口重定向
                                                                                                            #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
                                                                                                        #else
                                                                                                            #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
                                                                                                        #endif
                                                                                                        
                                                                                                        PUTCHAR_PROTOTYPE
                                                                                                        {
                                                                                                                err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
                                                                                                                if(FSP_SUCCESS != err) __BKPT();
                                                                                                                while(uart_send_complete_flag == false){}
                                                                                                                uart_send_complete_flag = false;
                                                                                                                return ch;
                                                                                                        }
                                                                                                        
                                                                                                        int _write(int fd,char *pBuffer,int size)
                                                                                                        {
                                                                                                            for(int i=0;i< size;i++)
                                                                                                            {
                                                                                                                __io_putchar(*pBuffer++);
                                                                                                            }
                                                                                                            return size;
                                                                                                        }
                                                                                                        
                                                                                                        FSP_CPP_HEADER
                                                                                                        void R_BSP_WarmStart(bsp_warm_start_event_t event);
                                                                                                        FSP_CPP_FOOTER
                                                                                                        
                                                                                                        
                                                                                                        #define SENSOR_BUS g_i2c_master0_ctrl
                                                                                                        
                                                                                                        /* Private macro -------------------------------------------------------------*/
                                                                                                        #define    BOOT_TIME        20 //ms
                                                                                                        
                                                                                                        /* Private variables ---------------------------------------------------------*/
                                                                                                        static int16_t data_raw_magnetic[3];
                                                                                                        static int16_t data_raw_temperature;
                                                                                                        static float magnetic_mG[3];
                                                                                                        static float temperature_degC;
                                                                                                        static uint8_t whoamI, rst;
                                                                                                        static uint8_t tx_buffer[1000];
                                                                                                        
                                                                                                        /* Extern variables ----------------------------------------------------------*/
                                                                                                        
                                                                                                        /* Private functions ---------------------------------------------------------*/
                                                                                                        /*
                                                                                                         *   WARNING:
                                                                                                         *   Functions declare in this section are defined at the end of this file
                                                                                                         *   and are strictly related to the hardware platform used.
                                                                                                         *
                                                                                                         */
                                                                                                        static int32_t platform_write(void *handle, uint8_t reg, const uint8_t *bufp,
                                                                                                                                      uint16_t len);
                                                                                                        static int32_t platform_read(void *handle, uint8_t reg, uint8_t *bufp,
                                                                                                                                     uint16_t len);
                                                                                                        static void tx_com(uint8_t *tx_buffer, uint16_t len);
                                                                                                        static void platform_delay(uint32_t ms);
                                                                                                        static void platform_init(void);
                                                                                                        
                                                                                                        
                                                                                                        
                                                                                                        
                                                                                                        
                                                                                                        
                                                                                                        /*******************************************************************************************************************//**
                                                                                                         * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
                                                                                                         * is called by main() when no RTOS is used.
                                                                                                         **********************************************************************************************************************/
                                                                                                        void hal_entry(void)
                                                                                                        {
                                                                                                            /* TODO: add your own code here */
                                                                                                        
                                                                                                        
                                                                                                            /* Open the transfer instance with initial configuration. */
                                                                                                               err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
                                                                                                               assert(FSP_SUCCESS == err);
                                                                                                        
                                                                                                               printf("hello world!n");
                                                                                                        
                                                                                                               R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_00_PIN_14, BSP_IO_LEVEL_HIGH);
                                                                                                               /* Initialize the I2C module */
                                                                                                               err = R_IIC_MASTER_Open(&g_i2c_master0_ctrl, &g_i2c_master0_cfg);
                                                                                                               /* Handle any errors. This function should be defined by the user. */
                                                                                                               assert(FSP_SUCCESS == err);
                                                                                                        
                                                                                                               /* Initialize mems driver interface */
                                                                                                               stmdev_ctx_t dev_ctx;
                                                                                                               dev_ctx.write_reg = platform_write;
                                                                                                               dev_ctx.read_reg = platform_read;
                                                                                                               dev_ctx.handle = &SENSOR_BUS;
                                                                                                        
                                                                                                               /* Wait sensor boot time */
                                                                                                               platform_delay(BOOT_TIME);
                                                                                                        
                                                                                                               /* Check device ID */
                                                                                                               lis2mdl_device_id_get(&dev_ctx, &whoamI);
                                                                                                               printf("LIS2MDL_ID=0x%x,whoamI=0x%xn",LIS2MDL_ID,whoamI);
                                                                                                               if (whoamI != LIS2MDL_ID)
                                                                                                                 while (1) {
                                                                                                                   /* manage here device not found */
                                                                                                                 }
                                                                                                        
                                                                                                               /* Restore default configuration */
                                                                                                               lis2mdl_reset_set(&dev_ctx, PROPERTY_ENABLE);
                                                                                                        
                                                                                                               do {
                                                                                                                 lis2mdl_reset_get(&dev_ctx, &rst);
                                                                                                               } while (rst);
                                                                                                        
                                                                                                               /* Enable Block Data Update */
                                                                                                               lis2mdl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
                                                                                                               /* Set Output Data Rate */
                                                                                                               lis2mdl_data_rate_set(&dev_ctx, LIS2MDL_ODR_10Hz);
                                                                                                               /* Set / Reset sensor mode */
                                                                                                               lis2mdl_set_rst_mode_set(&dev_ctx, LIS2MDL_SENS_OFF_CANC_EVERY_ODR);
                                                                                                               /* Enable temperature compensation */
                                                                                                               lis2mdl_offset_temp_comp_set(&dev_ctx, PROPERTY_ENABLE);
                                                                                                               /* Set device in continuous mode */
                                                                                                               lis2mdl_operating_mode_set(&dev_ctx, LIS2MDL_CONTINUOUS_MODE);
                                                                                                               while (1)
                                                                                                               {
                                                                                                        
                                                                                                                 uint8_t reg;
                                                                                                                 /* Read output only if new value is available */
                                                                                                                 lis2mdl_mag_data_ready_get(&dev_ctx, ®);
                                                                                                        
                                                                                                                 if (reg) {
                                                                                                                   /* Read magnetic field data */
                                                                                                                   memset(data_raw_magnetic, 0x00, 3 * sizeof(int16_t));
                                                                                                                   lis2mdl_magnetic_raw_get(&dev_ctx, data_raw_magnetic);
                                                                                                                   magnetic_mG[0] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[0]);
                                                                                                                   magnetic_mG[1] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[1]);
                                                                                                                   magnetic_mG[2] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[2]);
                                                                                                                   printf("Magnetic field [mG]:%4.2ft%4.2ft%4.2frn",magnetic_mG[0], magnetic_mG[1], magnetic_mG[2]);
                                                                                                        
                                                                                                                   /* Read temperature data */
                                                                                                                   memset(&data_raw_temperature, 0x00, sizeof(int16_t));
                                                                                                                   lis2mdl_temperature_raw_get(&dev_ctx, &data_raw_temperature);
                                                                                                                   temperature_degC = lis2mdl_from_lsb_to_celsius(data_raw_temperature);
                                                                                                                   printf("Temperature [degC]:%6.2frn",temperature_degC);
                                                                                                        
                                                                                                                 }
                                                                                                                 R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MILLISECONDS);
                                                                                                               }
                                                                                                        
                                                                                                        
                                                                                                        #if BSP_TZ_SECURE_BUILD
                                                                                                            /* Enter non-secure code */
                                                                                                            R_BSP_NonSecureEnter();
                                                                                                        #endif
                                                                                                        }
                                                                                                        

                                                                                                        演示

                                                                                                        審核編輯 黃宇

                                                                                                        聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
                                                                                                        • 傳感器
                                                                                                          +關注

                                                                                                          關注

                                                                                                          2530

                                                                                                          文章

                                                                                                          48482

                                                                                                          瀏覽量

                                                                                                          741948
                                                                                                        • 磁力計
                                                                                                          +關注

                                                                                                          關注

                                                                                                          1

                                                                                                          文章

                                                                                                          59

                                                                                                          瀏覽量

                                                                                                          20639
                                                                                                        收藏 人收藏

                                                                                                          評論

                                                                                                          相關推薦

                                                                                                          磁力計LIS2MDL開發(1)----輪詢獲取磁力計數據

                                                                                                          本文將介紹如何使用 LIS2MDL 傳感器來讀取數據。主要步驟包括初始化傳感器接口、驗證設備ID、配置傳感器的數據輸出率和濾波器,以及通過輪詢方式持續讀取
                                                                                                          的頭像 發表于 12-18 10:56 ?832次閱讀
                                                                                                          <b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b><b class='flag-5'>開發</b>(1)----<b class='flag-5'>輪詢</b><b class='flag-5'>獲取</b><b class='flag-5'>磁力計數據</b>

                                                                                                          磁力計LIS2MDL開發(2)----電子羅盤

                                                                                                          本文將介紹如何使用 LIS2MDL 傳感器來讀取數據來轉化為指南針。
                                                                                                          的頭像 發表于 12-18 11:01 ?845次閱讀
                                                                                                          <b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b><b class='flag-5'>開發</b>(2)----電子羅盤

                                                                                                          磁力計

                                                                                                          磁力計最新資料,全心奉獻
                                                                                                          發表于 09-01 18:16

                                                                                                          lis3mdl三軸磁力計懂得解釋一下

                                                                                                          是不是用這個能得到方向數據?用void GetAxes(AxesRaw_TypeDef *pData)這個函數獲取磁力計三個方向上的數值之后怎么處理才能得到方向?我現在用的一種處理方法并不能很好的得到方向,希望來個懂得教小弟一
                                                                                                          發表于 06-28 16:47

                                                                                                          LSM9DS1磁力計的自檢是否與LIS3MDL相同

                                                                                                          我正在嘗試在LSM9DS1傳感器上測試磁力計。我可以應用與LIS3MDL指南針相同的自測范圍值來檢查LSM9DS1嗎?事實是LSM9DS1
                                                                                                          發表于 10-09 11:43

                                                                                                          如何在LIS3MDL磁力計傳感器中禁用DRDY和INT輸出

                                                                                                          你好,如何在LIS3MDL磁力計傳感器中禁用DRDY和INT輸出。 #lis3mdl以上來自于谷歌翻譯以下為原文 Hello,How to disable DRDY and INT outputs in
                                                                                                          發表于 04-17 14:17

                                                                                                          如何處理磁力計HMC5883L獲取的三軸數據?

                                                                                                          用HMC5883L來矯正陀螺儀使用四元數法來求偏航角,想問問如何處理磁力計HMC5883L獲取的三軸數據?
                                                                                                          發表于 07-25 19:44

                                                                                                          LIS3MDL三軸磁力計能滿足磁通密度為0.23高斯的應用程序嗎

                                                                                                          我正在研究在具有高頻振蕩磁場的應用中使用 LIS3MDL 3 軸磁力計。我查看了 LIS3MDL數據表,它似乎滿足我檢查過的大多數要求。我的應用程序的磁通密度為 0.23 高斯,處
                                                                                                          發表于 12-14 08:31

                                                                                                          可以使用X-Cube-MEMS1庫將磁力計傳感器設置為輸出中斷嗎

                                                                                                          大家好,我想將圖中的 LIS3MDL 磁力計傳感器與帶有 I2C 接口的 NUCLEO-L053R8 板一起使用。我想將傳感器設置為輸出中斷。我的問題是:我可以使用官方 X-Cube-MEMS
                                                                                                          發表于 12-26 09:14

                                                                                                          用于生成每個輸出樣本的樣本數量而言LIS3mdl磁力計的操作模式有何不同?

                                                                                                          就用于生成每個輸出樣本的樣本數量而言,LIS3mdl 磁力計的操作模式有何不同?例如,我發現在 ISM303DAC 中,用于生成的樣本數輸出樣本在低功耗模式下比在低功耗模式下使用的數量少四倍高分辨率
                                                                                                          發表于 01-06 07:31

                                                                                                          LIS2MDL軸標簽是否指示正軸方向?

                                                                                                          LIS2MDL 數據表的圖 2 顯示了磁力計軸方向的下圖。但是,完全不清楚它們是否標記了軸的正方向。如果他們確實用 X/Y/Z 標簽標記了正方向,它就會有一個左手方向(違反所有慣例)。
                                                                                                          發表于 01-09 08:56

                                                                                                          STLIS2MDL磁力計傳感器相關的使用信息和應用提示

                                                                                                          LIS2MDL是系統級封裝的3D數字磁力計,具有數字I2C和3線SPI串口標準輸出,在高分辨率模式下功耗200 μA,在低功耗模式下功耗不超過50 μA(在20 Hz輸出數據速率下)。由于磁力
                                                                                                          發表于 09-06 08:24

                                                                                                          LIS2MDL磁力計傳感器相關資料

                                                                                                          本文檔旨在提供STLIS2MDL磁力計傳感器相關的使用信息和應用提示。LIS2MDL是系統級封裝的3D數字磁力計,具有數字I2C和3線SPI串口標準輸出,在高分辨率模式下功耗200 μ
                                                                                                          發表于 09-13 07:48

                                                                                                          LIS2MDL 3D數字磁力計應用筆記

                                                                                                          電子發燒友網站提供《LIS2MDL 3D數字磁力計應用筆記.pdf》資料免費下載
                                                                                                          發表于 07-31 10:12 ?4次下載
                                                                                                          <b class='flag-5'>LIS2MDL</b> 3D數字<b class='flag-5'>磁力計</b>應用筆記

                                                                                                          e2studio開發磁力計LIS2MDL(2)----電子羅盤

                                                                                                          本文將介紹如何使用 LIS2MDL 傳感器來讀取數據來轉化為指南針。 地磁場強度范圍約為 23,000 至 66,000 nT ,并且可以建模為磁偶極子,其場線起源于地球地理南部附近的點,并終止
                                                                                                          的頭像 發表于 05-16 17:00 ?209次閱讀
                                                                                                          <b class='flag-5'>e2studio</b><b class='flag-5'>開發</b><b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b>(2)----電子羅盤
                                                                                                          视频黄页,特黄>>在线免费观看视频>>视频黄页,特黄