簡體   English   中英

STM32雙中斷

[英]STM32 double interrupt

我對 STM32 系列還是比較陌生(現在幾個月,以前只在 ARM7 系列中工作)。 我正在編寫一個非常受時間限制的代碼。 全部都用 GAS 編碼,沒有 C,沒有操作系統。 我使用的是 STM32F730Z8,時鍾頻率為 200 MHz。 所有代碼在啟動時被復制到 ITCM SRAM 並從那里執行以提高速度(VTOR 也適當地映射向量表)。

問題是我收到了對中斷處理程序的雙重調用。 我在此處和 ST 知識庫中進行了搜索,並查看了一些參考資料,但他們的建議並不能解決問題。

一個最小化的例子是將時鍾設置為 200 MHz,只啟用 TIM7 中斷。 TIM7 通過以下方式設置:

write  TIM7_CNT,0
write  TIM7_PSC,9
write  TIM7_ARR,99
write  TIM7_DIER,1
write  TIM7_CR1,1

TIM7 處理程序如下所示:

push  {lr}
write  GPIOD_BSRR,1<<13
write  TIM7_SR,0
b  <label> to jump over a bunch of crap
write  GPIOD_BSRR,1<<29
POP  {pc}

“寫”只是一個簡單的宏:

.macro  write  addr, value
    ldr  r1,=\addr
    ldr  r0,=\value
    str  r0,[r1]
.endm

PD13 的使用是作為計時基准——我查看了 scope 上的那個引腳。 我看到的是成對的脈沖。 它們相隔 10us,因此每對都是由一次重新加載 TIM7 產生的。 每對由兩個 25ns 脈沖組成,它們之間的間隙為 100ns。

這是無法接受的。 我只需要在每個計時器滴答聲上對處理程序進行一次調用。 我嘗試向 TIM7_SR 寫入兩次以清除 UIF 位。 我嘗試在進入處理程序和退出時寫入 TIM7_SR。 我嘗試清除 NVIC_ICPR1 中的未決位。 我嘗試插入額外的廢話代碼,以便有更多時間傳播清除操作。 我不敢相信沒有解決辦法。 幫助??!

Jeff Casey / Rockfield Research Inc. / casey@rockfieldresearch.com / 內華達州拉斯維加斯

好的,我想我已經弄清楚了。 我不喜歡它,但這是一致的。 執行摘要:是的,當中斷清除傳播到時鍾時,您需要無意義的代碼。 但是,時鍾基本速度與傳輸該信息的總線速度不同。

首先,這個芯片的時鍾非常復雜。 我有運行在 200 MHz 的 HCLK (AHB=SYS)。 APB2 總線的最大頻率為 100 MHz,因此需要 2 分頻器。APB1 總線的最大頻率為 50 MHz,因此需要 4 分頻器。

我最初在 APB1 總線設置的除數中有一個錯字,並給它一個 8 的除數。

我的設置 TIMPRE=1 進一步混淆了這一切。 這是設置時鍾加速度的參數。 關閉時,除非總線預分頻比為 1,否則它會在總線上為時鍾提供 2 倍的速度提升,否則。 當 TIMPRE 開啟時,如果預分頻比為 1/2/4,它讓時鍾在 HCLK 運行,否則它在總線上設置 4x 升壓。 了解?

所以最初我在 /8 或 25 MHz 和 TIMPRE=1 處有 APB1。 這提供了 4 倍的提升,因此時鍾的基礎是 100 MHz。 我需要 70 ns 的無意義 NOP 延遲來允許中斷復位傳播並避免處理程序的雙重進入。

修復此問題以為 50 Mhz 提供 APB1 /4,並且 TIMPRE=1 為時鍾提供了 200 MHz 的基礎。 對於 45 ns 的 scope 基准,我現在只需要添加 7-8 個 NOP 廢話。 注意這里的區別——APB1 總線現在運行速度快了 2 倍。

TIM7 位於 APB1 總線上。 然后我切換到使用 TIM9,它位於 APB2 總線上……最大速度為 100 MHz,因此我將除數設置為 2。在所有其他方面,這是相同的 - 請注意 TIM7 和TIM9 以 200 MHz 基准運行時鍾滴答,但使用 TIM9,中斷清除僅添加 4-5 個 NOP 無意義,對於 35 ns 的 scope 基准。 在更快的外圍總線上運行可以讓我更快地響應清除中斷。

這是一個可怕的功能。 這不是我發布的一個快樂的解決方案,它是一個 hacky 解決方法。 如果不檢查 scope 上的雙擊,我現在不敢編寫中斷服務(至少是短服務)。 ST應該為自己感到非常羞恥。 如果有人找到更好的解決方案,我會為此道歉 - 理想情況下,我錯過了一些設置參數,以使它們按應有的方式運行。 如果由於架構的原因這是不可避免的,也許 ST 可以在 AHB 總線上掛一個計時器,這可能會完全解決問題。

我在這個上面拔了頭發。 我希望我的帖子能拯救別人的頭皮。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM