OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6738|回复: 14

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

[复制链接]

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
发表于 2016-2-3 22:28:34 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 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 的變化有關?


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






最佳答案

查看完整内容[请看2#楼]

中断是硬件响应,产生中断后由硬件引导到相应中断响应函数,即你看到的handler
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-2-3 22:28:35 来自手机 | 显示全部楼层
中断是硬件响应,产生中断后由硬件引导到相应中断响应函数,即你看到的handler
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-2-3 22:53:45 | 显示全部楼层
1、先告诉你一个方法:
在工程文件中搜索 USART_RX_STA,然后查看每个句子,就能找到修改这个变量的地方。

2、没做过这个实验,估计就是在USART1_IRQHandler修改的。

3、谁调用的USART1_IRQHandler,
这是硬件机制,一般而言,有中断到来时,CPU无论进行到何处都会立刻放下当前的工作,硬件自动调用USART1_IRQHandler函数。
所有中断都是如此。
你先这么认为吧,以后再了解中断优先级的内容。


回复

使用道具 举报

2

主题

686

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
10566
金钱
10566
注册时间
2014-6-12
在线时间
1022 小时
发表于 2016-2-3 23:00:17 | 显示全部楼层
问的有点乱但一句话当串口收完一个字节如果你允许中断话就会触发硬件逻辑调用中断函数,你是Debug 不到硬件逻辑里去。
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
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 用,反正傳個資料不用想那麼多是吧?!

無論如何,都感謝各位前輩的參與討論
謝謝大家




                                    
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2016-2-4 01:09:14 来自手机 | 显示全部楼层
程序分两种,一种是我们程序员编写的代码,另外一种是固化在CPU及外部设备里面的硬件逻辑,这些硬件逻辑我们程序员是看不到的,是在设计、刻录晶元半导体的时候就确定好的了。USART_RX_STA 属于串口外部设备所实用的一个寄存器,由串口设备这个硬件自动修改状态,我们程序员只需要编写程序去查询它的状态就行了。同理,中断函数也是由硬件自己调用的,我们也看不到这个过程。

这位朋友没有学过计算机原理吗,这么会问这么奇怪的问题?
回复

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2016-2-4 08:40:40 | 显示全部楼层
本帖最后由 KCLin 于 2016-2-4 08:48 编辑

感謝樓上的指教
我只是想知道,怎樣從"無"到有

如果現在沒有這個例子,我們怎樣知道中斷是調用哪個函數?
就像時鐘是硬件設計本來就安排好的,但是,怎樣的外設,用哪個時鐘,我們是可以查到的
所以我會知道,不用去做一個時鐘,我也知道,如果想要某個頻率,我要怎樣調用函數,設定 presacle

另外,根據"開發指南"
USART_RX_STA  是作者自行添加
在 reference manual 裡面, 關於 USART 的 register 我並沒有查到 USART_RX_STA  的存在
USART_RX_STA  
他一定有連接到某些固件的 "intrinsic register" (例如 USART_CR1)
知道如何連結後,如果沒有 USART_RX_STA
也能有邏輯知道,我應該調用那個 intrinsic register
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2016-2-4 09:17:11 来自手机 | 显示全部楼层
感觉沟通有点困难。
建议你先看看cortex-m3权威指南,还有你所用芯片的手册。楼主用的应该是ST公司的stm32f103吧?那么,

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

使用道具 举报

18

主题

77

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-15
在线时间
49 小时
 楼主| 发表于 2016-2-4 11:52:25 | 显示全部楼层
本帖最后由 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
或許有空我再去找找看

感謝您的參與討論


USART_RX_STA.JPG
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-2-4 12:32:17 来自手机 | 显示全部楼层
中断是硬件响应,产生中断后由硬件引导到相应中断响应函数,即你看到的handler
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-2-4 12:32:52 来自手机 | 显示全部楼层
中断是硬件响应,产生中断后由硬件引导到相应中断响应函数,即你看到的handler
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-2-4 12:32:52 来自手机 | 显示全部楼层
中断是硬件响应,产生中断后由硬件引导到相应中断响应函数,即你看到的handler
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-2-4 12:32:53 来自手机 | 显示全部楼层
中断是硬件响应,产生中断后由硬件引导到相应中断响应函数,即你看到的handler
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-2-4 12:33:55 来自手机 | 显示全部楼层
手抖~
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
7952
金钱
7952
注册时间
2014-8-13
在线时间
1590 小时
发表于 2016-2-7 16:29:05 | 显示全部楼层
中断机制:系统发生中断(硬中断。软中断估计有操作系统部署实现),
1、CPU会立刻保护现场(将所有寄存器的数值被CPU保存,这个在软件、调试器、编译器之类所有软件都看不到,如果想知道怎么保存的,解剖一个CPU吧。这个是硬件实现的)。
2、你在编写中断函数的时候,编译器会将你的中断函数的地址A放到特定的地址B。地址B就是硬件在设计的时候专门给中断留的地址。也就是说,中断发生的时候,地址B中的内容就会被执行。如果地址B放的是中断函数C的地址,那么中断就执行C。这个是编译器做好了的,如果深翻头文件或者.s文件,估计能找出地址B的值。同样的,如果你在跟踪调试的时候,中断发生了,PC寄存器中的值莫名其妙的就变成了地址A了,软件上根本不清楚怎么会这样,这是因为这个动作是由硬件执行的。

上面是我个人的理解,凑活着看吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表