請問"中斷"到底是如何發生,系統在哪時偵測到有中斷發生?

2019-07-20 23:49发布

本帖最后由 KCLin 于 2016-2-3 22:32 编辑

最近研讀到串口通訊實驗main() 程式
一開始是做各種初始化
然後while(1){
if(USART_RX_STA&0x8000)

{ ..... }
這段應該是說,有 data 進來
但是,是哪個程式去讀了關於 USART_RX_STA 的變化?
做了 Debug 實在是追不到!


又 在 usart.c 裡面
除了一些串口的初始化之外
還多了
void USART1_IRQHandler(void)  
{..........}
我大概知道,這個函數是要告訴系統,如果系統發生中斷,就來 run 這個函數
那麼,又是哪個程式負責呼叫他的?!
是不是這個函數,其中一個參數必須是 *USART1_IRQHandler
也就是傳遞中斷發生時觸發函數的 位置
(所以其實中斷觸發函數的名稱我們也可以隨意設定,只要把要做的函數位置正確傳遞即可?)

這是不是跟 USART_RX_STA 的變化有關?


新手,邏輯被搞得有些亂了
請各位前輩高手幫助解惑,感謝






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
ofourme
1楼-- · 2019-07-21 12:08
感觉沟通有点困难。
建议你先看看cortex-m3权威指南,还有你所用芯片的手册。楼主用的应该是ST公司的stm32f103吧?那么,

USART_RX_STA  所对应的内存地址应该在stm32f103手册里有说明的,在程序的头文件里面也是可以搜索到的。
至于说中断是调用哪个函数,这个也是芯片预先约定好的,发生中断后,硬件会将对应中断的特定地址的数据复制到程序计数器PC,也就是说程序将跳转到PC处执行。具体到你说的startup_stm32f40_41xxx.s,编译器会将这段程序链接到特定的位置,其中用DCD分配的位置正好就对应了硬件提取的对应中断的地址。如果你将DCD  USART1_IRQHandler改为 DCD USARTxxx,那么,你的中断函数名字也必须改为USARTxxx,否则编译器会提示报错说找不到这个函数。
最后,建议楼下还是先去看看cortex-m3权威指南。
KCLin
2楼-- · 2019-07-21 16:06
本帖最后由 KCLin 于 2016-2-4 12:01 编辑

以下是"原子探索者" 官方教材  " STM32F4 开发指南(库函数版)  " 寫的
",一个接收状态寄存器 USART_RX_STA(此寄存器其实就是一个全局
变量,由作者自行添加。由于它起到类似寄存器的功能,这里暂且称之为寄存器)"
原子官方教材也說明,USART_RX_STA是個 "全局变量" 暂且称之为寄存器


另外,在探索者 F407 對應的STM官方參考手冊 "RM0090 Reference manual" 1010 頁,USART register map
也沒有記載關於 USART_RX_STA
甚至,對RM0090 Reference manual 搜尋,也不會發現 SART_RX_STA
至於頭文件內容是這樣


至於 m3 有沒有,那我就不知道了,畢竟我用的是 F104 不是 103
或許有空我再去找找看

感謝您的參與討論


ricefat
3楼-- · 2019-07-21 21:18
中断是硬件响应,产生中断后由硬件引导到相应中断响应函数,即你看到的handler
ricefat
4楼-- · 2019-07-22 03:10
 精彩回答 2  元偷偷看……
ricefat
5楼-- · 2019-07-22 08:07
中断是硬件响应,产生中断后由硬件引导到相应中断响应函数,即你看到的handler
ricefat
6楼-- · 2019-07-22 09:10
中断是硬件响应,产生中断后由硬件引导到相应中断响应函数,即你看到的handler

一周热门 更多>