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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

pikascript GPIO接口如何基于rtt pin設(shè)備實(shí)現(xiàn)呢?

冬至子 ? 來源:IcyFeather ? 作者:IcyFeather ? 2023-08-07 17:47 ? 次閱讀

介紹

Pikascript 是 RT-Thread 軟件包中心 - 編程語言 中的一個(gè)包,是一個(gè)對(duì)單片機(jī)友好的輕量級(jí) python 腳本支持工具,類似 micropython。

在 Pikascript 中,架構(gòu)如下:

1.jpg

對(duì)于不同的平臺(tái),我們需要手動(dòng)為平臺(tái)適配 pika_hal 的設(shè)備抽象層接口。今天以 packages/pikascript-latest/pikaRTDevice/pika_hal_RTT_GPIO.c 為例,講解 Pikascript GPIO 接口如何基于 RT-Thread Pin 設(shè)備 rt-thread/components/misc/pin.c 實(shí)現(xiàn)。

講解

模型如下:

1.jpg

所有設(shè)備均遵循類 linux 文件的編程模型,所有類型的設(shè)備均使用 pika_dev 結(jié)構(gòu)體來作為設(shè)備句柄。

pika_dev 類型定義:

typedef struct {
PIKA_HAL_DEV_TYPE type;
PIKA_BOOL is_enabled;
void* ioctl_config;
void* platform_data;
} pika_dev;

在 RT-Thread 的文檔中可以得知,應(yīng)用程序通過 RT-Thread 提供的 PIN 設(shè)備管理接口來訪問 GPIO,相關(guān)接口如下所示:

1.jpg

// 通過設(shè)備名,返回 pin num
rt_base_t rt_pin_get(const char *name);
// 通過 pin num,返回該 pin 的數(shù)據(jù)
int rt_pin_read(rt_base_t pin);
// 把 value 電平信息寫到對(duì)應(yīng) pin 上
void rt_pin_write(rt_base_t pin, rt_base_t value);
// 把 pin 的模式設(shè)置為 mode
void rt_pin_mode(rt_base_t pin, rt_base_t mode)
所以經(jīng)過分析,不難看出我們?cè)?open 中要通過 rt_pin_get() 獲取引腳編號(hào),獲取設(shè)備信息;在 read 中要通過 rt_pin_read() 讀取引腳電平;在 write 中要通過 rt_pin_write() 設(shè)置引腳電平。

在 pika_hal_RTT_GPIO.c 中,我們一共有 7 個(gè)接口要實(shí)現(xiàn):

int pika_hal_platform_GPIO_open(pika_dev* dev, char* name);
int pika_hal_platform_GPIO_close(pika_dev* dev);
int pika_hal_platform_GPIO_read(pika_dev* dev, void* buf, size_t count);
int pika_hal_platform_GPIO_write(pika_dev* dev, void* buf, size_t count);
int pika_hal_platform_GPIO_ioctl_enable(pika_dev* dev);
int pika_hal_platform_GPIO_ioctl_disable(pika_dev* dev);
int pika_hal_platform_GPIO_ioctl_config(pika_dev* dev, pika_hal_GPIO_config* cfg);
下面我們依次進(jìn)行講解。

dev->platform_io 中存儲(chǔ)的數(shù)據(jù)
首先定義一個(gè)結(jié)構(gòu)體 platform_data_GPIO 用來存在 dev->platform_data 中,由上面對(duì) rtt pin 接口的簡單調(diào)用分析可知,只需要 pin 的數(shù)據(jù):

typedef struct platform_data_GPIO {
uint32_t pin_num;
} platform_data_GPIO;
pika_hal_platform_GPIO_open
函數(shù)的原型為: int pika_hal_platform_GPIO_open(pika_dev* dev, char* name);

參數(shù):

pika_dev* dev: 要操作的設(shè)備句柄
char* name: GPIO 設(shè)備名
函數(shù)功能:

根據(jù) GPIO 設(shè)備名,找到對(duì)應(yīng)的 GPIO 設(shè)備的 pin
把設(shè)備 pin 數(shù)據(jù)存在 dev->platform_data 里面
實(shí)現(xiàn):

int pika_hal_platform_GPIO_open(pika_dev* dev, char* name) {
// 打印當(dāng)前信息
rt_kprintf("rn=%s==%s=%d=name:%s==rn", FILE , FUNCTION , LINE ,name);
// 打印一下日志信息,當(dāng)前正在打開哪個(gè)設(shè)備
__platform_printf("Open: %s rn", name);
// 調(diào)用 pikaMalloc 分配內(nèi)存,創(chuàng)建一個(gè) platform_data_GPIO 結(jié)構(gòu)體,用來存放這個(gè) GPIO 設(shè)備的信息
platform_data_GPIO* data = pikaMalloc(sizeof(platform_data_GPIO));
// 在 RT_USING_PIN 這個(gè)宏定義存在時(shí),通過 rt_pin_get 函數(shù)獲取這個(gè) GPIO 設(shè)備的引腳號(hào),存放在 platform_data_GPIO 結(jié)構(gòu)體的 pin_num 成員中。
#ifdef RT_USING_PIN
data->pin_num = rt_pin_get(name) ;
#endif
// 將創(chuàng)建的 platform_data_GPIO 結(jié)構(gòu)體賦值給 dev->platform_data
dev->platform_data = data;
return 0;
}
pika_hal_platform_GPIO_close
函數(shù)的原型為:int pika_hal_platform_GPIO_close(pika_dev* dev);

參數(shù):
pika_dev* dev: 要操作的設(shè)備句柄

函數(shù)功能:
清除這個(gè) GPIO 設(shè)備的信息,即清空 dev->platform_data 中的數(shù)據(jù)

實(shí)現(xiàn):

int pika_hal_platform_GPIO_close(pika_dev* dev) {
rt_kprintf("rn=%s==%s=%d===rn", FILE , FUNCTION , LINE );
// 如果現(xiàn)在有 GPIO 設(shè)備數(shù)據(jù),就清空
if (NULL != dev->platform_data) {
pikaFree(dev->platform_data, sizeof(platform_data_GPIO));
dev->platform_data = NULL;
}
return 0;
}
pika_hal_platform_GPIO_read
函數(shù)的原型為:int pika_hal_platform_GPIO_write(pika_dev* dev, void* buf, size_t count);

參數(shù):
pika_dev dev:要操作的設(shè)備句柄
void buf:讀取緩沖區(qū)
size_t count:讀取數(shù)據(jù)長度,對(duì)于 GPIO、ADC 這樣只能讀取單個(gè)數(shù)據(jù)的設(shè)備,長度為 sizeof(uint32_t)

函數(shù)功能:

根據(jù)之前存到 dev->platform_data 中的 pin num 數(shù)據(jù),調(diào)用 rt_pin_read() 函數(shù)來獲取該 pin 的數(shù)據(jù)
把讀取到的數(shù)據(jù)存到 buf 緩沖區(qū)中
實(shí)現(xiàn):

int pika_hal_platform_GPIO_read(pika_dev* dev, void* buf, size_t count) {
// 獲取之前存放的platform_data_GPIO結(jié)構(gòu)體指針
platform_data_GPIO* data = dev->platform_data;
uint32_t level;
rt_kprintf("rn=%s==%s=%d=gpio:%d==rn", FILE , FUNCTION , LINE ,data->pin_num);
#ifdef RT_USING_PIN
// 根據(jù) pin num 讀取電平
level = rt_pin_read(data->pin_num);
#endif
// 只有可能是 0 或 1
if (level != 1 && level != 0) {
return -1;
}
// 把 &level 處的 count 個(gè)(sizeof(uint32_t) 個(gè))數(shù)據(jù)拷貝到 buf 緩存區(qū),memcpy 函數(shù)不關(guān)心 buf 和 src 指向的內(nèi)存是什么類型,它只根據(jù) count 拷貝內(nèi)存
memcpy(buf, &level, count);
return 0;
}
注意:
在文檔中指出,GPIO 設(shè)備 read 時(shí)讀取的數(shù)據(jù) count 應(yīng)該為 sizeof(uin32_t),在 pika_hal_platform_GPIO_read 中,level 的類型設(shè)置為 uint32_t,這是和文檔要求一致的。而給 level 賦值的 rt_pin_read() 函數(shù)的返回類型為 int,這里進(jìn)行了一個(gè)隱式類型轉(zhuǎn)換。

