女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

?ESP32-S3 ADC外設(shè)單次觸發(fā)模式

云深之無(wú)跡 ? 來(lái)源:云深之無(wú)跡 ? 2023-09-15 14:19 ? 次閱讀

IDF寫(xiě)的還挺好,我覺(jué)得,這么多芯片可以縫縫補(bǔ)補(bǔ)的用一個(gè)SDK,牛的咧。

7c83c758-537e-11ee-a25d-92fbcf53809c.png

這個(gè)是最常見(jiàn)的宏定義

7c9ff022-537e-11ee-a25d-92fbcf53809c.png

單次觸發(fā)的單元體

7cc89612-537e-11ee-a25d-92fbcf53809c.png

這個(gè)絕對(duì)是里面最常見(jiàn)的宏了

該宏定義接受以下參數(shù):

a:要檢查的條件表達(dá)式。

err_code:在條件為假時(shí)返回的錯(cuò)誤代碼。

goto_tag:條件為假時(shí)要跳轉(zhuǎn)到的標(biāo)簽位置。

log_tag:用于記錄日志的標(biāo)簽位置(可選)。

format:格式化字符串(可選)。

...:可變參數(shù)列表(可選)。

該宏的作用是執(zhí)行以下操作:

如果提供了log_tag,則將其值打印到日志中。

檢查條件a是否為假。如果為假,則執(zhí)行以下操作:

將錯(cuò)誤代碼賦值給變量ret。

使用goto_tag跳轉(zhuǎn)到指定標(biāo)簽位置。

這個(gè)宏通常用于在條件為假時(shí)進(jìn)行錯(cuò)誤處理或跳轉(zhuǎn)到特定的代碼塊。

7cf2f98e-537e-11ee-a25d-92fbcf53809c.png

在這里是錯(cuò)誤的代碼的處理處

7d1576bc-537e-11ee-a25d-92fbcf53809c.png

連著就2個(gè)

這是一個(gè)條件判斷的宏定義,用于檢查 init_config 和 ret_unit 是否為空指針。如果其中任何一個(gè)為空指針,則跳轉(zhuǎn)到指定的標(biāo)簽位置 err,并打印錯(cuò)誤信息 "invalid argument: null pointer"。

7d29c05e-537e-11ee-a25d-92fbcf53809c.png

具體解釋如下:

init_config && ret_unit:這是一個(gè)邏輯與操作,用于檢查init_config和ret_unit是否都非空。如果兩者都非空,則表達(dá)式的結(jié)果為真;否則為假。

ESP_ERR_INVALID_ARG:這是錯(cuò)誤代碼常量,表示參數(shù)無(wú)效的錯(cuò)誤。

err:這是要跳轉(zhuǎn)到的標(biāo)簽位置。

TAG:這是要打印日志的標(biāo)簽位置。

"invalid argument: null pointer":這是要打印的錯(cuò)誤信息字符串。

當(dāng) init_config 或 ret_unit 為空指針時(shí),執(zhí)行以下操作:

如果提供了TAG,則將其值打印到日志中。

將錯(cuò)誤代碼賦值給變量ret。

使用err跳轉(zhuǎn)到指定標(biāo)簽位置。

這個(gè)宏的作用是在參數(shù)無(wú)效時(shí)進(jìn)行錯(cuò)誤處理,并將錯(cuò)誤信息打印到日志中。

7d96620e-537e-11ee-a25d-92fbcf53809c.png

這是一個(gè)C語(yǔ)言的函數(shù),名為heap_caps_calloc。這個(gè)函數(shù)用于在指定的內(nèi)存堆上分配一塊連續(xù)的、指定大小的內(nèi)存空間,并初始化為0。

參數(shù)解析:

n:需要分配的元素?cái)?shù)量。

size:每個(gè)元素的大?。ㄒ宰止?jié)為單位)。

caps:內(nèi)存分配器的容量屬性。這通常用于指定內(nèi)存分配器可以處理的最大對(duì)象大小。

函數(shù)執(zhí)行流程:

調(diào)用heap_caps_calloc_base(n, size, caps)函數(shù)嘗試在指定的內(nèi)存堆上分配n * size字節(jié)的內(nèi)存空間,并返回一個(gè)指向這塊內(nèi)存的指針。

如果分配失?。磒tr為NULL),并且size大于0,那么調(diào)用heap_caps_alloc_failed(size, caps, __func__)函數(shù)報(bào)告內(nèi)存分配失敗。

最后,返回分配的內(nèi)存塊的指針。

7db755f4-537e-11ee-a25d-92fbcf53809c.png

這是一個(gè)C語(yǔ)言的函數(shù),名為heap_caps_calloc_base。這個(gè)函數(shù)用于在指定的內(nèi)存堆上分配一塊連續(xù)的、指定大小的內(nèi)存空間,并初始化為0。

參數(shù)解析:

n:需要分配的元素?cái)?shù)量。

size:每個(gè)元素的大?。ㄒ宰止?jié)為單位)。

