那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32H7系列芯片發不出去的hello問題

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

有人使用STM32H7系列芯片,用到UART做字符串輸出時遇到點小問題。這里一起聊聊該問題,并分析問題原因。【注:下面所用IDE乃ARM keil MDK】

事情是這樣的,他基于DMA方式通過UART對外發送“Hello”字符串,可無意中發現當該字符串以不同的變量形式提供給函數時結果卻不一樣。不妨以下面示意的功能代碼為例來看。

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

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

可是,按照上面寫法和默認編譯條件,測試發現只有第一個UART發送函數有效,第二個UART發送函數沒有相應輸出。見下面輸出截圖:

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

那是為什么呢?兩個函數的實現及變量幾乎一模一樣。如果不使用DMA方式做UART發送會怎么樣呢?即將UART的發送改成查詢方式的API函數,見下面截圖:

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

結果發現,如果按照上面的寫法,兩行功能代碼的輸出又是正常的,見下面輸出結果截圖。

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

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

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

現在的情況是,基于字符串常量提供給函數的可行,基于內存變量提供給函數的不可行。

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

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

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

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

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

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

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

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

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

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

我在下面使用AXI RAM作為默認的內存空間,也無須通過用戶代碼做地址的指定,只是稍微調整了ARM MDK IDE的鏈接配置選項,見下面示意圖。【注:不同的IDE,這個地方的操作會略有差異。】

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

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

然后基于之前的代碼重新編譯、運行,結果正常,不再有發不出去的Hello了。

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

DMA作為CPU的強力幫手,也有鞭長莫及的時候,我們在STM32應用中要加以留意。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    456

    文章

    51170

    瀏覽量

    427214
  • uart
    +關注

    關注

    22

    文章

    1243

    瀏覽量

    101764
  • 字符串
    +關注

    關注

    1

    文章

    585

    瀏覽量

    20601

原文標題:發不出去的hello問題

文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求助,調用HAL_UART_Transmit_DMA函數連續發送時發現發不出去是為什么?

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

    ESP8266做網路電話收的到發不出去是什么原因導致的?

    我用 STM32F407 + ESP8266 做了一個網路電話, 用的AT模式 想實現全雙工收發 在通話建立後 收的到卻發不出去 感覺上是RX一直在收音頻數據 沒時間回傳發送的 AT ACK.
    發表于 05-10 07:02

    2401發不出去

    我的無線2401發不出去信號呀!我該怎么做?
    發表于 06-12 09:20

    IMX283 信號死活發不出去

    問:收是0,發是1,死活發不出去?這個腳已經斷開,強制拉高試過了,還是發不出去。串口試過了沒問題,到485這就是發布出去數據。串口已經往外發了很多了,看著挺穩定的。但是485就發不出
    發表于 02-20 10:35

    STM32連接GSM發不出去信息而用電腦調試助手就能發送

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

    ESP8266網路電話發不出去

    我用ESP8266做了一個網路電話,用的AT模式想實現全雙工收發在通話建立後收的到卻發不出去感覺上是RX一直在收音頻數據沒時間回傳發送的AT ACK。試過自己delay在發送或是不理會 ack 直接
    發表于 05-27 22:40

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

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

    為什么stm32 can正常模式發不出數據?

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

    NRF24l01雙機通信用XCOM發不出去信息,一直都在循環顯示asc碼的解決辦法?

    跑了原子哥的實驗代碼,進行雙機通信,按鍵確認收發之后,用XCOM發不出去信息,一直都在循環顯示asc碼。該怎么辦
    發表于 07-15 22:59

    STM32H7學習之路繼續(stm32H7系列3) GPIO

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

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

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

    STM32H7教程】第8章 STM32H7的終極調試組件Event Recorder

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

    STM32H7教程】第14章 STM32H7的電源,復位和時鐘系統

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

    AN5293 STM32F7系列移植到STM32H7系列

    AN5293 STM32F7系列移植到STM32H7系列
    發表于 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>

    AN5293 STM32F7系列移植到STM32H7系列

    AN5293 STM32F7系列移植到STM32H7系列
    發表于 11-21 17:06 ?1次下載
    AN5293 <b class='flag-5'>STM32F7</b><b class='flag-5'>系列</b>移植到<b class='flag-5'>STM32H7</b><b class='flag-5'>系列</b>
    订做百家乐桌子| 百家乐官网赌博凯时娱乐| 百家乐视频游戏界面| 网上娱乐城排名| 百家乐现金网平台排行榜| 广州百家乐官网酒店用品制造有限公司| 哪家百家乐官网优惠最好且信誉不错 | 皇冠网小说网址| 网络百家乐电脑| 仕達屋百家乐官网的玩法技巧和规则 | 百家乐真人赌场娱乐网规则| 中国百家乐官网澳门真人娱乐平台网址 | 太阳城公司| 百家乐大小点桌子| 百家乐官网高档筹码| 威尼斯人娱乐城图| 百家乐麻关于博彩投注| 最新百家乐官网的玩法技巧和规则| 百家乐官网假在哪里| 88百家乐现金网| 百家乐官网合| 百家乐官网赌场技巧网| 澳门百家乐官网有限公司| 合作市| 赌神网百家乐2| 哪里有百家乐赌博网站| 曼哈顿百家乐官网的玩法技巧和规则 | 威尼斯人娱乐平台赌| 百家乐视频造假| 青州市| 澳门赌场女| 新2娱乐城| 威尔斯人线上娱乐| 大发888在线体育官网| 大发888备用地址| 大发888娱乐城加盟| 威尼斯人娱乐城动态| 全讯网网站xb112| 新太阳城工业区| 大发888 客服| 威尼斯人娱乐城提款|