在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

基于RoboMasterC板的RT-Thread使用分享—i2c讀取磁力計數據實驗

冬至子 ? 來源:goldengrandpa ? 作者:goldengrandpa ? 2023-10-08 14:14 ? 次閱讀

I2C簡介

I2C 是 PHILIPS 公司開發的一種半雙工、雙向二線制同步串行總線。

兩線制代表 I2C 只需兩根信號線,一根數據線 SDA,另一根是時鐘線 SCL。這個也是I2C的優勢所在,雖然傳輸速率較慢,但是占用引腳數量少,在引腳資源緊張的芯片上就特別好用。

I2C 總線允許掛載多個主設備,但總線時鐘同一時刻只能由一個主設備產生,并且要求每個連接到總線上的器件都有唯一的 I2C 地址,從設備可以被主設備尋址。那么我們想要在同一個I2C總線上使用多個主設備。

1.jpg

這里善于思考的同學可能就會想到如果我們想要在同一個I2C總線上并聯兩個一樣的設備ID沖突怎么辦呢?

之后帶大家看傳感器的Datasheet的時候,就會發現傳感器上面有一個ADDR引腳,根據它引腳電平高低會切換ID號,這樣就可以避免ID沖突了。

I2C通信具有幾類信號

開始信號S:當SCL處于高電平時,SDA從高電平拉低至低電平,代表數據傳輸的開始

結束信號P:當SCL處于高電平時,SDA從低電平拉高至高電平,代表數據傳輸結束

數據信號:數據信號每次都傳輸8位數據,每一位數據都在一個時鐘周期內傳遞,當SCL處于高電平時,SDA數據線上的電平需要穩定,當SCL處于低電平的時候,SDA數據線上的電平才允許改變。

應答信號ACK/NACK:應答信號是主機發送8bit數據,從機對主機發送低電平,表示已經接收數據。

1.jpg

整個I2C通信過程理解成收發快遞的過程,設備I2C地址理解成學校快遞柜的地址,讀寫位代表寄出和簽收快遞,寄存器地址則是快遞柜上的箱號,而數據便是需要寄出或者簽收的快遞。整個過程便是如同到學校的快遞柜(從機 I2C 地址),對第幾號柜箱(寄存器地址), 進行寄出或者簽收快遞(數據)的過程。

IST8310簡介

IST8310 是一款由 ISentek 公司推出的 3 軸磁場傳感器,尺寸為 3.03.01.0mm,支持快速 I2C 通信,可達 400kHz,14 位磁場數據,測量范圍可達1600uT(x,y-axis)和 2500uT(z-axis), 最高 200Hz 輸出頻率。使用IST8310磁力計可以檢測地磁場強度,用于計算磁場角度。

下圖為IST8310的引腳功能表

1.jpg

此外我們可以整理等下我們會用到的GPIO引腳

1.jpg

以及我們可以看一下從機地址的設置,在這個芯片之后從機地址的設置是通過CAD0和CAD1兩個引腳設置的,這樣可以實現設置四個不同的地址。

1.jpg

下面是開發板的原理圖,我們可以看到下面CAD0和CAD1引腳都浮空了,根據上圖可以得知,這個IST8310的從機地址為0x0E與原理圖中標注的一致。

1.jpg

CubeMX配置

首先我們開始看到我們的原理圖上。

1.jpg

2.jpg

3.jpg

根據上面兩個圖我們可以發現這個IST8310是掛載在I2C總線上面的。

STM32上I2C3_SCL在PA8,I2C_SDA在PC9,DRDY數據準備引腳在PG3,復位RSTN引腳在PG6,接著在CubeMX進行相應的配置。

1.jpg

2.jpg

之后我們可以看到我們在CubeMX中配置的東西實際上都在board文件之中,其中board.c文件里面為我們的時鐘樹配置,stm32f4xx_hal_msp.c里的就是我們上面設置的那些引腳配置