caps:內(nèi)存分配器的容量屬性。這通常用于指定內(nèi)存分配器可以處理的最大對(duì)象大小。

函數(shù)執(zhí)行流程:

首先,函數(shù)檢查n * size是否會(huì)導(dǎo)致乘法溢出。如果會(huì)導(dǎo)致溢出,那么函數(shù)返回NULL,表示內(nèi)存分配失敗。

這是通過(guò)調(diào)用__builtin_mul_overflow(n, size, &size_bytes)來(lái)實(shí)現(xiàn)的,這個(gè)內(nèi)建函數(shù)會(huì)檢查乘法操作是否會(huì)導(dǎo)致溢出,如果會(huì)導(dǎo)致溢出,那么它會(huì)把溢出的大小存儲(chǔ)在size_bytes中,并返回非零值。

如果n * size不會(huì)導(dǎo)致溢出,那么函數(shù)就使用calloc函數(shù)來(lái)分配內(nèi)存。calloc函數(shù)接受兩個(gè)參數(shù):需要分配的元素?cái)?shù)量和每個(gè)元素的大小,然后返回一個(gè)指向分配的內(nèi)存的指針。

最后,函數(shù)返回calloc函數(shù)返回的指針。

7dcea8c6-537e-11ee-a25d-92fbcf53809c.png

讓我們來(lái)看看這個(gè)函數(shù)的樣子

這是一個(gè)C語(yǔ)言的函數(shù),名為_(kāi)calloc_r。這個(gè)函數(shù)是C標(biāo)準(zhǔn)庫(kù)函數(shù)calloc的一個(gè)包裝器,它用于在指定的內(nèi)存堆上分配一塊連續(xù)的、指定大小的內(nèi)存空間,并初始化為0。

參數(shù)解析:

struct _reent *r:一個(gè)指向_reent結(jié)構(gòu)體的指針,這個(gè)結(jié)構(gòu)體通常用于封裝某些與環(huán)境相關(guān)的信息。在這個(gè)函數(shù)中,我們并沒(méi)有使用到這個(gè)參數(shù)。

size_t nmemb:需要分配的元素?cái)?shù)量。

size_t size:每個(gè)元素的大?。ㄒ宰止?jié)為單位)。

函數(shù)執(zhí)行流程:

首先,函數(shù)檢查nmemb * size是否會(huì)導(dǎo)致乘法溢出。如果會(huì)導(dǎo)致溢出,那么函數(shù)返回NULL,表示內(nèi)存分配失敗。這是通過(guò)調(diào)用__builtin_mul_overflow(nmemb, size, &size_bytes)來(lái)實(shí)現(xiàn)的,這個(gè)內(nèi)建函數(shù)會(huì)檢查乘法操作是否會(huì)導(dǎo)致溢出,如果會(huì)導(dǎo)致溢出,那么它會(huì)把溢出的大小存儲(chǔ)在size_bytes中,并返回非零值。

然后,函數(shù)調(diào)用heap_caps_malloc_default(size_bytes)來(lái)分配一塊內(nèi)存。這個(gè)函數(shù)接受一個(gè)參數(shù),表示需要分配的字節(jié)數(shù),然后返回一個(gè)指向分配的內(nèi)存的指針。

如果內(nèi)存分配成功(即result != NULL),函數(shù)使用bzero(result, size_bytes)來(lái)將這塊內(nèi)存的所有字節(jié)都設(shè)置為0。

最后,函數(shù)返回指向分配的內(nèi)存的指針。

7de7ff6a-537e-11ee-a25d-92fbcf53809c.png

這是一個(gè)C語(yǔ)言的語(yǔ)句,它調(diào)用了之前定義的heap_caps_calloc函數(shù)來(lái)分配一塊內(nèi)存,并將這塊內(nèi)存的地址賦值給變量unit。

參數(shù)解析:

1:需要分配的元素?cái)?shù)量。在這里,我們只分配一個(gè)元素,所以這個(gè)值是1。

sizeof(adc_oneshot_unit_ctx_t):每個(gè)元素的大小。這里,我們使用sizeof操作符來(lái)獲取adc_oneshot_unit_ctx_t類型數(shù)據(jù)的大小(以字節(jié)為單位),然后把它作為calloc函數(shù)的第二個(gè)參數(shù)。這意味著我們想要分配一塊能夠存儲(chǔ)一個(gè)adc_oneshot_unit_ctx_t類型數(shù)據(jù)的內(nèi)存。

ADC_MEM_ALLOC_CAPS:內(nèi)存分配器的容量屬性。這通常用于指定內(nèi)存分配器可以處理的最大對(duì)象大小。

在這里,我們使用ADC_MEM_ALLOC_CAPS作為這個(gè)參數(shù),表示我們希望使用能夠處理最大對(duì)象大小為ADC_MEM_ALLOC_CAPS的內(nèi)存分配器來(lái)分配這塊內(nèi)存。

函數(shù)執(zhí)行流程:

調(diào)用heap_caps_calloc函數(shù),傳入?yún)?shù)1、sizeof(adc_oneshot_unit_ctx_t)和ADC_MEM_ALLOC_CAPS。

如果分配成功,heap_caps_calloc函數(shù)會(huì)返回一個(gè)指向分配的內(nèi)存的指針,我們將這個(gè)指針賦值給變量unit。

如果分配失敗,heap_caps_calloc函數(shù)會(huì)返回NULL,我們將不會(huì)得到任何結(jié)果。

7e072c1e-537e-11ee-a25d-92fbcf53809c.png

看出來(lái)沒(méi)有,每一個(gè)語(yǔ)句都要進(jìn)行一次校驗(yàn)。

7e24a5dc-537e-11ee-a25d-92fbcf53809c.png

解析:

_lock_acquire(&s_ctx.mutex);:這行代碼獲取名為s_ctx.mutex的互斥鎖,以確保在初始化過(guò)程中只有一個(gè)線程可以訪問(wèn)該代碼塊。

s_ctx.units[init_config->unit_id] = unit;:這行代碼將unit指針存儲(chǔ)在s_ctx.units數(shù)組中,數(shù)組索引為init_config->unit_id。這意味著根據(jù)配置中的單元ID,將特定的單元與上下文關(guān)聯(lián)起來(lái)。

_lock_release(&s_ctx.mutex);:這行代碼釋放之前獲取的互斥鎖,允許其他線程訪問(wèn)被保護(hù)的代碼塊。

unit->unit_id = init_config->unit_id;:這行代碼將單元的ID設(shè)置為配置中指定的單元ID,確保單元的唯一性。

unit->ulp_mode = init_config->ulp_mode;:這行代碼將單元的ULP(單位長(zhǎng)度脈沖)模式設(shè)置為配置中指定的ULP模式,用于控制ADC的采樣率。

總結(jié):這段代碼片段展示了一個(gè)使用互斥鎖保護(hù)的ADC單觸發(fā)模式的初始化過(guò)程,其中通過(guò)將單元ID和ULP模式與相應(yīng)的配置關(guān)聯(lián)起來(lái)來(lái)初始化單元。

7e4b34f4-537e-11ee-a25d-92fbcf53809c.png

這些都是內(nèi)聯(lián)函數(shù)

7e6a0a1e-537e-11ee-a25d-92fbcf53809c.png

實(shí)現(xiàn)在C

7e999d24-537e-11ee-a25d-92fbcf53809c.png

這是一個(gè)C語(yǔ)言的代碼片段,它定義了一個(gè)名為_(kāi)lock_acquire的函數(shù),該函數(shù)用于獲取一個(gè)互斥鎖。這個(gè)函數(shù)是兼容舊版newlib鎖函數(shù)的。

解析:

typedef int _lock_t;:這行代碼定義了一個(gè)新的類型別名_lock_t,它是一個(gè)整數(shù)類型。

void IRAM_ATTR _lock_acquire(_lock_t *lock):這行代碼定義了一個(gè)函數(shù)_lock_acquire,它接受一個(gè)指向_lock_t類型的指針lock作為參數(shù)。IRAM_ATTR是一個(gè)編譯器指令,表示這個(gè)函數(shù)是"in-ram"屬性的,即它在編譯時(shí)會(huì)被嵌入到程序的ROM中,而不是在運(yùn)行時(shí)從外部存儲(chǔ)器加載。

{ lock_acquire_generic(lock, portMAX_DELAY, queueQUEUE_TYPE_MUTEX); }:這行代碼調(diào)用了lock_acquire_generic函數(shù),嘗試獲取由lock指向的互斥鎖。portMAX_DELAY和queueQUEUE_TYPE_MUTEX是傳遞給lock_acquire_generic函數(shù)的參數(shù),它們可能是指定等待時(shí)間(以微秒為單位)和鎖的類型(在這個(gè)例子中是互斥鎖)。

7ec2364e-537e-11ee-a25d-92fbcf53809c.png

這個(gè)是屬于我一樣看不懂的東西,但是大概率是一個(gè)去取值復(fù)制

7ed1d6f8-537e-11ee-a25d-92fbcf53809c.png

這是我上次寫(xiě)的單次觸發(fā)結(jié)構(gòu)體,真尼瑪老母豬帶胸罩,一套一套的

7ef23150-537e-11ee-a25d-92fbcf53809c.png

那么這個(gè)結(jié)構(gòu)體就是給了一個(gè)新變量吧

7f124a1c-537e-11ee-a25d-92fbcf53809c.png

這個(gè)ADC單次觸發(fā)的內(nèi)容?但是是這個(gè)是S_CTX的發(fā)源地

7f323c14-537e-11ee-a25d-92fbcf53809c.png

也就是最上面的這個(gè)結(jié)構(gòu)體

這段代碼定義了一個(gè)名為adc_oneshot_ctx_t的結(jié)構(gòu)體,用于存儲(chǔ)ADC(模數(shù)轉(zhuǎn)換器)單觸發(fā)模式的上下文信息。

解析:

typedef struct adc_oneshot_ctx_t:這是一個(gè)類型定義,將結(jié)構(gòu)體adc_oneshot_ctx_t定義為一個(gè)新的類型名,以便在后續(xù)的代碼中引用。

{ _lock_t mutex; ... }:這是結(jié)構(gòu)體的成員列表,列出了該結(jié)構(gòu)體包含的所有成員變量。

adc_oneshot_unit_ctx_t *units[SOC_ADC_PERIPH_NUM];:這是一個(gè)指向adc_oneshot_unit_ctx_t類型的指針數(shù)組,用于存儲(chǔ)ADC單元的上下文信息。SOC_ADC_PERIPH_NUM是一個(gè)宏定義,表示ADC外設(shè)的數(shù)量。

int apb_periph_ref_cnts;:這是一個(gè)整型變量,用于記錄使用APB_SARADC外設(shè)的ADC單觸發(fā)模式芯片的引用計(jì)數(shù)。

7f5d88ba-537e-11ee-a25d-92fbcf53809c.png

看這個(gè),其實(shí)就是線程安全的寫(xiě)法

7f7a9428-537e-11ee-a25d-92fbcf53809c.png

獲取這個(gè)結(jié)構(gòu)體里面的mutex

7f9b9b96-537e-11ee-a25d-92fbcf53809c.png

這段代碼是將一個(gè)單元(unit)對(duì)象存儲(chǔ)到s_ctx.units數(shù)組中,數(shù)組的索引由init_config->unit_id指定。

根據(jù)代碼片段提供的信息,我們可以推斷出以下內(nèi)容:

s_ctx是一個(gè)全局變量或結(jié)構(gòu)體的成員變量,它包含了與ADC單觸發(fā)模式相關(guān)的上下文信息。

units是s_ctx中的一個(gè)成員變量,它是一個(gè)指針數(shù)組,用于存儲(chǔ)ADC單元的上下文信息。

init_config是一個(gè)指向初始化配置結(jié)構(gòu)體的指針,其中包含了要存儲(chǔ)的單元的ID和相關(guān)配置信息。

unit_id是init_config中的一個(gè)成員變量,它指定了要存儲(chǔ)的單元的ID。

unit是要存儲(chǔ)的單元對(duì)象。

根據(jù)上述分析,該代碼的作用是將單元對(duì)象存儲(chǔ)到s_ctx.units數(shù)組中,以便在后續(xù)的操作中使用。

7fd7f118-537e-11ee-a25d-92fbcf53809c.png

unit->unit_id = init_config->unit_id;:這行代碼將init_config中的unit_id值賦給unit對(duì)象的unit_id成員變量。

unit->ulp_mode = init_config->ulp_mode;:這行代碼將init_config中的ulp_mode值賦給unit對(duì)象的ulp_mode成員變量。

7ff57f6c-537e-11ee-a25d-92fbcf53809c.png

這段代碼定義了一個(gè)名為clk_src的變量,類型為adc_oneshot_clk_src_t,并將其初始化為ADC_DIGI_CLK_SRC_DEFAULT。

然后,代碼檢查init_config結(jié)構(gòu)體中的clk_src成員變量是否存在有效的值。如果存在有效值,則將clk_src變量的值更新為init_config->clk_src。

800e60c2-537e-11ee-a25d-92fbcf53809c.png

接著就是設(shè)置時(shí)鐘以及看看沒(méi)有設(shè)置成功

8021ed0e-537e-11ee-a25d-92fbcf53809c.png

里面的這個(gè)代碼呢是在每個(gè)芯片里面都有的

80707776-537e-11ee-a25d-92fbcf53809c.png

來(lái)看參數(shù)

8096fb26-537e-11ee-a25d-92fbcf53809c.png

第一個(gè)是soc的clk模塊

80bcde36-537e-11ee-a25d-92fbcf53809c.png

這段代碼定義了一個(gè)枚舉類型soc_module_clk_t,用于表示不同的時(shí)鐘源。以下是每個(gè)時(shí)鐘源的含義:

SOC_MOD_CLK_CPU:CPU時(shí)鐘可以從XTAL、PLL、RC_FAST或APLL中獲取,通過(guò)配置soc_cpu_clk_src_t來(lái)指定。

SOC_MOD_CLK_RTC_FAST:RTC快速時(shí)鐘可以從XTAL_D4或RC_FAST中獲取,通過(guò)配置soc_rtc_fast_clk_src_t來(lái)指定。

SOC_MOD_CLK_RTC_SLOW:RTC慢速時(shí)鐘可以從RC_SLOW、XTAL32K或RC_FAST_D256中獲取,通過(guò)配置soc_rtc_slow_clk_src_t來(lái)指定。

SOC_MOD_CLK_APB:APB時(shí)鐘高度依賴于CPU時(shí)鐘源。

SOC_MOD_CLK_PLL_D2:PLL_D2時(shí)鐘從PLL派生,具有固定的分頻器為2。

SOC_MOD_CLK_PLL_F160M:PLL_F160M時(shí)鐘從PLL派生,具有固定的頻率為160MHz。