pika_hal_platform_GPIO_write
函數(shù)的原型為:int pika_hal_platform_GPIO_write(pika_dev* dev, void* buf, size_t count);

參數(shù):
pika_dev dev:要操作的設(shè)備句柄
oid buf:寫入緩沖區(qū)
size_t count:寫入數(shù)據(jù)長度,對(duì)于 GPIO、ADC 這樣只能讀取單個(gè)數(shù)據(jù)的設(shè)備,長度為 sizeof(uint32_t)

函數(shù)功能:
1.根據(jù)之前存儲(chǔ)的 dev->platform_data 信息獲取 pin num
2.獲取之前 buf 中存儲(chǔ)的電平信息
3.把電平信息寫到對(duì)應(yīng) pin 上

實(shí)現(xiàn):

int pika_hal_platform_GPIO_write(pika_dev* dev, void* buf, size_t count) {
// 獲取之前 platform_data 數(shù)據(jù)
platform_data_GPIO* data = dev->platform_data;
// 獲取 buf 緩存區(qū)存儲(chǔ)的高低電平信息
uint32_t level = 0;
memcpy(&level, buf, count);
// 把電平寫到對(duì)應(yīng) pin 上
#ifdef RT_USING_PIN
if (level == 0) {
rt_pin_write(data->pin_num, PIN_LOW);
return 0;
}
if (level == 1) {
rt_pin_write(data->pin_num, PIN_HIGH);
return 0;
}
#endif
return 0;
}
pika_hal_platform_GPIO_ioctl_enable
函數(shù)的原型為:int pika_hal_platform_GPIO_ioctl_enable(pika_dev* dev);

參數(shù):
pika_dev* dev:被操作的設(shè)備句柄

函數(shù)功能:
這個(gè)函數(shù)其實(shí)對(duì)應(yīng)的是 pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_ENABLE) 這里的情況,使能了這個(gè)配置函數(shù)
所以要初始化一下 GPIO 的 pin num、輸入輸出模式、推挽模式、波特率等數(shù)據(jù)

實(shí)現(xiàn):

目前只實(shí)現(xiàn)了打印日志

