10.25-sio
10.25
任務目標 // 進度:
- SIO,GPIO,WDT編程,編寫程序操作SIO,GPIO,WDT,需實現(xiàn)GPIO輸入輸出,電壓高低控制,看門狗需實現(xiàn)按分鐘或秒重啟系統(tǒng)。
- watcom
工作結(jié)果:
SIO:NCT6106D
學習筆記:
GPIO
邏輯設(shè)備7 GPIO0 GPIO1 GPIO2 GPIO3 GPIO4 GPIO5 GPIO6 GPIO7
邏輯設(shè)備8
邏輯設(shè)備9
輸入模式:高阻抗;上拉;下拉
輸出模式:開漏輸出OD,推挽輸出PP,開集輸出OC
GPIO配置流程:
WDT
時間:看門狗計數(shù)器的位數(shù)和系統(tǒng)時鐘周期。
喂狗:在這個時間內(nèi),清零計數(shù)器。否則就會重啟系統(tǒng)。
| WDT1 | 計數(shù)器 | 邏輯設(shè)備8,CR[F0h],位3 |
| 超時設(shè)備 | 邏輯設(shè)備8,CR[F1h],默認值4 | |
| 狀態(tài)位 | 邏輯設(shè)備8,CR[F2h],位4 | |
| WDT2 | counter | Logical Device D,CR[E2h] |
| the time-out value | Logical Device D,CR[E3h],bit[0] | |
| status bit | Logical Device D,CR[E4h],bit[7] |
包括:8位可編程超時計數(shù)器,控制和狀態(tài)寄存器
? 8位最多計數(shù)256個
WDT1:GPIO0, GPIO2, GPIO3, GPIO5, GPIO6, GPIO7
計數(shù):寫0禁用計數(shù)器,寫非零數(shù),從此值開始向下計數(shù)。
超時:GPIO0 bit[1] [5], GPIO2 bit[3] [7], GPIO3 bit[1] [5], GPIO5 bit[0] [4], GPIO6 bit[7], GPIO7bit[0]觸發(fā)100ms低脈沖。
寫0清除狀態(tài)位,LRESET#或PWROK#信號中斷清除狀態(tài)位。
訪問:
1.間接訪問:寄存器2E/2F間接訪問,邏輯設(shè)備號和端口號
// 2E2F寄存器訪問邏輯設(shè)備 #include<stdio.h> #include<stdlib.h> #include<dos.h> #include<conio.h>int main(int argc, char *argv[]){unsigned char value,value1,value2;unsigned char addr_port =0x2E;unsigned char data_port=0x2F;int time_out;if (argc==3){outp(addr_port, 0x87);outp(addr_port, 0x87);outp(addr_port, 0x07);outp(data_port, 0x08);outp(addr_port, 0x30);outp(data_port, 0x01);outp(addr_port, 0xF0); //countervalue=inp(data_port);value1= (value | 0x02);if (strcmp(argv[1],"-m")==0){value2=(value1 | 0x08);outp(data_port, value2);outp(addr_port, 0xF1); //time-outtime_out= atoi(argv[2]);outp(data_port, time_out);outp(addr_port, 0xF2); //status bitvalue=inp(data_port);valuel=(value | 0x40);outp(data_port, value1);outp(addr_port, 0xAA);}else if (strcmp(argy[1],"-s")==0){value2=(valuel & 0xF7); outp(data_port, value2);outp(addr_port, 0xF1); //time-outtime_out= atoi(argv[2]);outp(data_port, time_out);outp(addr_port, 0xF2); //status bit value=inp(data_port);value1=(value | 0x40);outp(data_port, value1);outp(addr_port, 0xAA);}else printf("Argument Error!\n");}elseprintf("Missing Argument!\n");return 0;}2.直接訪問:WDT寄存器表直接訪問,邏輯設(shè)備號
// 訪問WDT寄存器IObase #define BITO 0x01 #define BIT1 0x02 #define BIT2 0x04 #define BIT3 0x08 #define BIT4 0x10 #define BIT5 0x20 #define BIT6 0x40 #define BIT7 0x80 #define NCT6106_CONFIG_INDEX 0x2E #define NCT6106_CONFIG_DATA 0x2F #define NCT6106_LDN_SEL_REGISTER 0x07 #define NCT6106_ACTIVATE_REGISTER 0x30 #define NCT6106_BASE1_HI_REGISTER 0x60 #define NCT6106_BASE1_LO_REGISTER 0x61 #define NCT6106_LDN_WDT 0x08 #define NCT6106_WDT_CONTROL_REGISTER 0xF5 #define NCT6106_WDT_TIMER_COUNTER_REGISTER 0xF6 #define NCT6106_CONFIG_MODE_ENTER_VALUE 0x87 #define NCT6106_CONFIG_MODE_EXIT_VALUE 0хAA #define WDT_ACTIVE 0x01 #define WDT_TIMER_MODE_MINIUTE 0x08 #define WDT_TIMER_MODE_SECOND 0x00typedefunsigned char UINT8; typedefunsigned int UINT16; UINT8 RetVar =0; UINT8 TimeValue; // 0<TimeValue<=OxFF UINT8 TimeMode; UINT16 WdtloBase; Outportb(NCT6106_CONFIG_INDEX, NCT6106_CONFIG_MODE_ENTER_VALUE);//Enter SIO config mode out 0x2E,0x87 Outportb(NCT6106_CONFIG_INDEX, NCT6106_CONFIG_MODE_ENTER_VALUE);//Enter SIO config mode out 0x2E,0x87 Outportb(NCT6106_CONFIG_INDEX, NCT6106_LDN_SEL_REGISTER);//Set LDN Select value out 0x2E, 0x07 Outportb(NCT6106_CONFIG_DATA, NCT6106_LDN_WDT);//Select WDT device out 0x2F,0x08 Outportb(NCT6106_CONFIG_INDEX, NCT6106_ACTIVATE_REGISTER);//Select WDT CRE30 out 0x2E,0x30 RetVar=Inportb(NCT6106_CONFIG_DATA);// Get the current value of LDN Ox8 CRE 0x30 in Ox2F,0x30 Outportb(NCT6106_CONFIG_DATA,(RetVar | WDT_ACTIVE));//Setup the BitO to enable WDT out Ox2F, (RetVar | WDT_ACTIVE) Outportb(NCT6106_CONFIG_INDEX, NCT6106_BASE1_HI REGISTER);//Select WDT CRE60 out 0x2E,0x60 WdtIoBase=(UINT16) Inportb(NCT6106_CONFIG_DATA);// Get the High Byte Value of 0x60 Outportb(NCT6106_CONFIG_INDEX, NCT6106_BASE1_LO_REGISTER);//Select WDT CRE61 out 0x2E,0x61 WdtIoBase=(UINT16) (WdtIoBase <<8) | Inportb(NCT6106_CONFIG_DATA);// Get the Low Byte Value of 0x61 // 配置WDT按分或秒計時: ReVar= Inportb(WdtIoBase + 0x05);//Get the current value of wdtmode register If (WDT_TIMER_MODE_SECOND == TimeMode)// Set the Time Mode bit and enable reset {Outportb(WdtIoBase + 0x05, (RetVar &(~BIT3) | BIT1); } /* If (WDT_TIMER_MODE_MINIUTE == TimeMode)// Set the Time Mode bit and enable reset {Outportb(WdtIoBase + 0x05, (RetVar | BIT3 | BIT1); } */ // 啟動/停止WDT Outportb(WdtIoBase + 0x06,TimeValue);//Set the time value to wdttim register Outportb(WdtIoBase + 0x06,0x00);//Write 00 to wdttim register to Clear the Value // 關(guān)閉SIO配置模式 Outportb(NCT6106_CONFIG_INDEX,NCT6106_CONFIG_MODE_EXIT_VALUE);//Exit SIO config ModeOpen Watcom
下載:https://dl.pconline.com.cn/download/1039481.html
環(huán)境變量:WATCOM,INCLUDE,LIB
SET WATCOM=C:\WATCOM
SET INCLUDE=C:\WATCOM\H
SET INCLUDE=C:\WATCOM\LIB286
WATCOM=(OpenWatCOM)
Path=%Path%;%WATCOM%\binw
INCLUDE=%WATCOM%\H
LIB=%WATCOM%\lib286;%WATCOM%\lib286\dos
GPIO輸入與輸出設(shè)置
SuperIo-Nct6106d
Open Watcom上手之一:安裝篇
編譯器介紹–OpenWatCOM
如何安裝Open Watcom C / C ++開發(fā)系統(tǒng)
心情感悟:
解決問題時,直接搜索目的要比搜索步驟錯誤效率高得多。
總結(jié)
- 上一篇: linux 查找pcre源码,pcre使
- 下一篇: 关于html中锚点功能的使用