SOC_MOD_CLK_XTAL32K:XTAL32K時(shí)鐘來(lái)自外部32kHz晶體,將時(shí)鐘門(mén)控傳遞給外設(shè)。

SOC_MOD_CLK_RC_FAST:RC_FAST時(shí)鐘來(lái)自內(nèi)部8MHz rc振蕩器,將時(shí)鐘門(mén)控傳遞給外設(shè)。

SOC_MOD_CLK_RC_FAST_D256:RC_FAST_D256時(shí)鐘來(lái)自內(nèi)部8MHz rc振蕩器,分頻器為256,將時(shí)鐘門(mén)控傳遞給外設(shè)。

SOC_MOD_CLK_XTAL:XTAL時(shí)鐘來(lái)自外部晶體(2~40MHz)。

SOC_MOD_CLK_REF_TICK:REF_TICK從APB派生,即使APB頻率改變,其頻率也固定為1MHz。

SOC_MOD_CLK_APLL:APLL從PLL獲取,其頻率可以通過(guò)APLL配置寄存器進(jìn)行配置。

SOC_MOD_CLK_INVALID:表示可用模塊時(shí)鐘源的結(jié)束。

這個(gè)枚舉類型用于在系統(tǒng)中確定和配置各個(gè)模塊的時(shí)鐘源。

80ef95d8-537e-11ee-a25d-92fbcf53809c.png

這段代碼定義了一個(gè)枚舉類型esp_clk_tree_src_freq_precision_t,用于表示不同的時(shí)鐘源精度。以下是每個(gè)精度的含義:

ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED:從驅(qū)動(dòng)程序緩存的數(shù)據(jù)中獲取值;如果數(shù)據(jù)為0,則執(zhí)行校準(zhǔn)操作。

ESP_CLK_TREE_SRC_FREQ_PRECISION_APPROX:獲取其近似頻率值。

ESP_CLK_TREE_SRC_FREQ_PRECISION_EXACT:始終執(zhí)行校準(zhǔn)操作。

ESP_CLK_TREE_SRC_FREQ_PRECISION_INVALID:無(wú)效的精度級(jí)別。

這個(gè)枚舉類型用于在系統(tǒng)中確定和配置各個(gè)模塊的時(shí)鐘源精度。

8106a174-537e-11ee-a25d-92fbcf53809c.png

其實(shí)著才開(kāi)始配置最后一個(gè),ULP

812f03d0-537e-11ee-a25d-92fbcf53809c.png

隨意看吧

816027a8-537e-11ee-a25d-92fbcf53809c.png

大概就是所有結(jié)構(gòu)體都要拋頭露面

8172f446-537e-11ee-a25d-92fbcf53809c.png

終于來(lái)了初始化了

81872d1c-537e-11ee-a25d-92fbcf53809c.png

這段代碼定義了一個(gè)名為adc_oneshot_hal_ctx_t的結(jié)構(gòu)體,用于表示ADC(模數(shù)轉(zhuǎn)換器)的單次觸發(fā)模式的硬件抽象層(HAL)上下文。

以下是每個(gè)成員的解釋:

dev:ADC SoC(系統(tǒng)級(jí)芯片)層的句柄,用于與ADC SoC進(jìn)行交互。

unit:表示ADC單元的變量。

work_mode:表示ADC的工作模式,可能是連續(xù)模式、單次觸發(fā)模式等。

chan_configs:表示每個(gè)ADC通道的配置數(shù)組。

clk_src:表示時(shí)鐘源的選擇。

clk_src_freq_hz:表示時(shí)鐘源的頻率,以Hz為單位

81b3306a-537e-11ee-a25d-92fbcf53809c.png

ADC的初始化

81c7aedc-537e-11ee-a25d-92fbcf53809c.png81eef794-537e-11ee-a25d-92fbcf53809c.png820e526a-537e-11ee-a25d-92fbcf53809c.png

這段代碼片段展示了一個(gè)名為adc1_handle的變量,類型為adc_oneshot_unit_handle_t。它被用于存儲(chǔ)ADC(模數(shù)轉(zhuǎn)換器)單元的句柄。

接下來(lái),代碼定義了一個(gè)名為init_config1的結(jié)構(gòu)體變量,類型為adc_oneshot_unit_init_cfg_t。這個(gè)結(jié)構(gòu)體包含了ADC單元的配置信息。在這個(gè)例子中,unit_id成員被設(shè)置為ADC_UNIT_1,表示當(dāng)前配置的是第一個(gè)ADC單元。

這段代碼的作用是初始化ADC單元1,并將其句柄存儲(chǔ)在adc1_handle變量中。

82255bf4-537e-11ee-a25d-92fbcf53809c.png

設(shè)置 ADC 的初始配置后,使用adc_oneshot_new_unit()準(zhǔn)備好的adc_oneshot_unit_init_cfg_t.如果分配成功,該函數(shù)將返回 ADC 單元句柄。