這里就是剛剛I2C3配置的函數,為啥突然開始講這個主要也是實習時發現大部分情況下是沒有STM32可以用的,也就不能用CubeMX那么輕松的配置了,pintopin替換直接把***當作STM32使用總感覺會出問題,因此還是學習自己配置的方法。

else if(hi2c->Instance==I2C3)
{
/* USER CODE BEGIN I2C3_MspInit 0 /
/
USER CODE END I2C3_MspInit 0 */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**I2C3 GPIO Configuration
PC9 ------> I2C3_SDA
PA8 ------> I2C3_SCL
/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/
Peripheral clock enable /
__HAL_RCC_I2C3_CLK_ENABLE();
/
USER CODE BEGIN I2C3_MspInit 1 /
/
USER CODE END I2C3_MspInit 1 */
}

代碼編寫

首先在RT-Thread Settings組件中打開I2C設備驅動程序

1.jpg

menuconfig BSP_USING_I2C3
bool "Enable I2C3 BUS (software simulation)"
default n
select RT_USING_I2C
select RT_USING_I2C_BITOPS
select RT_USING_PIN
if BSP_USING_I2C3
comment "Notice: PA8 --> 8; PC9 --> 41"
config BSP_I2C3_SCL_PIN
int "i2c1 scl pin number"
default 8
config BSP_I2C3_SDA_PIN
int "I2C1 sda pin number"
default 41
endif

1.jpg

配置完后我們來看一下幾個重要的實現函數

i2c寫入寄存器的函數

rt_err_t ist8310_iic_write(rt_uint8_t write_addr, rt_uint8_t data, rt_uint32_t number)
{
rt_uint8_t buf[2];
buf[0] = write_addr;
buf[1] = data;
rt_size_t result;
result = rt_i2c_master_send(ist8310_i2c_bus, IST8310_ADDR, RT_I2C_WR, buf, 2);
rt_thread_mdelay(10);
if (result == 2)
{
rt_kprintf("IST8310 write failed,ERR is:%drn", result);
return -RT_ERROR;
}
}

關于讀取,寫入這里引用上面推薦視頻里的一幅圖

1.jpg

這里我們函數的實現也是按照這個原理,rt_i2c_master_send首先將設備的地址IST8310_ADDR,加上讀寫位RT_I2C_WR發送

之后我們定義的buf緩沖區中裝著的就是我們要發送的寄存器地址write_addr,和要寫入的數據data。

需要注意的是rt_i2c_master_send返回的是發送的消息的個數,且不包含一開始發送的設備地址IST8310_ADDR的。

下面的讀取函數也是同理的,先發送想要讀取的read_addr,然后利用rt_i2c_master_recv函數進行讀取。

rt_err_t ist8310_iic_read(rt_uint8_t read_addr, rt_uint32_t len, rt_uint8_t *buf)
{
//通知要讀哪個設備的哪個內存地址的內容,(告知是需要讀read_addr)
rt_i2c_master_send(ist8310_i2c_bus, IST8310_ADDR, RT_I2C_WR, &read_addr, 1);
//讀取到的內容存入buf
rt_i2c_master_recv(ist8310_i2c_bus, IST8310_ADDR, RT_I2C_RD, buf, len); //地址讀數據
}

這樣看完大家應該對于i2c的通信方式更加熟悉了。

下面介紹的是讀取磁力計值函數ist8310_read_mag

void ist8310_read_mag(float mag[3])
{
uint8_t buf[6];
int16_t temp_ist8310_data = 0;
//read the "DATAXL" register (0x03)
ist8310_iic_read(0x03, 6, buf);
temp_ist8310_data = (int16_t) ((buf[1] << 8) | buf[0]);
mag[0] = MAG_SEN * temp_ist8310_data;
temp_ist8310_data = (int16_t) ((buf[3] << 8) | buf[2]);
mag[1] = MAG_SEN * temp_ist8310_data;
temp_ist8310_data = (int16_t) ((buf[5] << 8) | buf[4]);
mag[2] = MAG_SEN * temp_ist8310_data;
}

