1.情況介紹:
因?yàn)槟硞€(gè)項(xiàng)目想要顏色識(shí)別,去識(shí)別球的顏色,但是又不想多來(lái)個(gè)攝像頭,所以想嘗試一下顏色傳感器的方案。但是經(jīng)過(guò)嘗試,HAL庫(kù)生成的 FreeRTOS 硬件 I2C 讀寫(xiě)一直在報(bào)錯(cuò)。 剛好手頭上有九軸陀螺儀的例程代碼。最后用FreeRTOS 硬件 I2C 讀取數(shù)據(jù)。
2.過(guò)程
這里提到了阻塞式 HAL 函數(shù)(?HAL_I2C_Master_Transmit(帶超時(shí))對(duì) RTOS 不友好,因?yàn)樗鼈儾粫?huì)“告訴”RTOS 它們正忙于等待(MCU 使用)某個(gè)條件。如果您需要更高的效率,您可以使用非阻塞 IT或_DMA?函數(shù),實(shí)現(xiàn)中斷和完成回調(diào)。
參考:Solved: I2C implementation based on freeRTOS OS - STMicroelectronics Community
????????? ? 任務(wù)切換導(dǎo)致I2C出錯(cuò) - STM32H7 - 硬漢嵌入式論壇 - Powered by Discuz! (armbbs.cn)
確實(shí)在我使用阻塞式(HAL_I2C_Master_Transmit)時(shí),在第一次跑 I2C 任務(wù)時(shí),它的接收是非常正常的,能夠在正常接收20次左右,就來(lái) HAL_I2C_ERROR_AF 報(bào)錯(cuò)了,然后一直死鎖發(fā)不出去。我一開(kāi)始還想偷懶,因?yàn)樽枞胶瘮?shù)的時(shí)候,數(shù)據(jù)正常接收,看看能不能對(duì)函數(shù)進(jìn)行稍微的修改,讓其跳過(guò)AF報(bào)錯(cuò)。但是讀了上面的文章之后突然就想嘗試 IT 和 DMA 。但是我手上有一份開(kāi)發(fā)板的例程是使用阻塞式來(lái)讀寫(xiě)的,我確認(rèn)了一下,FreeRTOS確實(shí)是可以通過(guò)阻塞式來(lái)讀寫(xiě)的。于是想著先繼續(xù)研究阻塞式了。
這邊例程中用的是:HAL_I2C_Mem_Read 我看了底層,跟?HAL_I2C_Master_Receive 是一樣的
那我就開(kāi)始大膽嘗試,小心求證了。我之前是生成了一份沒(méi)有 FreeRTOS? 使用硬件 I2C 讀取數(shù)據(jù)的。首先把代碼先備份一份。然后將沒(méi)有 FreeRTOS 的代碼用 cubeMX 配置為使用 FreeRTOS 。僅創(chuàng)建了三個(gè)任務(wù),一個(gè)是默認(rèn) defaultTask 任務(wù),一個(gè)是 I2C_Test 任務(wù),一個(gè)是 IDLE 任務(wù)(模擬其他需要運(yùn)行的任務(wù))。
amazing??!I2C沒(méi)有報(bào)錯(cuò)了。ErrorCode沒(méi)了。就是數(shù)據(jù)不更新,庫(kù)函數(shù)也沒(méi)有報(bào)錯(cuò)。
然后我看了一圈下來(lái)都沒(méi)問(wèn)題,還記得上一篇提到的博客,作者的他的 FreeRTOS 說(shuō)是添加了延時(shí),原文是這樣的:發(fā)現(xiàn)是由于循環(huán)執(zhí)行太快,數(shù)據(jù)堵塞導(dǎo)致的問(wèn)題。于是我就修改了一下任務(wù)延時(shí),果然數(shù)據(jù)就出來(lái)了。然后我把統(tǒng)計(jì)了一下任務(wù)的FPS,測(cè)試出了臨界幀率(個(gè)人視情況不同)
參考:解決STM32 I2C接口死鎖在BUSY狀態(tài)的另一種原因和方法_i2c時(shí)鐘使能后busy
我自己測(cè)出來(lái)的 FPS 不能超過(guò)62,否則會(huì)造成數(shù)據(jù)堵塞。后來(lái)我滿(mǎn)心歡喜把這個(gè)移到正在使用代碼里面,數(shù)據(jù)又沒(méi)了, I2C 還報(bào)錯(cuò),ErrorCode 變回了?HAL_I2C_ERROR_AF。然后我就知道我原來(lái)里面的代碼有東西在底層影響了 I2C 。后來(lái)排查到是這個(gè)沖突了。
__HAL_TIM_SetCompare(&htim10, TIM_CHANNEL_1, pwm);
一個(gè)是 PWM,一個(gè)是 I2C,真的是沒(méi)理由啊。隨后我看了這兩的引腳。是不是這兩在同一組GPIO就相互影響了?反正我這是暫時(shí)排除不了。大佬救救我!
這是我把?__HAL_TIM_SetCompare 注釋掉之后的效果,沒(méi)有問(wèn)題。
3.結(jié)語(yǔ)
阻塞式已經(jīng)能夠正常接收發(fā)送了,那我的任務(wù)就已經(jīng)結(jié)束,IT 和 DMA 我就沒(méi)去嘗試了。希望以上內(nèi)容對(duì)你有幫助,有什么不對(duì)的地方還請(qǐng)多多指點(diǎn)。
還有?PWM 和?I2C 的問(wèn)題,希望大佬救我!
參考:
STM32 I2C 從設(shè)備 DMA方式讀寫(xiě)穩(wěn)定工作,記錄以下方法。_stm32 i2c dma-CSDN博客
STM32F103學(xué)習(xí)筆記(1)——FreeRTOS下模擬I2C_freertos i2c-CSDN博客
STM32 I2C調(diào)試過(guò)程心得記錄_i2c_initstruct.i2c_analogfilter-CSDN博客文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-830130.html
微控制器 - 在 STM32 上使用 FreeRTOS 創(chuàng)建從屬 I2C 的正確方法是什么?- 堆棧溢出 (stackoverflo??????w.com)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-830130.html
到了這里,關(guān)于STM32 HAL FreeRTOS 硬件I2C 使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!