8241bec0-537e-11ee-a25d-92fbcf53809c.png

通道的設(shè)置

826c33f8-537e-11ee-a25d-92fbcf53809c.png

擴(kuò)展通道的時(shí)候衰減系數(shù)

827b3ede-537e-11ee-a25d-92fbcf53809c.png

位寬

82ab036c-537e-11ee-a25d-92fbcf53809c.png

狠狠的注入

82d30e84-537e-11ee-a25d-92fbcf53809c.png

折騰這么久就是為了這個(gè)read,我可真想死

82ebb0d8-537e-11ee-a25d-92fbcf53809c.png

寫(xiě)完就跑

8321f602-537e-11ee-a25d-92fbcf53809c.png

一個(gè)好的函數(shù)從參數(shù)開(kāi)始

8340e184-537e-11ee-a25d-92fbcf53809c.png

搞對(duì)象都沒(méi)有這么費(fèi)勁

進(jìn)入現(xiàn)場(chǎng),保護(hù)一下

8363055c-537e-11ee-a25d-92fbcf53809c.png

下面就是要轉(zhuǎn)換了

函數(shù)接受三個(gè)參數(shù):

handle:指向adc_oneshot_unit_handle_t類型的指針,表示ADC單元的句柄。

chan:表示要讀取的ADC通道。

out_raw:指向整數(shù)類型的指針,用于存儲(chǔ)轉(zhuǎn)換結(jié)果的原始值。

函數(shù)返回一個(gè)esp_err_t類型的錯(cuò)誤碼,表示操作的結(jié)果。如果操作成功,返回ESP_OK;否則,返回相應(yīng)的錯(cuò)誤碼。

函數(shù)的具體實(shí)現(xiàn)如下:

首先,檢查輸入?yún)?shù)的有效性。如果handle或out_raw為空指針,或者chan超出了有效范圍,將返回相應(yīng)的錯(cuò)誤碼。

然后,嘗試獲取ADC單元的鎖。如果獲取失敗,返回ESP_ERR_TIMEOUT。

進(jìn)入臨界區(qū),使用rtc_spinlock進(jìn)行保護(hù)。

調(diào)用adc_oneshot_hal_setup函數(shù),設(shè)置ADC單元的相關(guān)參數(shù)。

如果支持ADC校準(zhǔn)功能(版本1),則獲取當(dāng)前通道的衰減值,并初始化ADC硬件校準(zhǔn)。

調(diào)用adc_oneshot_hal_convert函數(shù),執(zhí)行實(shí)際的ADC轉(zhuǎn)換操作,并將結(jié)果存儲(chǔ)在out_raw中。

退出臨界區(qū),釋放ADC單元的鎖。

根據(jù)轉(zhuǎn)換結(jié)果的有效性,返回相應(yīng)的錯(cuò)誤碼。

差不多就是這樣,獲取參數(shù)以后來(lái)判斷,在操作系統(tǒng)的監(jiān)督下進(jìn)行一個(gè)安全的操作,然后就釋放資源。

83862c94-537e-11ee-a25d-92fbcf53809c.png

這個(gè)就是轉(zhuǎn)換函數(shù),感覺(jué)又是一篇文章,死了

這段代碼是一個(gè)函數(shù)定義,函數(shù)名為adc_oneshot_hal_convert。它的作用是執(zhí)行ADC(模數(shù)轉(zhuǎn)換器)的單次轉(zhuǎn)換操作,并返回轉(zhuǎn)換結(jié)果的有效性。

函數(shù)接受兩個(gè)參數(shù):

hal:指向adc_oneshot_hal_ctx_t類型的指針,表示ADC單元的上下文信息。

out_raw:指向整數(shù)類型的指針,用于存儲(chǔ)轉(zhuǎn)換結(jié)果的原始值。

函數(shù)返回一個(gè)布爾值,表示操作的結(jié)果。如果操作成功,返回true;否則,返回false。

函數(shù)的具體實(shí)現(xiàn)如下:

首先,根據(jù)hal->unit的值確定要使用的ADC通道。如果hal->unit等于ADC_UNIT_1,則使用通道1;否則,使用通道2。

清除指定通道的事件標(biāo)志位。

禁用所有ADC單元。

啟用指定的ADC通道。

啟動(dòng)ADC單元的單次轉(zhuǎn)換操作,設(shè)置時(shí)鐘源頻率為hal->clk_src_freq_hz。

等待直到指定通道的事件被觸發(fā)。

讀取轉(zhuǎn)換結(jié)果的原始值,并將其存儲(chǔ)在out_raw中。

如果ADC單元的數(shù)量為2(即SOC_ADC_PERIPH_NUM == 2),則對(duì)轉(zhuǎn)換結(jié)果進(jìn)行進(jìn)一步的校驗(yàn)。如果校驗(yàn)失敗,將out_raw設(shè)置為-1。

再次禁用所有ADC單元。

返回轉(zhuǎn)換結(jié)果的有效性(valid)

83c427e2-537e-11ee-a25d-92fbcf53809c.png

看著簡(jiǎn)單,但是實(shí)現(xiàn)確實(shí)復(fù)雜

83d72c5c-537e-11ee-a25d-92fbcf53809c.png

最終的數(shù)據(jù)在這里獲取

83ed8c5e-537e-11ee-a25d-92fbcf53809c.png

@brief宏強(qiáng)制在外設(shè)寄存器上進(jìn)行32位讀取

@注:這個(gè)宏只能在xxx結(jié)構(gòu)體的注冊(cè)域上調(diào)用。當(dāng)前實(shí)現(xiàn)讀入uint32_t類型。

8427bfd2-537e-11ee-a25d-92fbcf53809c.png

最后居然是怎么個(gè)東西

844b9768-537e-11ee-a25d-92fbcf53809c.png

在寄存器上干活了

847328e6-537e-11ee-a25d-92fbcf53809c.png

也可以開(kāi)啟這個(gè)功能

84a48d1e-537e-11ee-a25d-92fbcf53809c.png

說(shuō)實(shí)話我沒(méi)有看懂

84d9f666-537e-11ee-a25d-92fbcf53809c.png

不用你操心的原因是因?yàn)閯e人已經(jīng)操心過(guò)了

84efe7a0-537e-11ee-a25d-92fbcf53809c.png

這些地方是ADC的封裝處

8507b826-537e-11ee-a25d-92fbcf53809c.png

ADC 數(shù)字控制器模式配置

85249d06-537e-11ee-a25d-92fbcf53809c.png

ADC數(shù)字控制器(DMA模式)輸出數(shù)據(jù)格式。用于分析采集到的ADC(DMA)數(shù)據(jù)。

854023d2-537e-11ee-a25d-92fbcf53809c.png

上面我說(shuō)不明白的結(jié)構(gòu)體在文檔里面都有

857fdc02-537e-11ee-a25d-92fbcf53809c.png

859f2864-537e-11ee-a25d-92fbcf53809c.png

85dc6760-537e-11ee-a25d-92fbcf53809c.png

86099a64-537e-11ee-a25d-92fbcf53809c.png

864ae9d8-537e-11ee-a25d-92fbcf53809c.png

寫(xiě)程序試試呢?





審核編輯:劉清

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

    關(guān)注

    99

    文章

    6623

    瀏覽量

    548006
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7628

    瀏覽量

    140043
  • 分配器
    +關(guān)注

    關(guān)注

    0

    文章

    202

    瀏覽量

    26110
  • ESP
    ESP
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    34607
  • 觸發(fā)器
    +關(guān)注

    關(guān)注

    14

    文章

    2030

    瀏覽量

    61813

原文標(biāo)題:?ESP32-S3 ADC外設(shè).2-單次觸發(fā)模式