1.jpg

我們這里對照表格就可以看到數據寄存器是從0x03開始到0x08結束的,我們使用ist8310_iic_read實際上雖然我們一開始只說明了讀取0x03的值,但是根據消息長度的大小,它繼續讀取下面寄存器的值的。

最后給大家詳細一下初始化函數ist8310_init

rt_uint8_t ist8310_init(const char*name)
{
rt_uint8_t temp[2] = { 0, 0 };
ist8310_i2c_bus = (struct rt_i2c_bus_device *) rt_device_find(name);
rt_uint8_t res[2] = { 0, 0 };
rt_uint8_t writeNum = 0;
if (ist8310_i2c_bus == RT_NULL)
{
rt_kprintf("can't find %s device!n", name);
}
else
{
ist8310_RST_L();
rt_thread_mdelay(sleepTime);
ist8310_RST_H();
rt_thread_mdelay(sleepTime);
ist8310_IIC_read_single_reg(IST8310_WHO_AM_I, 1, res);
if (res[0] != IST8310_WHO_AM_I_VALUE)
{
initialized = RT_TRUE;
return IST8310_NO_SENSOR;
}
for (writeNum = 0; writeNum < IST8310_WRITE_REG_NUM; writeNum++)
//開啟中斷,并且設置低電平,平均采樣兩次,200Hz輸出頻率
{
ist8310_IIC_write_single_reg(ist8310_write_reg_data_error[writeNum][0],
ist8310_write_reg_data_error[writeNum][1]);
ist8310_delay_us(wait_time);
ist8310_IIC_read_single_reg(ist8310_write_reg_data_error[writeNum][0], 1, res);
ist8310_delay_us(wait_time);
if (res[0] != ist8310_write_reg_data_error[writeNum][1])
{
return ist8310_write_reg_data_error[writeNum][2];
}
}
initialized = RT_TRUE;
return IST8310_NO_ERROR;
}
}

第一個特殊點是讀取WHO AM I寄存器,這里是為了確認讀取的是ist8310傳感器,避免ID沖突或者沒有傳感器導致后續的通信錯誤。這里WHO AM I里的值默認是10我們讀取到10則說明沒有問題。

1.jpg

第二個特殊點就是for循環里面的那些操作,ist8310_write_reg_data_error這個二維數組里面的內容大家可以翻一下最后完整的ist8310.h代碼

這里做的事情實際上是對配置寄存器進行寫入配置,對應的寄存器即意義如下。大家根據下面的表格就可以計算出相應要寫入的值了。

1.jpg

ist8310.c完整代碼

