初级会员

- 积分
- 180
- 金钱
- 180
- 注册时间
- 2016-1-15
- 在线时间
- 49 小时
|

楼主 |
发表于 2016-2-4 00:47:33
|
显示全部楼层
本帖最后由 KCLin 于 2016-2-4 00:50 编辑
網路上查了一些資料
我想邏輯是這樣的
當我們開啟 STM32 系統時
系統會做"低階" 的初始化
比如說,安排記憶體,設置register的預設值。。。等等的
這些都在 startup_stm32f40_41xxx.s 裏頭
一些中斷服務函數也在此定義
例如
; External Interrupts
DCD WWDG_IRQHandler ; Window WatchDog
DCD PVD_IRQHandler ; PVD through EXTI Line detection
DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_IRQHandler ; EXTI Line2
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
以及
Default_Handler PROC
.......
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
...................
很抱歉我不會貼圖(後來知道怎麼貼圖了,不過,既然已經。。。),所以請大家打開程序就可以看到對應的 Handler (中斷的服務函數名稱)
所以,我想是不能自訂 中斷服務函數名稱的
(換句話說,官方沒定義的服務,除非自己會改 startup_stm32f40_41xxx.s ,否則大概就無解了! ?)
我猜想,發生中斷負責呼叫 服務函數 的 那個函數也在 startup_stm32f40_41xxx.s 裏頭?(或許他不是個函數?! 只是 startup_stm32f40_41xxx.s 裡的一個敘述,只是我看不懂罷了?!)
另外就是 USART_RX_STA
我在 開發指南 中詳細找過,也在 程序中找到他的定義
在開發指南裡寫道
"这里我们设计了一个小小的接收协议:通过这个函数,配合一个
数组 USART_RX_BUF[],一个接收状态寄存器 USART_RX_STA(此寄存器其实就是一个全局
变量,由作者自行添加。由于它起到类似寄存器的功能,这里暂且称之为寄存器)"
USART_RX_STA 是 16 bits 的 register ...
但是,程序中卻沒有找到任何一個函數去寫 USART_RX_STA (應該是我找不到吧@@)
(當然他有被拿來讀取被用於 main() 及 USART1_IRQHandler() 裡判斷資料的傳遞完成)
我想知道的是
當有 data 寫入時或data接收完成标志
一定要有個函數去改變 USART_RX_STA 的值
例如
data 傳來 0X0D ,要有個函數去將 USART_RX_STA 的 bit14 改成 1
所以 if(USART_RX_STA&0x4000) 被用來判斷是否有接收到 0x0D
例如
data接收完成标志 bit15 改成 1 ,
所以接下來 if(USART_RX_STA&0x8000) 成為判斷是否有接收完 data 的一個邏輯判斷程序
那這負責個寫 USART_RX_STA 函數又是什麼? 他的動作機制又是如何?
其實,或許我的問題有些多餘吧
我只是想,如果我只知道 USART 的規範,而沒有這個教學程序
那我又如去規劃寫出 USART 程序出來?
又或許把 STM32 的 USART 當成 arduino 的 USART 用,反正傳個資料不用想那麼多是吧?!
無論如何,都感謝各位前輩的參與討論
謝謝大家
|
|