10.25
任务目标 // 进度:
- SIO,GPIO,WDT编程,编写程序操作SIO,GPIO,WDT,需实现GPIO输入输出,电压高低控制,看门狗需实现按分钟或秒重启系统。
- watcom
工作结果:
SIO:NCT6106D
学习笔记:
GPIO
逻辑设备7 GPIO0 GPIO1 GPIO2 GPIO3 GPIO4 GPIO5 GPIO6 GPIO7
逻辑设备8
逻辑设备9
输入模式:高阻抗;上拉;下拉
输出模式:开漏输出OD,推挽输出PP,开集输出OC
GPIO配置流程:
- 配置Pin引脚功能,复用为GPIO
- 选择对应Logical Device并激活对应GPIO功能
- 配置输入输出状态
- 设置输出状态(或读取输入状态)
WDT
时间:看门狗计数器的位数和系统时钟周期。
喂狗:在这个时间内,清零计数器。否则就会重启系统。
NCT6106D | ||
---|---|---|
WDT1 | 计数器 | 逻辑设备8,CR[F0h],位3 |
超时设备 | 逻辑设备8,CR[F1h],默认值4 | |
状态位 | 逻辑设备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位可编程超时计数器,控制和状态寄存器
8位最多计数256个
WDT1:GPIO0, GPIO2, GPIO3, GPIO5, GPIO6, GPIO7
计数:写0禁用计数器,写非零数,从此值开始向下计数。
超时:GPIO0 bit[1] [5], GPIO2 bit[3] [7], GPIO3 bit[1] [5], GPIO5 bit[0] [4], GPIO6 bit[7], GPIO7bit[0]触发100ms低脉冲。
写0清除状态位,LRESET#或PWROK#信号中断清除状态位。
访问:
1.间接访问:寄存器2E/2F间接访问,逻辑设备号和端口号
// 2E2F寄存器访问逻辑设备
#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); //counter
value=inp(data_port);
value1= (value | 0x02);
if (strcmp(argv[1],"-m")==0)
{
value2=(value1 | 0x08);
outp(data_port, value2);
outp(addr_port, 0xF1); //time-out
time_out= atoi(argv[2]);
outp(data_port, time_out);
outp(addr_port, 0xF2); //status bit
value=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-out
time_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");
}
else
printf("Missing Argument!\n");
return 0;
}
2.直接访问:WDT寄存器表直接访问,逻辑设备号
// 访问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 0x00
typedefunsigned 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
// 关闭SIO配置模式
Outportb(NCT6106_CONFIG_INDEX,NCT6106_CONFIG_MODE_EXIT_VALUE);//Exit SIO config Mode
Open Watcom
下载:https://dl.pconline.com.cn/download/1039481.html
环境变量:WATCOM,INCLUDE,LIB
SET WATCOM=C:\WATCOM
SET INCLUDE=C:\WATCOM\H
SET INCLUDE=C:\WATCOM\LIB286WATCOM=(OpenWatCOM)
Path=%Path%;%WATCOM%\binw
INCLUDE=%WATCOM%\H
LIB=%WATCOM%\lib286;%WATCOM%\lib286\dos
心情感悟:
解决问题时,直接搜索目的要比搜索步骤错误效率高得多。