//
// Created by Goldengrandpa on 2022/11/4.
//
#include "ist8310.h"
rt_err_t ist8310_iic_write(rt_uint8_t write_addr, rt_uint8_t data, rt_uint32_t number)
{
rt_uint8_t buf[2];
buf[0] = write_addr;
buf[1] = data;
rt_size_t result;
result = rt_i2c_master_send(ist8310_i2c_bus, IST8310_ADDR, RT_I2C_WR, buf, 2);
rt_thread_mdelay(10);
if (result == 2)
{
rt_kprintf("IST8310 write failed,ERR is:%drn", result);
return -RT_ERROR;
}
}
void ist8310_delay_us(uint16_t us)
{
uint32_t ticks = 0;
uint32_t told = 0, tnow = 0, tcnt = 0;
uint32_t reload = 0;
reload = SysTick->LOAD;
ticks = us * 72;
told = SysTick->VAL;
while (1)
{
tnow = SysTick->VAL;
if (tnow != told)
{
if (tnow < told)
{
tcnt += told - tnow;
}
else
{
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks)
{
break;
}
}
}
}
rt_err_t ist8310_iic_read(rt_uint8_t read_addr, rt_uint32_t len, rt_uint8_t *buf)
{
//通知要讀哪個設備的哪個內存地址的內容,(告知是需要讀read_addr)
rt_i2c_master_send(ist8310_i2c_bus, IST8310_ADDR, RT_I2C_WR, &read_addr, 1);
//讀取到的內容存入buf
rt_i2c_master_recv(ist8310_i2c_bus, IST8310_ADDR, RT_I2C_RD, buf, len); //地址讀數據
}
rt_err_t ist8310_IIC_write_single_reg(rt_uint8_t reg, rt_uint8_t data)
{
rt_uint8_t buf[2];
buf[0] = reg;
buf[1] = data;
if (rt_i2c_master_send(ist8310_i2c_bus, IST8310_ADDR, 0, buf, 2) == 2)
{
return RT_EOK;
}
else
{
return -RT_ERROR;
}
}
uint8_t ist8310_IIC_read_single_reg(rt_uint8_t reg, rt_uint8_t len, rt_uint8_t buf)
{
struct rt_i2c_msg msgs[2];
msgs[0].addr = IST8310_ADDR; /
從機地址 /
msgs[0].flags = RT_I2C_WR; /
寫標志 /
msgs[0].buf = ? /
從機寄存器地址 /
msgs[0].len = 1; /
發送數據字節數 /
msgs[1].addr = IST8310_ADDR; /
從機地址 /
msgs[1].flags = RT_I2C_RD; /
讀標志 /
msgs[1].buf = buf; /
讀取數據指針 /
msgs[1].len = len; /
讀取數據字節數 /
if (rt_i2c_transfer(ist8310_i2c_bus, msgs, 2) == 2)
{
return RT_EOK;
}
else
{
return -RT_ERROR;
}
}
void ist8310_RST_H(void)
{
rt_pin_write(IST8310_RSTN_PIN_NUM, 1);
}
void ist8310_RST_L(void)
{
rt_pin_write(IST8310_RSTN_PIN_NUM, 0);
}
void ist8310_read_mag(float mag[3])
{
uint8_t buf[6];
int16_t temp_ist8310_data = 0;
//read the "DATAXL" register (0x03)
ist8310_iic_read(0x03, 6, buf);
temp_ist8310_data = (int16_t) ((buf[1] << 8) | buf[0]);
mag[0] = MAG_SEN * temp_ist8310_data;
temp_ist8310_data = (int16_t) ((buf[3] << 8) | buf[2]);
mag[1] = MAG_SEN * temp_ist8310_data;
temp_ist8310_data = (int16_t) ((buf[5] << 8) | buf[4]);
mag[2] = MAG_SEN * temp_ist8310_data;
}
rt_uint8_t ist8310_init(const char
name)
{
rt_uint8_t temp[2] = { 0, 0 };
ist8310_i2c_bus = (struct rt_i2c_bus_device *) rt_device_find(name);
rt_uint8_t res[2] = { 0, 0 };
rt_uint8_t writeNum = 0;
if (ist8310_i2c_bus == RT_NULL)
{
rt_kprintf("can't find %s device!n", name);
}
else
{
ist8310_RST_L();
rt_thread_mdelay(sleepTime);
ist8310_RST_H();
rt_thread_mdelay(sleepTime);
ist8310_IIC_read_single_reg(IST8310_WHO_AM_I, 1, res);
if (res[0] != IST8310_WHO_AM_I_VALUE)
{
initialized = RT_TRUE;
return IST8310_NO_SENSOR;
}
for (writeNum = 0; writeNum < IST8310_WRITE_REG_NUM; writeNum++)
{
ist8310_IIC_write_single_reg(ist8310_write_reg_data_error[writeNum][0],
ist8310_write_reg_data_error[writeNum][1]);
ist8310_delay_us(wait_time);
ist8310_IIC_read_single_reg(ist8310_write_reg_data_error[writeNum][0], 1, res);
ist8310_delay_us(wait_time);
if (res[0] != ist8310_write_reg_data_error[writeNum][1])
{
return ist8310_write_reg_data_error[writeNum][2];
}
}
initialized = RT_TRUE;
return IST8310_NO_ERROR;
}
}
static void i2c_ist8310_sample(int argc, char argv[])
{
rt_uint8_t buf;
rt_uint8_t result=0;
float msg[3] = { 0, 0, 0 };
char name[RT_NAME_MAX];
if (argc == 2)
{
rt_strncpy(name, argv[1], RT_NAME_MAX);
}
else
{
rt_strncpy(name, IST8310_I2C_BUS_NAME, RT_NAME_MAX);
}
if (!initialized)
{
/
傳感器初始化 /
result=ist8310_init(name);
}
if (initialized)
{
ist8310_read_mag(msg);
rt_kprintf("read ist8310 sensor x:%f y:%f z:%fn", msg[0], msg[1], msg[2]);
}
else
{
rt_kprintf("%dn",result);
rt_kprintf("initialize sensor failed!n");
}
}
/
導出到 msh 命令列表中 */
MSH_CMD_EXPORT(i2c_ist8310_sample, ist8310_sample);
ist8310.h

