RM新时代网站-首页

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

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

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

STM32H7系列芯片發(fā)不出去的hello問題

茶話MCU ? 來源:茶話MCU ? 2024-07-01 09:56 ? 次閱讀

有人使用STM32H7系列芯片,用到UART做字符串輸出時(shí)遇到點(diǎn)小問題。這里一起聊聊該問題,并分析問題原因?!咀ⅲ合旅嫠肐DE乃ARM keil MDK】

事情是這樣的,他基于DMA方式通過UART對(duì)外發(fā)送“Hello”字符串,可無意中發(fā)現(xiàn)當(dāng)該字符串以不同的變量形式提供給函數(shù)時(shí)結(jié)果卻不一樣。不妨以下面示意的功能代碼為例來看。

8d70157c-35cc-11ef-a4c8-92fbcf53809c.png

上圖中的主要功能就是基于DMA方式通過UART發(fā)送兩次字符串,一個(gè)字符串是“Hello,STM32-1!”,另一個(gè)是“Hello,STM32-2!”,兩字符串一字之差以示區(qū)別,便于調(diào)試。

可是,按照上面寫法和默認(rèn)編譯條件,測試發(fā)現(xiàn)只有第一個(gè)UART發(fā)送函數(shù)有效,第二個(gè)UART發(fā)送函數(shù)沒有相應(yīng)輸出。見下面輸出截圖:

8da15952-35cc-11ef-a4c8-92fbcf53809c.png

那是為什么呢?兩個(gè)函數(shù)的實(shí)現(xiàn)及變量幾乎一模一樣。如果不使用DMA方式做UART發(fā)送會(huì)怎么樣呢?即將UART的發(fā)送改成查詢方式的API函數(shù),見下面截圖:

8dbe9c10-35cc-11ef-a4c8-92fbcf53809c.png

結(jié)果發(fā)現(xiàn),如果按照上面的寫法,兩行功能代碼的輸出又是正常的,見下面輸出結(jié)果截圖。

8de14b70-35cc-11ef-a4c8-92fbcf53809c.png

看來,問題的出現(xiàn)跟使用DMA有關(guān)。既然問題跟DMA有關(guān),為什么同樣使用基于DMA方式的UART發(fā)送函數(shù),一行可以另一行卻無效呢?這兩行的唯一差別就是在提供發(fā)送字符串的形式上的差異。一行是基于字符串常量提供給函數(shù),一行是基于內(nèi)存變量提供給函數(shù)。

8d70157c-35cc-11ef-a4c8-92fbcf53809c.png

現(xiàn)在的情況是,基于字符串常量提供給函數(shù)的可行,基于內(nèi)存變量提供給函數(shù)的不可行。

這就可能涉及到DMA訪問地址空間的可行性問題,一般來講,每個(gè)DMA往往有其可訪問的地址范圍問題,并非無所不達(dá)。具體到STM32H7系列,其通用DMA是沒法訪問TCM區(qū)域的。當(dāng)然,對(duì)于內(nèi)核CUP而言,它自然沒有訪問不到的地址空間問題,所以剛才基于查詢式做發(fā)送時(shí)兩行函數(shù)功能都正常。

具體到這里,第一個(gè)字符串以常量形式提供給UART發(fā)送函數(shù)時(shí),DMA可以訪問到,第二個(gè)字符串以內(nèi)存變量形式提供給UART發(fā)送函數(shù)時(shí),DMA則訪問不到。我們可以知道,字符串以常量形式提供給UART發(fā)送函數(shù)時(shí),字符串是存放在FLASH里的。我們可以借助調(diào)試工具找到此時(shí)第一個(gè)字符串的具體存放地址,顯然是片內(nèi)Flash地址。見下圖:

8e1d8d10-35cc-11ef-a4c8-92fbcf53809c.png

在STM32H7系列里,通用DMA方式片內(nèi)Flash是沒有問題的。所以解釋了第一行代碼輸出正常。

8ec3b9ba-35cc-11ef-a4c8-92fbcf53809c.png

