通過stm32f407晶元usart3獲取485型感測器的資料,使用的是創思通訊的stm32 4g開發板,紅色圈的內容是這塊開發板的usart3,直接通過s3485晶元引出485的ab腳
在使用usart3向485型感測器傳送詢問幀的時候資料一致傳送不出去,其他的串列埠都正常
後來經過高人提點,終於發現了問題所在,主要有兩個問題
1、在stm32f4晶元上,每個埠和串列埠都有乙個外部時鐘,對模組初始化時需要進行時鐘初始化,對串列埠初始化時要先進行串列埠時鐘初始化和串列埠引腳的時鐘初始化我的初始化usart3的**是在usart1的初始化**基礎上改的,查詢手冊第53頁可以看到usart1在apb2匯流排上,usart3在apb1匯流排上,兩個匯流排上的初始化函式時不同,而我初始化時沒有注意到這個問題。
正確**
rcc_ahb1periphclockcmd
(rcc_ahb1periph_gpiob,enable)
;//使能gpiob時鐘
rcc_apb1periphclockcmd
(rcc_apb1periph_usart3,enable)
;//使能usart2時鐘
錯誤rcc_ahb1periphclockcmd
(rcc_ahb1periph_gpiob,enable)
;//使能gpiob時鐘
rcc_apb2periphclockcmd
(rcc_apb1periph_usart3,enable)
;//使能usart2時鐘
2、這個是晶元的usart3通過sp3485引出的485介面的電路圖
通過我們可以看到和開發板連線時不僅有串列埠的rx和tx,還有乙個485的使能引pe4,因為以前使用的都是**買的ttl轉485的模組,只需要連線好轉換模組,控制串列埠收發即可,不需要控制485的使能引腳,但這種方法在這裡是行不通的,sp485的工作方式是半雙工的,查詢sp485的手冊得知使能引腳高電平控制485發資料,使能引腳低電平控制485收資料。
這個問題的解決方法很簡單,在串列埠發資料是將是能引腳置位,傳送資料完成將引腳再次復位即可。
//串列埠3的傳送函式
void
uart3_sendstr
(u8* sendbuf,u8 len)
while
((usart3->sr&
0x40)==
0);//這個迴圈一定要有,確保最後一位資料傳送出去,避免因為復位導致資料未全部傳送,我就在這個地方找了好久
gpio_resetbits
(gpioe,gpio_pin_4)
;//資料傳送完畢將其復位,等待接收資料
}
在進行嵌入式開發過程中,一定一定要多看晶元手冊和電路原理圖,雖然看晶元手冊很麻煩,但可以避免開發過程中的很多麻煩問題,電路圖也是重中之重,我就是吃了這個虧,在這個地方浪費了好幾天時間,導致我一直懷疑自己是不是個憨批。
資料手冊也不需要全部掌握,stm32的晶元資料手冊基本上都是一千頁以上,把主要的內容有個大致了解就行,主要就是usart,gpio,暫存器這些東西。
基於stm32f407建立stm32F427工程
分為三個部分 1.啟動檔案 2.fwilib 包含兩個資料夾inc和src。src裡面是stm32資源的c檔案,inc則是32資源的h檔案 3.user這也是我不太理解的部分 ddbugconfig只包含了用於debug的初始化,則是f4的系統檔案。我是在f407的基礎上改的 總的來說 1.改了晶元...
STM32F407上除錯freeRTOS問題
是在正點原子的阿波羅stm32f429開發板上的例子改來的,他們的編譯沒有問題,我編譯時出現如下問題 定位到出錯的地方,是 再追 configmax syscall interrupt priority 的定義是 define configmax syscall interrupt priority...
STM32F407 驅動外部SRAM
需要驅動的sram型號為is61lv25616al,價效比比51216的高很多 配置cubemx 這幾個時序比較關鍵,可以按照手冊來計算,我用下來這幾個數值比較合適。然後就沒有然後了,生成 就可以用了。檢查sram內容是否正確 uint8 t bsp testextsram void 寫sram p...