//
// Created by Goldengrandpa on 2022/11/4.
//
#ifndef RTTHREAD_IST8310_H
#define RTTHREAD_IST8310_H
#include
#include
#include "board.h"
#define IST8310_I2C_BUS_NAME "i2c3" /* 傳感器連接的I2C總線設備名稱 /
#define IST8310_ADDR 0X0E /
從機地址 /
#define IST8310_CALIBRATION_CMD 0xE1 /
校準命令 /
#define IST8310_NORMAL_CMD 0xA8 /
一般命令 /
#define IST8310_GET_DATA 0xAC /
獲取數據命令 */
#define IST8310_WRITE_REG_NUM 4
#define IST8310_WHO_AM_I 0x00 //ist8310 "who am I "
#define IST8310_WHO_AM_I_VALUE 0x10 //device ID
#define IST8310_DATA_READY_BIT 2
#define IST8310_NO_ERROR 0x00
#define IST8310_NO_SENSOR 0x40
static const uint8_t wait_time = 150;
static const uint8_t sleepTime = 50;
#define IST8310_RSTN_PIN_NUM GET_PIN(G,6)
#define MAG_SEN 0.3f //raw int16 data change to uT unit. 原始整型數據變成 單位ut
typedef struct ist8310_real_data_t
{
uint8_t status;
float mag[3];
} ist8310_real_data_t;
//the first column:the registers of IST8310. 第一列:IST8310的寄存器
//the second column: the value to be writed to the registers.第二列:需要寫入的寄存器值
//the third column: return error value.第三列:返回的錯誤碼
static const rt_uint8_t ist8310_write_reg_data_error[IST8310_WRITE_REG_NUM][3] ={
{0x0B, 0x08, 0x01}, //enalbe interrupt and low pin polarity.開啟中斷,并且設置低電平
{0x41, 0x09, 0x02}, //average 2 times.平均采樣兩次
{0x42, 0xC0, 0x03}, //must be 0xC0. 必須是0xC0
{0x0A, 0x0B, 0x04}}; //200Hz output rate.200Hz輸出頻率
static struct rt_i2c_bus_device ist8310_i2c_bus = RT_NULL; / I2C總線設備句柄 /
static rt_bool_t initialized = RT_FALSE; /
傳感器初始化狀態 */
rt_err_t ist8310_iic_write(rt_uint8_t write_addr, rt_uint8_t data, rt_uint32_t number);
rt_err_t ist8310_iic_read(rt_uint8_t read_addr, rt_uint32_t len, rt_uint8_t *buf);
void ist8310_read_mag(float mag[3]);
static void read_mag(struct rt_i2c_bus_device *bus,float *cur_mag);/ 讀取磁場 /
void ist8310_RST_H(void);/ 設置RSTN引腳為1 /
void ist8310_RST_L(void);/ 設置RSTN引腳為0 /
void ist8310_delay_us(rt_uint16_t us);
rt_err_t ist8310_IIC_write_single_reg(rt_uint8_t reg, rt_uint8_t data);
rt_uint8_t ist8310_IIC_read_single_reg(rt_uint8_t reg, rt_uint8_t len, rt_uint8_t *buf);
static void i2c_ist8310_sample(int argc, char *argv[]);
#endif //RTTHREAD_IST8310_H

