10.25-sio

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配置流程:

  1. 配置Pin引脚功能,复用为GPIO
  2. 选择对应Logical Device并激活对应GPIO功能
  3. 配置输入输出状态
  4. 设置输出状态(或读取输入状态)

WDT

时间:看门狗计数器的位数和系统时钟周期。

喂狗:在这个时间内,清零计数器。否则就会重启系统。

NCT6106D
WDT1计数器逻辑设备8,CR[F0h],位3
超时设备逻辑设备8,CR[F1h],默认值4
状态位逻辑设备8,CR[F2h],位4
WDT2counterLogical Device D,CR[E2h]
the time-out valueLogical Device D,CR[E3h],bit[0]
status bitLogical 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\LIB286

WATCOM=(OpenWatCOM)
Path=%Path%;%WATCOM%\binw
INCLUDE=%WATCOM%\H
LIB=%WATCOM%\lib286;%WATCOM%\lib286\dos


GPIO输入与输出设置

SuperIo-Nct6106d

Open Watcom上手之一:安装篇

编译器介绍–OpenWatCOM

如何安装Open Watcom C / C ++开发系统

心情感悟:

解决问题时,直接搜索目的要比搜索步骤错误效率高得多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值