那么,當(dāng)?shù)诙€(gè)字符串以內(nèi)存變量形式提供給UART發(fā)送函數(shù)時(shí),該字符串到底存放在哪里呢?其實(shí),其地址如果沒有刻意通過用戶指定的話,是編譯器根據(jù)當(dāng)前的編譯配置自動(dòng)安排的。我們借助調(diào)試工具,不難看到第二個(gè)字符串變量【TX_Buffer】就是存放下面的地址,即0x20000008開始的一段地址空間:

8ee6ac22-35cc-11ef-a4c8-92fbcf53809c.png

結(jié)合STM32H7系列手冊相關(guān)地址布局說明,不難得知第二個(gè)字符串存放在DTCM區(qū)域,正是通用DMA訪問不到的地址空間。

8f113762-35cc-11ef-a4c8-92fbcf53809c.png

既然知道了原因,解決起來就就簡單了。我們可以在代碼里直接將字符串存放地址指定到通用DMA可以訪問到的地方,比方AXIRAM,SRAM1/SRAM2/SRAM3任意區(qū)間。

我在下面使用AXI RAM作為默認(rèn)的內(nèi)存空間,也無須通過用戶代碼做地址的指定,只是稍微調(diào)整了ARM MDK IDE的鏈接配置選項(xiàng),見下面示意圖?!咀ⅲ翰煌腎DE,這個(gè)地方的操作會(huì)略有差異。】

8f52388e-35cc-11ef-a4c8-92fbcf53809c.png

8f6c7bae-35cc-11ef-a4c8-92fbcf53809c.png

然后基于之前的代碼重新編譯、運(yùn)行,結(jié)果正常,不再有發(fā)不出去的Hello了。

8f9549da-35cc-11ef-a4c8-92fbcf53809c.png

DMA作為CPU的強(qiáng)力幫手,也有鞭長莫及的時(shí)候,我們在STM32應(yīng)用中要加以留意。

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

    關(guān)注

    455

    文章

    50714

    瀏覽量

    423131
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1235

    瀏覽量

    101354
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    578

    瀏覽量

    20506

原文標(biāo)題:發(fā)不出去的hello問題