文章出處:【微信號(hào):TT1827652464,微信公眾號(hào):云深之無(wú)跡】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

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

    【FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)】Arduino IDE快速開(kāi)發(fā)體驗(yàn)

    【FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)】Arduino IDE快速開(kāi)發(fā)體驗(yàn)
    的頭像 發(fā)表于 07-23 09:03 ?3154次閱讀
    【FireBeetle 2  <b class='flag-5'>ESP32-S3</b>開(kāi)發(fā)板測(cè)評(píng)】Arduino IDE快速開(kāi)發(fā)體驗(yàn)

    【FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)】MicroPython開(kāi)發(fā)體驗(yàn)

    【FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)】MicroPython開(kāi)發(fā)體驗(yàn)
    的頭像 發(fā)表于 07-23 09:02 ?2287次閱讀
    【FireBeetle 2 <b class='flag-5'>ESP32-S3</b>開(kāi)發(fā)板測(cè)評(píng)】MicroPython開(kāi)發(fā)體驗(yàn)

    ESP32-S3芯片與ESP32ESP32-S2比較好在哪里呢

    今年三月就有消息傳出樂(lè)鑫要發(fā)布ESP32-S3等四款芯片,但由于疫情和其它原因,到目前為止,官方是還沒(méi)有給出確切的消息。面對(duì)遲遲未露面的ESP32-S3外界傳聞特別多,我們先理理看性能都會(huì)有哪些提升
    發(fā)表于 11-04 14:25 ?1.5w次閱讀

    淺談ESP32-C3ESP32-S3芯片

    ESP32-C3ESP32-S3的發(fā)布,不僅為IOT行業(yè)提供了高性價(jià)比、穩(wěn)定、好用、安全的通訊層,支持AI加速,同時(shí)在顯示層應(yīng)用也將占有一席之地。
    發(fā)表于 04-28 10:37 ?1.9w次閱讀

    合宙ESP32-S3開(kāi)發(fā)板特性解讀

    穿越萬(wàn)水千山,奔赴與工程師朋友的約定——合宙ESP32-S3超值MCU開(kāi)發(fā)板,來(lái)了! 1 合宙ESP32-S3開(kāi)發(fā)板簡(jiǎn)介 合宙CORE-ESP32S3是基于樂(lè)鑫ESP32-S3芯片進(jìn)行
    的頭像 發(fā)表于 01-11 18:45 ?1.1w次閱讀

    啟明去端分享| ESP32-S3如何實(shí)現(xiàn)tcp_client和tcp_server

    /get-started/index.html#get-started-set-up-env硬件需求:Esp32-s3開(kāi)發(fā)板ESP32-S3TCP介紹傳輸控制協(xié)議(TCP
    的頭像 發(fā)表于 09-07 18:53 ?6154次閱讀
    啟明去端分享| <b class='flag-5'>ESP32-S3</b>如何實(shí)現(xiàn)tcp_client和tcp_server

    新品上市 | 合宙ESP32-S3開(kāi)發(fā)板

    穿越萬(wàn)水千山,奔赴與工程師朋友的約定——合宙ESP32-S3超值MCU開(kāi)發(fā)板,來(lái)了!1合宙ESP32-S3開(kāi)發(fā)板簡(jiǎn)介合宙CORE-ESP32S3是基于樂(lè)鑫ESP32-S3芯片進(jìn)行設(shè)計(jì)的
    的頭像 發(fā)表于 01-13 15:53 ?3752次閱讀
    新品上市 | 合宙<b class='flag-5'>ESP32-S3</b>開(kāi)發(fā)板

    基于ESP32-S3的高性能開(kāi)發(fā)板介紹

    FireBeetle 2 ESP32-S3是一款基于ESP32-S3-WROOM-1-N16R8模組設(shè)計(jì)的主控板。ESP32-S3-WROOM-1-N16R8模組擁有16MB Flash和8MB
    的頭像 發(fā)表于 09-05 11:33 ?1.3w次閱讀
    基于<b class='flag-5'>ESP32-S3</b>的高性能開(kāi)發(fā)板介紹

    樂(lè)鑫ESP32-S3-WROOM-1U參考設(shè)計(jì)

    樂(lè)鑫ESP32-S3-WROOM-1U參考設(shè)計(jì)ESP32-S3?是一款集成2.4GHzWi-Fi和Bluetooth5(LE)的MCU芯片,支持遠(yuǎn)距離模式(LongRange)。ESP32-S
    發(fā)表于 10-19 16:13 ?11次下載

    樂(lè)鑫ESP32-S3-WROOM-2參考設(shè)計(jì)

    樂(lè)鑫ESP32-S3-WROOM-2參考設(shè)計(jì)ESP32-S3?是一款集成2.4GHzWi-Fi和Bluetooth5(LE)的MCU芯片,支持遠(yuǎn)距離模式(LongRange)。ESP32-S3
    發(fā)表于 10-19 16:13 ?18次下載

    樂(lè)鑫ESP32-S3-WROOM-1參考設(shè)計(jì)

    樂(lè)鑫ESP32-S3-WROOM-1參考設(shè)計(jì)ESP32-S3?是一款集成2.4GHzWi-Fi和Bluetooth5(LE)的MCU芯片,支持遠(yuǎn)距離模式(LongRange)。ESP32-S3
    發(fā)表于 10-19 16:13 ?32次下載

    樂(lè)鑫ESP32-S3-MINI-1U參考設(shè)計(jì)

    樂(lè)鑫ESP32-S3-MINI-1U參考設(shè)計(jì)ESP32-S3?是一款集成2.4GHzWi-Fi和Bluetooth5(LE)的MCU芯片,支持遠(yuǎn)距離模式(LongRange)。ESP32-S3
    發(fā)表于 10-19 16:13 ?6次下載

    樂(lè)鑫ESP32-S3-MINI-1參考設(shè)計(jì)

    樂(lè)鑫ESP32-S3-MINI-1參考設(shè)計(jì)ESP32-S3?是一款集成2.4GHzWi-Fi和Bluetooth5(LE)的MCU芯片,支持遠(yuǎn)距離模式(LongRange)。ESP32-S3
    發(fā)表于 10-19 16:13 ?11次下載

    樂(lè)鑫ESP32-S3_技術(shù)參考手冊(cè)

    樂(lè)鑫ESP32-S3_技術(shù)參考手冊(cè)ESP32-S3?是一款集成2.4GHzWi-Fi和Bluetooth5(LE)的MCU芯片,支持遠(yuǎn)距離模式(LongRange)。ESP32-S3
    發(fā)表于 10-19 16:13 ?20次下載

    分享6個(gè)實(shí)用的ESP32-S3物聯(lián)網(wǎng)項(xiàng)目:從智能設(shè)備到安全創(chuàng)新

    ESP32-S3是物聯(lián)網(wǎng)領(lǐng)域的創(chuàng)新之一,具備2.4GHz Wi-Fi和藍(lán)牙連接、先進(jìn)的安全功能和各種接口協(xié)議的外設(shè)。該雙核微控制器基于TSMC超低功耗40nm技術(shù)構(gòu)建,適合輕量級(jí)AI應(yīng)用。兼具
    的頭像 發(fā)表于 05-17 10:15 ?1522次閱讀