運行結果:

1.jpg

2.jpg

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

    關注

    8

    文章

    391

    瀏覽量

    60941
  • GPIO
    +關注

    關注

    16

    文章

    1204

    瀏覽量

    52104
  • 磁場傳感器
    +關注

    關注

    0

    文章

    41

    瀏覽量

    12038
  • 磁力計
    +關注

    關注

    1

    文章

    71

    瀏覽量

    20860
  • RT-Thread
    +關注

    關注

    31

    文章

    1289

    瀏覽量

    40135
收藏 人收藏

    評論

    相關推薦

    RT-Thread記錄(十八、SHT21與24C02軟件包)

    本文學習測試一下幾款典型設備的 RT-Thread I2C軟件包
    的頭像 發表于 07-08 11:07 ?3424次閱讀
    <b class='flag-5'>RT-Thread</b>記錄(十八、SHT21與24<b class='flag-5'>C</b>02軟件包)

    【英飛凌PSoC 6 RTT開發試用】通過軟件和硬件I2C接口獲取數字溫濕度傳感器SHT30的數據

    。本文使用的開發環境為RT-Thread Studio,設備上運行的是RT-Thread實時系統。本文主旨在于,介紹如何在PSoC開發上使用軟件I2C和硬件硬件
    的頭像 發表于 07-11 09:21 ?3478次閱讀
    【英飛凌PSoC 6 RTT開發<b class='flag-5'>板</b>試用】通過軟件和硬件<b class='flag-5'>I2C</b>接口獲取數字溫濕度傳感器SHT30的<b class='flag-5'>數據</b>

    【先楫HPM5361EVK開發試用體驗】RT-Thread I2C使用

    開發環境: IDE:RT-Thread Studio 2.2.7 開發:HPM5300EVK HPM5300EVK有4路硬件I2C,當然也可使用軟件I2C,對于應用而言,軟件和硬件都
    發表于 12-25 23:57

    求教一個rt-thread開發i2c的問題

    關于rt-thread開發i2c的例程大多數都是類似于溫濕度傳感器。發送一個寫指令后,通過讀指令,獲取數值。想問一下,如果是接i2c轉電流芯片,只存在發數據,這種應該怎么做?
    發表于 05-19 10:26

    RT-Thread里面驅動層的i2c能否用硬件方式實現呢?

    很好奇RT-Thread里面驅動層的i2c實現為啥都是用的軟件模擬實現的,硬件i2c它不香嗎,有人做過硬件方式實現嗎?一起交流下
    發表于 04-15 09:41

    基于RT-Thread測試NK-980 IoT開發I2C外設性能簡析

    1、RT-Thread I2C應用實踐  硬件環境  ● 開發:Nuvoton NK-980 IoT  ● USB線:Micro-USB 連接線2根  ●
    發表于 10-12 15:56

    詳解RT-Thread I2C設備驅動框架及相關函數

    STM32F4 探索者開發,給出了底層 I2C 驅動(GPIO 模擬方式)的添加方法和 I2C 設備的具體應用示例代碼(以驅動 MPU6050 為例),包含寄存器讀、寫操作方法。由于 RT
    發表于 10-25 12:02

    基于RoboMasterC型開發I2C讀取磁力計數據實驗

    3_CLK_ENABLE();  /* USER CODE BEGIN I2C3_MspInit 1 */  /* USER CODE END I2C3_MspInit 1 */  }  代碼編寫  首先在RT-Thread
    發表于 03-16 14:26

    詳細講解RT-Thread I2C設備驅動框架及相關函數

    本應用筆記以驅動I2C接口的6軸傳感器MPU6050為例,說明了如何使用I2C設備驅動接口開發應用程序,并詳細講解了RT-Thread I2C設備驅動框架及相關函數。
    的頭像 發表于 03-29 10:52 ?2.1w次閱讀
    詳細講解<b class='flag-5'>RT-Thread</b> <b class='flag-5'>I2C</b>設備驅動框架及相關函數

    基于RT-Thread的智慧路燈案例實驗分享

    這里我用的是RT-Thread Studio V1.1.0,這里的I2C的范例配置有點問題,其它版本的RT-Thread Studio應該可以按范例配置那么配,如果按范例配置編譯不通過的話可以按照
    的頭像 發表于 07-01 14:43 ?3794次閱讀
    基于<b class='flag-5'>RT-Thread</b>的智慧路燈案例<b class='flag-5'>實驗</b>分享

    RT-Thread Studio驅動SD卡

    總結前言硬件平臺:RT-Thread ART-Pi STM32H750XBH6開發 H750開發開發軟件:RT-Thread Studio參考博客:
    發表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio驅動SD卡

    基于RoboMasterC型開發RT-Thread使用分享(一)

    假期期間打算開一個坑,和大家分享下基于RoboMaster開發C型上RT-Thread使用,本系列文章計劃是給剛接觸STM32和RT-Thread的同學看的,講的會稍微基礎一點。 硬
    的頭像 發表于 01-05 12:10 ?2433次閱讀

    基于RoboMasterC型開發RT-Thread使用分享(二)

    的通過Kconfig+CubeMX配置出可以驅動整個開發所有外設的工程的。在社區前輩的提醒后才知道通過基于芯片創建工程是沒有辦法Kconfig配置的。因此我在之后的教程中我會基于RT-Thread提供
    的頭像 發表于 01-06 03:05 ?791次閱讀

    RT-Thread文檔_I2C 總線設備

    RT-Thread文檔_I2C 總線設備
    發表于 02-22 18:35 ?0次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>I2C</b> 總線設備

    驅動SSD1306OLED屏檢驗軟件I2C驅動方案

    進行RT-Thread Settings 開啟軟件I2C
    發表于 08-15 15:33 ?1514次閱讀
    驅動SSD1306OLED屏檢驗軟件<b class='flag-5'>I2C</b>驅動方案
    主站蜘蛛池模板: 91久久人澡人人添人人爽| 5252欧美在线观看| 35qao强力打造免费上线高清 | 久青草国产在线视频_久青草免| 夜夜爽网站| baoyu污污网站入口免费| 午夜免费的国产片在线观看| 久久久久久88色偷偷| 手机看片1024精品日韩| 日本在线亚洲| 米奇久久| 久久人人网| 亚洲欧美成人在线| 国产精品国产三级国快看| 国产亚洲一区二区三区在线| 欧美午夜在线视频| 手机看片1024在线观看| 黄网站色视频免费看无下截| 免费一级在线观看| 久久dvd| 亚洲成人免费| 91在线色| 亚洲精品二区中文字幕| 免费网站日本永久免费观看| 日本wwwxx| 亚洲成人777| 亚州怡红院| 鲁丝一区二区三区| 久久99久久精品免费思思6| 加勒比在线一区| 午夜私人影院| 午夜视频播放| avtt亚洲一区中文字幕| 国产网站在线| 最新亚洲一区二区三区四区| 青青青青久久精品国产h| 免费在线黄色网址| 午夜精品久久久久蜜桃| 亚洲午夜日韩高清一区| 禁漫羞羞入口| www.久色|