int pika_hal_platform_GPIO_ioctl_enable(pika_dev* dev) {
platform_data_GPIO* data = dev->platform_data;
rt_kprintf("rn=%s==%s=%d=pin_num:%x==rn", FILE , FUNCTION , LINE ,data->pin_num);
/* TODO /
return 0;
}
pika_hal_platform_GPIO_ioctl_disable
函數(shù)的原型為:int pika_hal_platform_GPIO_ioctl_disable(pika_dev
dev);

參數(shù):
pika_dev* dev:被操作的設(shè)備句柄

函數(shù)功能:
這個(gè)函數(shù)其實(shí)對(duì)應(yīng)的是 pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_DISABLE) 這里的情況

實(shí)現(xiàn):

同 enable 部分,disable 也只是打印了日志

int pika_hal_platform_GPIO_ioctl_disable(pika_dev* dev) {
rt_kprintf("rn=%s==%s=%d===rn", FILE , FUNCTION , LINE );
platform_data_GPIO* data = dev->platform_data;
return -1;
}
pika_hal_platform_GPIO_ioctl_config
函數(shù)的原型為:int pika_hal_platform_GPIO_ioctl_config(pika_dev* dev, pika_hal_GPIO_config* cfg);

參數(shù):
pika_dev dev:被操作的設(shè)備句柄
pika_hal_GPIO_config cfg:GPIO 配置,具體定義如下:

typedef struct {
PIKA_HAL_GPIO_DIR dir;//輸入輸出
PIKA_HAL_GPIO_PULL pull;//推挽模式
PIKA_HAL_GPIO_SPEED speed;//數(shù)據(jù)傳輸速率
void (event_callback)(pika_dev dev, PIKA_HAL_GPIO_EVENT_SIGNAL signal);//事件回調(diào)函數(shù)
PIKA_HAL_GPIO_EVENT_SIGNAL event_callback_filter;//上升沿還是下降沿
//事件回調(diào)是否使能
PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
} pika_hal_GPIO_config;
函數(shù)功能:
1.對(duì)輸入輸出進(jìn)行討論,分為 PIKA_HAL_GPIO_DIR_OUT、PIKA_HAL_GPIO_DIR_IN 兩種
2.對(duì)推挽模式進(jìn)行討論,分為 PIKA_HAL_GPIO_PULL_NONE、PIKA_HAL_GPIO_PULL_UP、PIKA_HAL_GPIO_PULL_DOWN 三種
3.討論事件回調(diào)是否使能、是否設(shè)置了回調(diào)函數(shù)
4.討論回調(diào)函數(shù)是上升沿觸發(fā)還是下降沿觸發(fā)(PIKA_HAL_GPIO_EVENT_SIGNAL_RISING 以及 PIKA_HAL_GPIO_EVENT_SIGNAL_FALLING)

實(shí)現(xiàn):

現(xiàn)有實(shí)現(xiàn)中并沒有管回調(diào)函數(shù)的部分,所以相對(duì)簡單

RT-Thread 文檔中關(guān)于 void rt_pin_mode(rt_base_t pin, rt_base_t mode); 函數(shù)的 mode 可選項(xiàng)為:

#define PIN_MODE_OUTPUT 0x00 /* 輸出 /
#define PIN_MODE_INPUT 0x01 /
輸入 /
#define PIN_MODE_INPUT_PULLUP 0x02 /
上拉輸入 /
#define PIN_MODE_INPUT_PULLDOWN 0x03 /
下拉輸入 /
#define PIN_MODE_OUTPUT_OD 0x04 /
開漏輸出 */
所以最外層討論輸入輸出,內(nèi)層討論上拉下拉即可。

int pika_hal_platform_GPIO_ioctl_config(pika_dev* dev,
pika_hal_GPIO_config* cfg) {
rt_kprintf("rn=%s==%s=%d=dir:%d==rn", FILE , FUNCTION , LINE ,cfg->dir);
platform_data_GPIO* data = dev->platform_data;
uint8_t pinMode = 0;
// 對(duì) cfg 中各項(xiàng)分類討論,從而確定 pinMode
switch (cfg->dir) {
case PIKA_HAL_GPIO_DIR_IN:
switch(cfg->pull)
{
case PIKA_HAL_GPIO_PULL_UP:
pinMode = PIN_MODE_INPUT_PULLUP;
break;
case PIKA_HAL_GPIO_PULL_DOWN:
pinMode = PIN_MODE_INPUT_PULLDOWN;
break;
default:
pinMode = PIN_MODE_INPUT;
}
break;
case PIKA_HAL_GPIO_DIR_OUT:
pinMode = PIN_MODE_OUTPUT;
break;
default:
pinMode = PIN_MODE_OUTPUT;
}
// 將 pin 的模式設(shè)置為 pinMode
#ifdef RT_USING_PIN
rt_pin_mode(data->pin_num, pinMode);
#endif
return 0;
}
Todo

作者也在閱讀源碼的過程中發(fā)現(xiàn)了一些問題:

1.對(duì)失敗的情況有時(shí)候沒有做討論,如 pika_hal_platform_GPIO_open 函數(shù)中,顯然 rt_pin_get() 是可能獲取不到的,此時(shí)應(yīng)該返回 -1 表示出錯(cuò)并打印有關(guān)日志信息,但現(xiàn)有代碼中沒有這部分處理

2.pika_hal_platform_GPIO_ioctl_config 中沒有配置為開漏模式的情況,這意味著無法使用 pikascript 腳本將 GPIO 模式設(shè)置為開漏模式。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 存儲(chǔ)器
    +關(guān)注

    關(guān)注

    38

    文章

    7637

    瀏覽量

    166528
  • 緩沖器
    +關(guān)注

    關(guān)注

    6

    文章

    2037

    瀏覽量

    46687
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1276

    瀏覽量

    53628
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4825

    瀏覽量

    86268
  • RTThread
    +關(guān)注

    關(guān)注

    8

    文章

    132

    瀏覽量

    41564
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何通過RT-Thred提供的pin設(shè)備管理接口來操作GPIO

    PIN設(shè)備的操作方法應(yīng)用程序通過RT-Thred提供的pin設(shè)備管理接口來操作GPIO,函數(shù)
    發(fā)表于 01-12 07:01

    RT-Thread PIN設(shè)備學(xué)習(xí)資料分享

    一、PIN 設(shè)備學(xué)習(xí) PIN 設(shè)備RTT 最簡單的一個(gè)設(shè)備,通過
    發(fā)表于 03-29 11:12

    RT Thread PIN組件的物理操作

    。RT HAL HAL interface 用于MCU 和RTT特定的 PIN接口之間的解耦最后由MCU 官方HAL庫實(shí)現(xiàn)PIN 組件的物理
    發(fā)表于 05-16 16:03

    怎樣通過RT-Thread提供的PIN設(shè)備管理接口來訪問GPIO

    :訪問 PIN 設(shè)備應(yīng)用程序通過 RT-Thread 提供的 PIN 設(shè)備管理接口來訪問 GPIO
    發(fā)表于 07-15 11:16

    RTT系統(tǒng)初始化后_hw_pin指針總是為空這是為什么

    RTT Studio建立項(xiàng)目,設(shè)備是STM32WB55 Nucleo。按照RTT的流程,在rtthread_startup()函數(shù)中已經(jīng)有對(duì)board的各種接口的初始化。main()
    發(fā)表于 08-12 11:08

    GPIO設(shè)備接口主要有哪些功能

    的功能,程序會(huì)自動(dòng)配置這些引腳。pinmux table 位于 bsp/board/xxx_board 目錄下 pinmux_config.h 文件。通過標(biāo)準(zhǔn)的 GPIO 設(shè)備接口配置引腳,缺點(diǎn)是只能
    發(fā)表于 08-18 17:18

    使用RTT設(shè)備框架PIN設(shè)備去設(shè)置邊沿觸發(fā)無法關(guān)閉這是什么原因

    我手上有兩個(gè)光電傳感器。使用STM32外部中斷,邊沿觸發(fā)(上升沿和下降沿都觸發(fā))反饋傳感器有沒有被碰到。使用cube+裸機(jī)編程沒有問題.使用RTT設(shè)備框架PIN設(shè)備去設(shè)置邊沿觸發(fā)(上
    發(fā)表于 09-06 10:57

    使用RT-Thread與N32G457實(shí)現(xiàn)SPI接口的驅(qū)動(dòng)設(shè)計(jì)

    前言參加創(chuàng)新“芯”引擎 | 國民技術(shù)N32G457 RT-Thread設(shè)計(jì)大賽,使用到了spi但是,spi接口使用rtt的還是頭一次,所以還是學(xué)習(xí)。在使用spi的時(shí)候使用RT-Th
    發(fā)表于 09-23 11:42

    pikascript移植報(bào)錯(cuò)不知道是哪里的問題?

    想在fm33lx基礎(chǔ)上應(yīng)用pikaScript做腳本開發(fā),通過env添加了pikaScript的軟件包,工程里也出現(xiàn)了對(duì)應(yīng)的文件,但是在編譯的時(shí)候提示錯(cuò)誤,不知道哪里的問題,請(qǐng)大咖指教。
    發(fā)表于 05-05 11:49

    TD-SCDMA RTT的空間接口技術(shù)綜述

    TD-SCDMA RTT的空間接口技術(shù)綜述:
    發(fā)表于 05-21 13:22 ?20次下載
    TD-SCDMA <b class='flag-5'>RTT</b>的空間<b class='flag-5'>接口</b>技術(shù)綜述

    STM32 通用GPIO模擬I2C實(shí)現(xiàn)

    STM32 模擬I2C實(shí)現(xiàn)#通用GPIO模擬I2C通信實(shí)現(xiàn)樣例1 GPIO初始化``#ifdef HW_I2C1 //硬件I2C初始化//PA8-I2C1_SCLGPIO_Struct
    發(fā)表于 11-29 15:21 ?29次下載
    STM32 通用<b class='flag-5'>GPIO</b>模擬I2C<b class='flag-5'>實(shí)現(xiàn)</b>

    RTT_Draco的外置uart接口(TXD,RXD)怎么配置和使用

    RTT_Draco的外置uart接口(TXD,RXD)怎么配置和使用? RT-Thread的RTT_Draco是一款高性能的MCU芯片,它提供了外置UART
    的頭像 發(fā)表于 01-16 17:11 ?1463次閱讀

    gpio接口是干什么的 gpio四種輸入輸出模式怎么選擇

    這些引腳的電平狀態(tài),實(shí)現(xiàn)與外部設(shè)備的通信和交互。GPIO接口在嵌入式系統(tǒng)、物聯(lián)網(wǎng)設(shè)備、樹莓派項(xiàng)目等領(lǐng)域有著廣泛的應(yīng)用,為電子
    的頭像 發(fā)表于 10-06 16:07 ?7278次閱讀

    GPIO使用教程 GPIO接口應(yīng)用

    交互,實(shí)現(xiàn)外部設(shè)備的控制和數(shù)據(jù)傳輸。 一、GPIO的基本概念 GPIO的全稱是General-Purpose Input/Output,即通用輸入/輸出。它是一種在電子
    的頭像 發(fā)表于 01-31 10:10 ?2993次閱讀

    RT-Thread PIN驅(qū)動(dòng)添加

    Pin驅(qū)動(dòng)框架以NXPMCXA153為例PIN設(shè)備驅(qū)動(dòng)層單純的提供接口給應(yīng)用層用,其中PIN設(shè)備
    的頭像 發(fā)表于 03-28 18:59 ?201次閱讀
    RT-Thread <b class='flag-5'>PIN</b>驅(qū)動(dòng)添加
    主站蜘蛛池模板: 欧美精品福利 | 奇米影视四色首页手机在线 | 起碰免费视频 | 中国一级特黄剌激爽毛片 | 日本不卡视频在线视频观看 | 亚色影视| 在线天堂中文 | 手机在线看片福利盒子 | 亚洲a免费 | 狠狠躁夜夜躁人人爽天天miya | 伊人网址| 免费网站黄 | 免费在线观看理论片 | 国产永久视频夜色资源网 | 午夜影院在线观看免费 | 手机看片福利盒子 | 天天操2023| 亚洲五月综合网色九月色 | 五月婷婷丁香在线视频 | 日本免费黄视频 | 亚洲国产tv | 99视频精品全国免费 | 好紧好湿好黄的视频 | 免费视频在线视频观看1 | 农村妇女高清毛片一级 | 夜夜爱夜夜做夜夜爽 | 午夜影院在线观看 | 国产成人亚洲综合a∨婷婷 国产成人一区二区三中文 国产成人一区二区在线不卡 | 福利视频一区二区牛牛 | swag系列国产精品 | 四虎精品久久 | 亚洲 欧美 日韩 在线 中文字幕 | 欧美人成一本免费观看视频 | 国产婷婷综合丁香亚洲欧洲 | 一级毛片成人免费看a | 国产馆精品推荐在线观看 | 四虎影院永久在线观看 | 欧美一级片网址 | 特极毛片 | 色综合亚洲天天综合网站 | 久久久噜噜噜久久中文字幕色伊伊 |