文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    求助,調(diào)用HAL_UART_Transmit_DMA函數(shù)連續(xù)發(fā)送時(shí)發(fā)現(xiàn)發(fā)不出去是為什么?

    我在調(diào)用HAL_UART_Transmit_DMA函數(shù)連續(xù)發(fā)送時(shí)發(fā)現(xiàn)發(fā)不出去(while(1)可以持續(xù)發(fā)送但可能丟了不少包),返回值為HAL_BUSY,條件即huart->gState
    發(fā)表于 04-08 06:01

    ESP8266做網(wǎng)路電話收的到發(fā)不出去是什么原因?qū)е碌模?/a>

    我用 STM32F407 + ESP8266 做了一個(gè)網(wǎng)路電話, 用的AT模式 想實(shí)現(xiàn)全雙工收發(fā) 在通話建立後 收的到卻發(fā)不出去 感覺上是RX一直在收音頻數(shù)據(jù) 沒時(shí)間回傳發(fā)送的 AT ACK.
    發(fā)表于 05-10 07:02

    2401發(fā)不出去

    我的無線2401發(fā)不出去信號(hào)呀!我該怎么做?
    發(fā)表于 06-12 09:20

    IMX283 信號(hào)死活發(fā)不出去

    問:收是0,發(fā)是1,死活發(fā)不出去?這個(gè)腳已經(jīng)斷開,強(qiáng)制拉高試過了,還是發(fā)不出去。串口試過了沒問題,到485這就是發(fā)布出去數(shù)據(jù)。串口已經(jīng)往外發(fā)了很多了,看著挺穩(wěn)定的。但是485就發(fā)不出
    發(fā)表于 02-20 10:35

    STM32連接GSM發(fā)不出去信息而用電腦調(diào)試助手就能發(fā)送

    STM32串口連接GSM模塊,一直發(fā)不出去短信,原因自己也找不出來了,求解求解啊。串口線是沒錯(cuò)的,串口輸出是可以將AT指令發(fā)送到電腦的,用電腦調(diào)試助手接收到的是AT+CSCS="
    發(fā)表于 04-25 00:23

    ESP8266網(wǎng)路電話發(fā)不出去

    我用ESP8266做了一個(gè)網(wǎng)路電話,用的AT模式想實(shí)現(xiàn)全雙工收發(fā)在通話建立後收的到卻發(fā)不出去感覺上是RX一直在收音頻數(shù)據(jù)沒時(shí)間回傳發(fā)送的AT ACK。試過自己delay在發(fā)送或是不理會(huì) ack 直接
    發(fā)表于 05-27 22:40

    基于89C52的ATK SIM800C模塊第一條信息發(fā)不出去

    基于89C52的ATK SIM800C模塊為什么第一條信息發(fā)不出去
    發(fā)表于 06-03 03:46

    為什么stm32 can正常模式發(fā)不出數(shù)據(jù)?

    stm32 can 正常模式下發(fā)不出數(shù)據(jù) 上位機(jī)是USBCAN環(huán)回模式是正常的 USBcan能監(jiān)測到數(shù)據(jù)用的原子的103例程 就改了下環(huán)回變正常模式 。while循環(huán)里直接發(fā)送函數(shù)。。。。不知道為什么發(fā)不出??!有人遇到過嗎?
    發(fā)表于 09-16 22:44

    NRF24l01雙機(jī)通信用XCOM發(fā)不出去信息,一直都在循環(huán)顯示asc碼的解決辦法?

    跑了原子哥的實(shí)驗(yàn)代碼,進(jìn)行雙機(jī)通信,按鍵確認(rèn)收發(fā)之后,用XCOM發(fā)不出去信息,一直都在循環(huán)顯示asc碼。該怎么辦
    發(fā)表于 07-15 22:59

    STM32H7教程】第19章 STM32H7的GPIO應(yīng)用之按鍵FIFO

    STM32H7教程】第19章 STM32H7的GPIO應(yīng)用之按鍵FIFO
    發(fā)表于 11-23 18:21 ?9次下載
    【<b class='flag-5'>STM32H7</b>教程】第19章 <b class='flag-5'>STM32H7</b>的GPIO應(yīng)用之按鍵FIFO

    STM32H7學(xué)習(xí)之路繼續(xù)(stm32H7系列3) GPIO

    STM32H7學(xué)習(xí)之路繼續(xù)(stm32H7系列3) GPIO
    發(fā)表于 11-30 12:36 ?20次下載
    <b class='flag-5'>STM32H7</b>學(xué)習(xí)之路繼續(xù)(<b class='flag-5'>stm32H7</b><b class='flag-5'>系列</b>3)  GPIO

    STM32H7教程】第21章 STM32H7的NVIC中斷分組和配置(重要)

    STM32H7教程】第21章 STM32H7的NVIC中斷分組和配置(重要)
    發(fā)表于 12-04 14:36 ?13次下載
    【<b class='flag-5'>STM32H7</b>教程】第21章 <b class='flag-5'>STM32H7</b>的NVIC中斷分組和配置(重要)

    STM32H7教程】第8章 STM32H7的終極調(diào)試組件Event Recorder

    STM32H7教程】第8章 STM32H7的終極調(diào)試組件Event Recorder
    發(fā)表于 12-05 20:06 ?7次下載
    【<b class='flag-5'>STM32H7</b>教程】第8章 <b class='flag-5'>STM32H7</b>的終極調(diào)試組件Event Recorder

    STM32H7教程】第14章 STM32H7的電源,復(fù)位和時(shí)鐘系統(tǒng)

    STM32H7教程】第14章 STM32H7的電源,復(fù)位和時(shí)鐘系統(tǒng)
    發(fā)表于 12-09 11:21 ?36次下載
    【<b class='flag-5'>STM32H7</b>教程】第14章 <b class='flag-5'>STM32H7</b>的電源,復(fù)位和時(shí)鐘系統(tǒng)

    AN5293 STM32F7系列移植到STM32H7系列

    AN5293 STM32F7系列移植到STM32H7系列
    發(fā)表于 11-21 12:57 ?1次下載
    AN5293 <b class='flag-5'>STM32F7</b><b class='flag-5'>系列</b>移植到<b class='flag-5'>STM32H7</b><b class='flag-5'>系列</b>
    RM新时代网站-首页