15、PIC32系列-输入捕捉ICAP
PIC32系列-輸入捕捉ICAP
1、PIC32參考資源
2、輸入捕捉簡介
3、狀態和寄存器
4、使用Harmony工具生成輸入捕捉代碼
5、實際代碼分析
6、實驗驗證
1、PIC32參考資源
PIC32系列參考手冊 中文版? 鏈接地址:PIC32系列參考手冊 第15章 輸入捕獲模塊
2、輸入捕捉簡介
輸入捕捉模塊用于在輸入引腳上發生事件時,捕捉來自兩個可選時基之一的定時器值。輸入捕捉功能在需要進行頻率(時間周期)和脈沖測量的應用中很有用。
輸入捕捉模塊有多種工作模式,可通過 ICxCON 寄存器進行選擇。
? 在 ICx 引腳輸入信號的每個下降沿捕捉定時器值
? 在 ICx 引腳輸入信號的每個上升沿捕捉定時器值
? 在 ICx 引腳輸入信號的每 4 個上升沿捕捉一次定時器值
? 在 ICx 引腳輸入信號的每 16 個上升沿捕捉一次定時器值
? 在 ICx 引腳輸入信號的每個上升沿和下降沿捕捉定時器值
? 先在指定邊沿,之后在每個邊沿捕捉定時器值
?輸入捕捉模塊都具有以下特殊功能寄存器
? ICxCON:輸入捕捉控制寄存器
? ICxBUF:輸入捕捉緩沖寄存器
還具有以下用于中斷控制的相關位
? 中斷允許控制位 (ICxIE)
? 中斷標志狀態位 (ICxIF)
? 中斷優先級控制位 (ICxIP)
? 中斷子優先級控制位 (ICxIS)
3、狀態和寄存器
寄存器匯總
?ICXCON:輸入捕捉X控制寄存器
?bit 15 ON:輸入捕捉模塊使能位
1 = 使能模塊
0 = 禁止并復位模塊、禁止時鐘、禁止中斷產生并允許進行 SFR 修改
bit 14 FRZ:調試模式凍結控制位
1 = 處于 Debug (調試)模式時模塊停止工作
0 = 處于 Debug (調試)模式時模塊不停止工作
注: FRZ 僅在調試異常模式下可寫,在正常模式下強制為 0。
bit 13 SIDL:空閑模式停止控制位
1 = 在 CPU Idle (空閑)模式下暫停工作
0 = 在 CPU Idle (空閑)模式下繼續工作
bit 12-10 未實現:讀為 0
bit 9 ICFEDGE :先捕捉邊沿選擇位 (僅在模式 6 下,即 ICM<2:0>= 110 時使用)
1 = 先捕捉上升沿
0 = 先捕捉下降沿
bit 8 ICC32:32 位捕捉選擇位
1 = 32 位定時器資源捕捉
0 = 16 位定時器資源捕捉
bit 7 ICTMR :定時器選擇位 (當 ICxC32 (ICxCON<8>)為 1 時,不會影響定時器選擇)
0 = Timer3 作為捕捉的計數器源
1 = Timer2 作為捕捉的計數器源
bit 6-5 ICI<1:0>: :中斷控制位
11 = 每 4 個捕捉事件中斷一次
10 = 每 3 個捕捉事件中斷一次
01 = 每 2 個捕捉事件中斷一次
00 = 每 1 個捕捉事件中斷一次
bit 4 ICOV:輸入捕捉溢出狀態標志位 (只讀)
1 = 發生了輸入捕捉溢出
0 = 未發生輸入捕捉溢出
bit 3 ICBNE: 輸入捕捉緩沖區非空狀態位 (只讀)
1 = 輸入捕捉緩沖區非空;至少可以再讀一個捕捉值
0 = 輸入捕捉緩沖區為空
bit 2-0 ICM<2:0>:輸入捕捉模式選擇位
111 = 僅中斷模式 (僅在處于 Sleep (休眠)或 Idle (空閑)模式時支持)
110 = 簡單捕捉事件模式——每個邊沿,先捕捉指定邊沿,之后捕捉每個邊沿
101 = 預分頻捕捉事件模式——每 16 個上升沿
100 = 預分頻捕捉事件模式——每 4 個上升沿
011 = 簡單捕捉事件模式——每個上升沿
010 = 簡單捕捉事件模式——每個下降沿
001 = 邊沿檢測模式——每個邊沿 (上升沿和下降沿)
000 = 捕捉禁止模式
ICXBUF:輸入捕捉 X 緩沖寄存器
?bit 31-0 ICxBUF<31:0>: 緩沖寄存器位
當前捕捉的輸入定時器計數的值。
定時器選擇
每個模塊可以選擇兩個 16 位定時器中的一個或一個 32 位定時器作為時基, 32 位定時器是由兩個 16 位定時器組合構成的。
16 位捕捉模式: ICTMR設置為 0 時選擇 Timer3 進行捕捉, ICTMR設置為1時選擇 Timer2 進行捕捉,
32 位捕捉模式: ICC32位1,Timer2 提供低 16 位, Timer3 提供高 16 位
輸入捕捉使能
將 ON 位(ICxCON<15>)置 1 可以使能輸入捕捉模塊。當該位清零時,模塊會復位。將模塊復位具有以下影響:
? 清零溢出條件標志
? 將 FIFO 復位為空狀態
? 復位事件計數 (用于中斷產生)
? 復位預分頻器計數
無論 ON 位 (ICxCON<15>)狀態如何,都允許讀寫寄存器。
輸入捕捉事件模式 ICM<2:0>
? 簡單捕捉事件模式:
- 在 ICx 引腳輸入信號的每個下降沿捕捉定時器值
- 在 ICx 引腳輸入信號的每個上升沿捕捉定時器值
- 在 ICx 引腳輸入信號的每個上升沿和下降沿捕捉定時器值,從指定邊沿開始捕捉
? 預分頻捕捉事件模式:
- 在 ICx 引腳輸入信號的每 4 個上升沿捕捉一次定時器值
- 在 ICx 引腳輸入信號的每 16 個上升沿捕捉一次定時器值
? 邊沿檢測模式
? 僅中斷模式
節能模式下的操作
休眠模式下的輸入捕捉操作
當器件進入 Sleep (休眠)模式時,外設時鐘被禁止。在 Sleep (休眠)模式下,輸入捕捉模塊只能用作外部中斷源。該模式可以通過設置 ICM<2:0> 控制位(ICxCON<2:0>)= 111 進行使能(對于僅中斷模式)。在該模式下,捕捉引腳的上升沿將使器件從休眠狀態喚醒。如果允許了相應的模塊中斷位,并且模塊優先級達到要求,將產生中斷。
如果輸入捕捉模塊被配置為除 ICM<2:0> = 111 以外的模式,并且器件進入 Sleep(休眠)模式,則外部引腳的任何上升沿或下降沿都不會產生從休眠模式喚醒條件。
空閑模式下的輸入捕捉操作
當器件進入 Idle (空閑)模式時,外設時鐘源保持工作,但 CPU 停止執行代碼。空閑模式停止控制位 SIDL (ICxCON<13>)決定模塊在 Idle (空閑)模式下是停止還是繼續工作。
器件從休眠或空閑模式喚醒
在使用僅中斷模式時,當器件處于 Sleep (休眠)或 Idle (空閑)模式時,輸入捕捉事件可將器件喚醒或產生中斷 (如果允許)。
4、使用Harmony工具生成輸入捕捉代碼
1、在Available Components中將ICAP1組件添加到右側的Project Graph中;
2、ICAP1組件初始化配置如下
3、添加定時器模塊
4、ICAP1模塊配置
5、定時器模塊配置
6、生成的代碼與原始代碼存在差異,需進行確認;
7、代碼生成后需要的操作;
????????1、系統初始化完成后添加ICAP以及定時器啟動函數;
????????2、添加應用層函數;
8、編譯運行將代碼燒錄到開發板中;點擊編譯按鈕,編譯提示BUILD SUCCESSFUL,點擊燒錄,提示Programming/Verify complete,通過串口觀察捕捉數據。
ICAP配置說明
?Select Input Capture Mode:輸入捕捉模式選擇,可選為如下模式
?Input Capture module is disabled 捕捉禁止模式
Edge Detect mode every edge(rising and falling)邊沿檢測模式,每個邊沿
Simple Capture Event mode every falling edge簡單捕捉模式,每個下降沿
Simple Capture Event mode every rising edge簡單捕捉模式,每個上升沿
Prescaled Capture Event mode every fourth rising edge預分頻捕捉事件模式,每4個上升沿;
Prescaled Capture Event mode every sixteenth rising edge預分頻捕捉事件模式,每16個上升沿;
Simple Capture Event mode every edge, specified edge first and every edge thereafter簡單捕捉事件模式,先捕捉指定邊沿,之后捕捉每個邊沿
Interrupt-Only mode(only supported while in Sleep mode or Idle mode)僅中斷模式,僅在處于Sleep或Idle模式時支持
Select Timer Source:定時器選擇,可選為TMR2或TMR3
Select Timer Width:定時器寬度選擇,可選為16位或32位定時器
Stop in IDLE:為空閑狀態停止
Enable Capture Interrupt:使能捕獲中斷
Enable Error Interrupt:使能錯誤中斷
5、實際代碼分析
plib_icap1.c
//輸入捕捉初始化 void ICAP1_Initialize (void) {/*Setup IC1CON *//*ICM = 1 */ //輸入捕捉模式選擇 001邊沿檢測模式,每個邊沿/*ICI = 0 */ //中斷控制位 00每個捕捉事件中斷一次/*ICTMR = 1 */ //定時器選擇 1定時器2/*C32 = 0 */ //32位捕捉選擇位 0 16位定時器資源捕捉/*FEDGE = 0 */ //先捕捉邊沿選擇位(僅在模式6下)/*SIDL = false */ //空閑模式停止控制位 0不停止工作IC1CON = 0x81; }//模塊使能 void ICAP1_Enable (void) {IC1CONSET = _IC1CON_ON_MASK; //輸入捕捉模塊使能 }//模塊禁止 void ICAP1_Disable (void) {IC1CONCLR = _IC1CON_ON_MASK; //禁止并復位模塊 }//讀取當前捕捉的輸入定時器計數值 uint16_t ICAP1_CaptureBufferRead (void) {return (uint16_t)IC1BUF; //輸入捕捉緩沖寄存器 }//輸入捕捉緩沖區非空狀態位讀取 bool ICAP1_CaptureStatusGet (void) {bool status = false;status = ((IC1CON >> ICAP_STATUS_BUFNOTEMPTY) & 0x1); //輸入捕捉緩沖區非空狀態位return status; }//讀取錯誤狀態 bool ICAP1_ErrorStatusGet (void) {bool status = false;status = ((IC1CON >> ICAP_STATUS_OVERFLOW) & 0x1); //輸入捕捉溢出狀態標志位return status; }定時器代碼參考前面章節,不贅述。
6、實驗驗證
編譯運行將代碼燒錄到開發板中;點擊編譯按鈕,編譯提示BUILD SUCCESSFUL,點擊燒錄,提示Programming/Verify complete,通過串口觀察發送輸入捕捉數據。
時間:2021.08.20
總結
以上是生活随笔為你收集整理的15、PIC32系列-输入捕捉ICAP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gif制作转换器免费推荐,动图制作什么软
- 下一篇: 微信小程序多次跳转后不能点_微信小程序运