目录
1、主要特性
CPU | 8bit基于EEPROM RISC (2T or 4T) 16MHz/2T (VDD>2.7V) |
存储 | PROGRAM:6k x 14bit RAM:616 x 8bit DATA:128 x 8bit |
ADC | 12bit分辨率 26+1通道 参考电压(内部参考电压+外部参考电压) 自动阈值比较和中断 |
PWM | 4路同周期,独立占空比 1路具有死区的互补输出通道 自动故障刹车 单脉冲模式 蜂鸣器模式(50%占空比) 支持SLEEP模式下运行 |
定时器 | WDT(16bit):7bit后分频 Timer0(8bit):8bit预分频 Timer1(12bit) Timer2(16bit):4bit预分频和后分频 Timer3(8bit) 支持SLEEP模式下运行 |
TOUCH | 25个触摸按键 |
通信接口 | IIC SPI UART |
GPIO | 26个IO 支持源电流、灌电流 上下拉电阻 支持开漏 8个IO中断/唤醒 |
电源管理 | SLEEP LVD LVR |
系统时钟 | HIRC:16MHz LIRC:32KHz(256KHz) 外部时钟:EC/LP/XT |
2、系统结构框图
3、FT62FC6引脚分布
4、IO端口
FT62FC6x系列最多26个IO引脚。分为四组:PORTA、PORTB、PORTC、PORTD。所有IO引脚都具有数字输入、数字输出、弱上拉、弱下拉、开漏功能。
//========================
//IO口的配置
//========================
void GPIO_InitConfig(void)
{
//1.选择系统时钟源
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系统时钟为内部振荡器
//Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
//2.暂禁止所有中断
INTCON = 0;
//3.IO配置
PORTA = 0B00000000;
TRISA = 0B11101111; //PA输入输出 0-输出 1-输入
PORTB = 0B00000000;
TRISB = 0B11101111; //PB输入输出 0-输出 1-输入
PORTC = 0B00000000;
TRISC = 0B11111111; //PC输入输出 0-输出 1-输入
PORTD = 0B00000000;
TRISD = 0B11111111; //PD输入输出 0-输出 1-输入
MSCON1 |=0x02; //AUXPGE=1,翻页到BANK4-7
WPUA = 0B00000100; //PA端口上拉控制 1-开上拉 0-关上拉
WPUB = 0B00000100; //PB端口上拉控制 1-开上拉 0-关上拉
WPUC = 0B00000100; //PC端口上拉控制 1-开上拉 0-关上拉
WPUD = 0B00000000; //PD端口上拉控制 1-开上拉 0-关上拉
WPDA = 0B00000000; //PA端口下拉控制 1-开上拉 0-关上拉
WPDB = 0B00000000; //PB端口下拉控制 1-开上拉 0-关上拉
WPDC = 0B00000000; //PC端口下拉控制 1-开上拉 0-关上拉
WPDD = 0B00000000; //PD端口下拉控制 1-开上拉 0-关上拉
ODCONA = 0B00000000; //PORTA开漏
ODCONB = 0B00000000; //PORTA开漏
ODCONC = 0B00000000; //PORTA开漏
ODCOND = 0B00000000; //PORTA开漏
//4.电源管理
PSRCAL = 0B00000000; //源电流设置
PSRCAH = 0B00000000;
PSRCBL = 0B00000000;
PSRCBH = 0B00000000;
PSRCCL = 0B00000000;
PSRCCH = 0B00000000;
PSRCDL = 0B00000000;
PSRCDH = 0B00000000;
PSINKA = 0B00000000; //灌电流设置
PSINKB = 0B00000000;
PSINKC = 0B00000000;
PSINKD = 0B00000000;
//5.端口变化
IOCA = 0B00000000; //端口变化中断
//6.模拟输入
ANSEL0 = 0B00000000; //模拟输入
ANSEL1 = 0B00000000;
ANSEL2 = 0B00000000;
AMSEL3 = 0B00000000;
//7.WDT与T0分频电路匹配
MSCON1 &=0xFD; //AUXPGE=0,翻页到BANK0-3
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit7(PAPU)=0 ENABLED PULL UP PA
}
5、复位系统
(1)上电复位(POR)
上电过程,即 V
DD
从低于
Power-On-Reset
电压
(V
POR
)
上升至高于
V
POR
的过程。当
CPU
重新上电时,VDD
可能没有完全掉电至
0V。
- 当 VDD低于 VPOR时,CPU 处于完全复位状态
- 当 VDD上升至 VPOR 以上时,芯片开始初始化配置(BOOT)过程
- 初始化配置完成后,指令将从 PC = 0x00 地址开始执行。
注意:VPOR不可配置;POR 的硬件电路默认为开启状态,当 VDD 电压低于 VPOR时即执行芯片电源复位,而不是仅在上电时执行。
(2)系统复位
与 POR
不同,
系统复位(system reset) 并不会完全复位
。系统复位时,
CPU
是否启动初始化配置过程 则取决于复位触发类型。若启动初始化配置则空闲等待~8ms
,然后重新加载初始化配置寄存器值,如果 使能 PWRT
将额外延时
~64ms
,随后系统正常启动。
(3)低电压复位(BOR/LVR)
欠压复位 (BOR / LVR) – 总会启动初始化配置。
当 V
DD
值降低并低于预设的欠压值
(V
BOR
)
超过
T
BOR
时间时,就会出现欠压状态。消抖时间
T
BOR
大概为 3
到
4
个
LIRC
或
HIRC
时钟周期。
当 V
DD
≤ V
BOR
时,
CPU
保持系统复位状态,直至
V
DD
> V
BOR
时
CPU
开始初始化配置过 程(BOOT)。
注意:VPOR 值不能配置,而 VBOR 值可以设置为 2.0、2.2、2.5、2.8、3.1、3.6、4.1V。
(4)非法指令复位
非法指令复位 –
如果使能
“IRBTE” 则启动初始化配置。CPU
获取指令错误的原因有很多,最常见的为干扰和
V
DD
不稳定。
(5)看门狗复位
SLEEP 模式下,WDT 溢出将导致唤醒。
正常模式 (
非
SLEEP
模式
)
下,
WDT
溢出将触发系统复位,随后是否产生初始化配置则取决于
IDE
设置。
如果 CPU 处于非 SLEEP 状态且使能 “WDTBTE” 则启动初始化置。
#include "SYSCFG.h"
void POWER_INITIAL(void)
{
OSCCON = 0B01110001;
OPTION = 0B00000000;
INTCON = 0B00000000;
TRISA = 0B00000000;
TRISB = 0B00000000;
TRISC = 0B00000000;
TRISD = 0B00000000;
PORTA = 0B00000000;
PORTB = 0B00000000;
PORTC = 0B00000000;
PORTD = 0B00000000;
WPUA = 0B00000000;
WPUB = 0B00000000;
WPUC = 0B00000000;
WPUD = 0B00000000;
WPDA = 0B00000000;
WPDB = 0B00000000;
WPDC = 0B00000000;
WPDD = 0B00000000;
ANSEL0 = 0B00000000;
ANSEL1 = 0B00000000;
ANSEL2 = 0B00000000;
ANSEL3 = 0B00000000;
PSRCAL = 0B00000000;
PSRCAH = 0B00000000;
PSRCBL = 0B00000000;
PSRCBH = 0B00000000;
PSRCCL = 0B00000000;
PSRCCH = 0B00000000;
PSRCDL = 0B00000000;
PSRCDH = 0B00000000;
PSINKA = 0B00000000;
PSINKB = 0B00000000;
PSINKC = 0B00000000;
PSINKD = 0B00000000;
IOCA = 0B00000000;
}
void Delay_us(unsigned int nus)
{
unsigned char t;
while(nus--)
{
NOP();
}
}
void Delay_ms(unsigned char nms)
{
unsigned char t;
while(nms--)
{
for(t=0;t<5;t++)
{
Delay_us(197);
}
}
}
//定时时间=(1024*1)/32000=0.032us=32ms
void WDT_INITINAL(void)
{
CLRWDT(); //清看门狗
OPTION &= ~(0x01<<3) ;
WDTCON = 0B00001010;
//Bit[6:5] WDT时钟源 00=LIRC
//Bit[4:1] WDT周期 0101=1024
//PS=000=1:1
}
void interrupt ISR(void)
{
}
void main()
{
Delay_ms(20);
POWER_INITIAL();
WDT_INITINAL();
PA0 = 1;
Delay_ms(250);Delay_ms(250);
Delay_ms(250);Delay_ms(250);
PA0 = 0;
Delay_ms(250);Delay_ms(250);
Delay_ms(250);Delay_ms(250);
while(1)
{
CLRWDT(); //清看门狗
PA0 = 1;
Delay_ms(250);
PA0 = 0;
Delay_ms(250);
}
}
(6)外部IO复位
外部 I/O
复位
(/MCLRB) –
如果使能
“MRBTE”
则启动初始化配置。那么可通过在/MCLRB (PB2)脚上施加低电压来使
CPU
复位。
(7)复位电路结构图

6、低电压检测
- 所有控制位和参数选择位均由用户指令设置,而不是初始化配置时;
- 必须正确设置 I/O:TRISx = 1; ANSELAx = 1;
- LVD 事件将置位 LVDW 而不是/BOR;
- 可通过指令配置为中断,且不会触发系统复位;
- 可通过 LVDDEB 使能消抖功能。消抖时间(TLVD) 为 3 – 4x 消抖时钟 LVDCKS (如果未预先启动,所 选时钟源将自动开启);
- LVD 输入可以配置成 VDD或其他 2 个 I/O,后者允许将 LVD 当作单输入比较器功能使用,与 9 档 LVDL 电压值(VLVD-REF) 之一进行比较;
- 可设置 LVD 的极性,因此 LVD 可作为 VLVD-REF的 “高” 或 “低” 比较器;
- 9 档可选 LVD 电压(LVDL),可通过指令实现~2%/step 的微调精度;
//设置LVD检测VDD电?
//当VDD大于LVD选择值时,DemoPortOut输出LOW,
//当VDD小于LVD选择值时,DemoPortOut输出HIGH.
#include "SYSCFG.h"
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define DemoPortOut PB0
void DelayUs(unchar Time);
void interrupt ISR(void)
{
}
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系统时钟为内部振荡器
//Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
INTCON = 0; //暂禁止所有中断
PORTA = 0B00000000;
TRISA = 0B11111110; //PA输入输出 0-输出 1-输入
PORTB = 0B00000000;
TRISB = 0B11111111; //PB输入输出 0-输出 1-输入
PORTC = 0B00000000;
TRISC = 0B11111111; //PC输入输出 0-输出 1-输入
PORTD = 0B00000000;
TRISD = 0B11111111; //PD输入输出 0-输出 1-输入
MSCON1 |=0x02; //AUXPGE=1,翻页到BANK4-7
WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉
WPUB = 0B00000000; //PB端口上拉控制 1-开上拉 0-关上拉
WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉
WPUD = 0B00000000; //PD端口上拉控制 1-开上拉 0-关上拉
MSCON1 &=0xFD; //AUXPGE=0,翻页到BANK0-3
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit7(PAPU)=0 ENABLED PULL UP PA
MSCON0 = 0B00000000;
//BIT5:ROMLPE 低功耗模式选择 1-开启低功耗 0-正常功耗模式(只能1MHZ以下的PROM读速度才可以开启)
//BIT4:CLKOS CLKO信号映射管脚控制 1-CLKO功能映射到PD5 0-CLKO功能映射到PA2
//BIT3:软件控制LVR使能位 UCFG1<1:0>为01时此位有意义。0:禁止LVR;1:打开LVR
//BIT2:快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//BIT1:0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//BIT0:0:T2CK睡眠时停止工作:1: T2CK睡眠时保持工作。当T2时钟不是选择指令时钟时,睡眠状态T2CK的运行控制位
PCON = 0B01110011;
//bit7~bit4 低电压侦测选择位。 0000 1.8v /0001 2.0v /0010 2.4v /0011 2.7v /0100 3.0v/0101 3.3v/0110 3.6v/0111 4.0v/1xxx 1.2v
//bit3 低电压侦测使能。 1:开启LVD侦测功能,0:关闭
//bit2 低电压标志位,只读。 1:VDD掉了设置电压以下,0:VDD正常 搭配LVDP选择比较的方向
//bit1 上电复位标志,低有效。0:发生了上电复位,1:没有发生
//bit0 低电压复位标志,低有效。0:发生了低电压复位 1-未发生
MSCON1 |=0x02; //AUXPGE=1,翻页到BANK4-7
LVDCON0=0B00001001;
//BIT7:SYSON 睡眠时系统时钟的控制 1-睡眠时保持运行 0-睡眠时关闭
//BIT6-5:LVDCKS LVD去抖时钟选择位 00-LIRC 01-HIRC 10-Fsys 11-Fcpu
//BIT4:LVDP LVDW标志位含义 1-VDD高于LVD 0-VDD小于LVD
//bit3 1经过去抖 0不经过去抖
//BIT2..0:LVD检测源选择 x00-PB3 x01-VDD x1x-Touch
MSCON1 &=0xFD; //AUXPGE=0,翻页到BANK0-3
}
void DelayUs(unsigned char Time)
{
unsigned char a;
for(a=0;a<Time;a++)
{
NOP();
}
}
void DelayMs(unsigned char Time)
{
unsigned char a,b;
for(a=0;a<Time;a++)
{
for(b=0;b<5;b++)
{
DelayUs(197); //快1%
}
}
}
void DelayS(unsigned char Time)
{
unsigned char a,b;
for(a=0;a<Time;a++)
{
for(b=0;b<10;b++)
{
DelayMs(100);
}
}
}
void main(void)
{
DelayMs(20); //等待上电稳定
POWER_INITIAL(); //系统初始化
PCON |= 0B00001000; //开启LVD侦测功能 LVDEN
DelayMs(5); //延时等待LVD开启
while(1)
{
if(PCON&0x04) //判断低电压标志位 LVDW
{
DemoPortOut = 1; //侦测到低电压标志为1
}
else
{
DemoPortOut = 0;
}
}
}
7、时钟系统
- 内部时钟:HIRC=16MHz LIRC=32KHz
- 外部时钟:EC/LP/XT
8、低功耗
(1)SLEEP
睡眠模式下,指令时钟关闭,指令执行停止,大多数模块掉电以降低功耗。CPU
通过执行
SLEEP 指令
进入睡眠模式。
(2)PROM
为了进一步降低 PROM
功耗, 可通过使能 ROMLPE
来让
CPU
进入低功耗模式。此低功耗模式仅适用于
SysClk
选择
LIRC (32 kHz)
, 此时工作电流为 ~ 15 μA。
9、中断
(1)非外设中断
- Timer0溢出
- INT(上升沿或下降沿中断)
- PORTA端口变化中断(软件控制)
//INT中断Demo
#include "SYSCFG.h";
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define DemoPortOut PB4
unchar FCount =0;
unchar flag =0;
void interrupt ISR(void)
{
if(INTF)
{
INTF =0;
INTE =0;
flag = 1;
}
}
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系统时钟为内部振荡器
//Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
INTCON = 0; //暂禁止所有中断
PORTA = 0B00000000;
TRISA = 0B11111111; //PA输入输出 0-输出 1-输入
PORTB = 0B00000000;
TRISB = 0B11101111; //PB输入输出 0-输出 1-输入
PORTC = 0B00000000;
TRISC = 0B11111111; //PC输入输出 0-输出 1-输入
PORTD = 0B00000000;
TRISD = 0B11111111; //PD输入输出 0-输出 1-输入
MSCON1 |=0x02; //AUXPGE=1,翻页到BANK4-7
WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉
WPUB = 0B00000000; //PB端口上拉控制 1-开上拉 0-关上拉
WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉
WPUD = 0B00000000; //PD端口上拉控制 1-使能 0-禁止
WPDA = 0B00000000; //PA端口下拉控制 1-使能 0-禁止
WPDB = 0B00000000; //PB端口下拉控制 1-使能 0-禁止
WPDC = 0B00010000; //PC端口下拉控制 1-使能 0-禁止
WPDD = 0B00000000; //PD端口下拉控制 1-使能 0-禁止
//端口源电流大小设置,相邻2位共同控制电流大小,00-3ma 01/10-6ma 11-24ma
//PSRCxL:控制相应端口低4位电流大小
//PSRCxH:控制相应端口高4位电流大小
PSRCAL = 0x55;
PSRCAH = 0x55; //设置PA口源电流大小 6ma
PSRCBL = 0x55;
PSRCBH = 0x55; //设置PB口源电流大小 6ma
PSRCCL = 0x55;
PSRCCH = 0x55; //设置PC口源电流大小 6ma
PSRCDL = 0x55;
PSRCDH = 0x55; //设置PD口源电流大小 6ma
MSCON1 &=0xFD; //AUXPGE=0,翻页到BANK0-3
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit7(PAPU)=0 ENABLED PULL UP PA
MSCON0 = 0B00000000;
//BIT5:ROMLPE 低功耗模式选择 1-开启低功耗 0-正常功耗模式(只能1MHZ以下的PROM读速度才可以开启)
//BIT4:CLKOS CLKO信号映射管脚控制 1-CLKO功能映射到PD5 0-CLKO功能映射到PA2
//BIT3:软件控制LVR使能位 UCFG1<1:0>为01时此位有意义。0:禁止LVR;1:打开LVR
//BIT2:快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//BIT1:0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//BIT0:0:T2CK睡眠时停止工作:1: T2CK睡眠时保持工作。当T2时钟不是选择指令时钟时,睡眠状态T2CK的运行控制位
}
void INT_INITIAL(void)
{
INTF =0; //清INT中断标志位
INTE =1; //使能INT中断
OPTION |=0x40; //bit6 INTEDG:中断沿选择位 1-INT引脚上升沿中断 0-INT引脚下降沿中断
MSCON1 |=0x02; //AUXPGE=1,翻页到BANK4-7
COMAF1 |=0B11000000;
//bit7..6 INTPO:INT/BKIN沿中断管脚映射选择位 0X-PD4 10-PD2 11-PC4
MSCON1 &=0xFD; //AUXPGE=0,翻页到BANK0-3
}
void main(void)
{
DelayMs(20); //等待上电稳
POWER_INITIAL(); //系统初始化
INT_INITIAL(); //初始化外部中断
GIE = 1;
while(1)
{
if(flag)
{
flag = 0;
for(FCount=0;FCount<20;FCount++) //输出N次波形
{
DemoPortOut = 1;
DelayMs(10); //10ms
DemoPortOut = 0;
DelayMs(10);
}
INTF = 0;
INTE = 1;
}
}
}
//Timer0中断
//DemoPortOut输出60Hz占空比50%的波形-Timer0实现
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define DemoPortOut PB4
void interrupt ISR(void)
{
//定时器0的中断处理
if(T0IE && T0IF) //8.192ms翻转一次≈60Hz
{
T0IF = 0;
DemoPortOut = ~DemoPortOut; //翻转电平
}
}
void DelayUs(unsigned char Time)
{
unsigned char a;
for(a=0;a<Time;a++)
{
NOP();
}
}
void DelayMs(unsigned char Time)
{
unsigned char a,b;
for(a=0;a<Time;a++)
{
for(b=0;b<5;b++)
{
DelayUs(197);
}
}
}
void POWER_INITIAL (void)
{
OSCCON = 0B01110001;
INTCON = 0; //暂禁止所有中断
PORTA = 0B00000000;
TRISA = 0B11111111; //PA输入输出 0-输出 1-输入
PORTB = 0B00000000;
TRISB = 0B11101111; //PB输入输出 0-输出 1-输入
PORTC = 0B00000000;
TRISC = 0B11111111; //PC输入输出 0-输出 1-输入
MSCON1 |=0x02; //AUXPGE=1,翻页到BANK4-7
WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉
WPUB = 0B00000000; //PB端口上拉控制 1-开上拉 0-关上拉
WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉
MSCON1 &=0xFD; //AUXPGE=0,翻页到BANK0-3
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit7(PAPU)=0 ENABLED PULL UP PA
}
/*----------------------------------------------------
* 函数名称:TIMER0_INITIAL
* 功能:初始化设置定时器
* 相关寄存器:T0CS T0SE PSA
* 设置TMR0定时时长8.192ms=(1/16000000)*2*256*255(16M-2T-PSA 1:256- TMR0=255溢出)
----------------------------------------------------*/
void TIMER0_INITIAL (void)
{
OPTION = 0B00000111;
TMR0 = 0;
T0IF = 0; //清空T0软件中断
T0CON0 = 0x08; //T0ON = 1;
T0IE = 1; //开定时器/计数器0中断
}
void main(void)
{
DelayMs(20); //等待上电稳定
POWER_INITIAL(); //系统初始化
TIMER0_INITIAL();
GIE = 1; //开中断
while(1)
{
NOP();
}
}
(2)外设中断
- Timer1与PR1匹配
- Timer2后分频溢出
- DROM写完成
- LIRC与HIRC交叉校准完成
- 故障保护时钟监控器比较器0/1中断
- ADC转换完成
- ADC阈值比较匹配
- LVD条件匹配
- IIC中断
- SPI中断
- UART0/UART1中断
// Timer2Demo
// FT62FC6x
// 当DemoPortIn悬空或者高电平时,DemoPortOut输出4KHz占空比50%的波形-Timer2实现,当DemoPortIn接地时,DemoPortOut输出高电平.关定时器
#include "SYSCFG.h"
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define DemoPortOut PB4
#define DemoPortIn PD4
void interrupt ISR(void)
{
//定时器2的中断处理
if(TMR2IE && TMR2IF) //100us中断一次 = 4KHz
{
TMR2IF = 0;
DemoPortOut = ~DemoPortOut; //翻转电平
}
}
void DelayUs(unsigned char Time)
{
unsigned char a;
for(a=0;a<Time;a++)
{
NOP();
}
}
void DelayMs(unsigned char Time)
{
unsigned char a,b;
for(a=0;a<Time;a++)
{
for(b=0;b<5;b++)
{
DelayUs(197);
}
}
}
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系统时钟为内部振荡器
//Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
INTCON = 0; //暂禁止所有中断
PORTA = 0B00000000;
TRISA = 0B11111111; //PA输入输出 0-输出 1-输入
PORTB = 0B00000000;
TRISB = 0B11101111; //PA输入输出 0-输出 1-输入
PORTC = 0B00000000;
TRISC = 0B11111111; //PC输入输出 0-输出 1-输入
PORTD = 0B01000000;
TRISD = 0B11111111; //PA输入输出 0-输出 1-输入
MSCON1 |=0x02; //AUXPGE=1,翻页到BANK4-7
WPUA = 0B00000000; //PA端口上拉控制 1-开上拉 0-关上拉
WPUB = 0B00000000; //PB端口上拉控制 1-开上拉 0-关上拉
WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉
WPUD = 0B00010000; //PD端口上拉控制 1-开上拉 0-关上拉
//端口源电流大小设置,相邻2位共同控制电流大小,00-3ma 01/10-6ma 11-24ma
//PSRCxL:控制相应端口低4位电流大小
//PSRCxH:控制相应端口高4位电流大小
PSRCAL = 0x55;
PSRCAH = 0x55; //设置PA口源电流大小 6ma
PSRCBL = 0x55;
PSRCBH = 0x55; //设置PB口源电流大小 6ma
PSRCCL = 0x55;
PSRCCH = 0x55; //设置PC口源电流大小 6ma
PSRCDL = 0x55;
PSRCDH = 0x55; //设置PD口源电流大小 6ma
MSCON1 &=0xFD; //AUXPGE=0,翻页到BANK0-3
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit7(PAPU)=0 ENABLED PULL UP PA
MSCON0 = 0B00000000;
//BIT5:ROMLPE 低功耗模式选择 1-开启低功耗 0-正常功耗模式(只能1MHZ以下的PROM读速度才可以开启)
//BIT4:CLKOS CLKO信号映射管脚控制 1-CLKO功能映射到PD5 0-CLKO功能映射到PA2
//BIT3:软件控制LVR使能位 UCFG1<1:0>为01时此位有意义。0:禁止LVR;1:打开LVR
//BIT2:快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//BIT1:0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//BIT0:0:T2CK睡眠时停止工作:1: T2CK睡眠时保持工作。当T2时钟不是选择指令时钟时,睡眠状态T2CK的运行控制位
}
/*----------------------------------------------------------------------------------------------
* 函数名称: TIMER2_INITIAL
* 功能: 初始化设置定时器2
* f=4KHz=4000Hz T=1/f=250us
* 相关寄存器: T2CON TMR2 PR2 TMR2IE TMR2IF PEIE GIE
// (1/16MHz)*4*2T ==0.5us
// 0.5*(PR2+1) = 0.5 * 250 =125us
// 50%占空比 125us+125us=250us 250us--> T=1/f --> f = 1000000/4000
----------------------------------------------------------------------------------------------*/
void TIMER2_INITIAL (void)
{
T2CON0 = 0B00000001; //T2预分频1:4,后分频1:1
//BIT7: 0:无意义; 1:把PR2/P1xDTy缓冲值分别更新到PR2寄存器和P1xDTy_ACT
//BIT6~BIT3: 定时器2输出后分频比选择 0000:1:1;0001:1:2;……1:16
//BIT2:0:关闭定时器2;1:打开定时器2
//BIT1~0:定时器2预分频选择 00:1;01:4;1x:16
T2CON1 = 0B00000000; //T2时钟来自系统时钟,PWM1连续模式
//BIT4: PWM模式选择 0:连续模式;1:单脉冲模式
//BIT3: 0:PWM模式;1:蜂鸣器模式
//Timer2时钟源选择:000:指令时钟;001:系统时钟;010:HIRC的2倍频;100:HIRC;101:LIRC 110-LP 111-XT
TMR2H = 0; //定时器2计数寄存器,定时值=200*(4*2/16M)=200*0.5us=100us
TMR2L = 249;
PR2H = 0;
PR2L = 249; //TIMER2周期寄存器
TMR2IF = 0; //清TMER2中断标志
TMR2IE = 1; //使能TMER2的中断(配置成timer定时器时不注释)
TMR2ON = 1; //使能TMER2启动
PEIE = 1; //使能外设中断
GIE = 1; //使能全局中断
}
void main()
{
//等待上电稳定
DelayMs(20);
//硬件初始化
POWER_INITIAL();
TIMER2_INITIAL();
//主循环
while(1)
{
if(DemoPortIn) //判断输入是否为高电平
{
TMR2ON = 1;; //开定时器2
DelayMs();
}
else
{
TMR2ON = 0;; //关定时器2
DemoPortOut = 1;
}
}
}
(3)中断结构框图
10、定时器
- WDT
- Timer0
- Timer1
- Timer2
- Timer3
(1)WDT
// Project: FT62FC6x_WDT.prj
// Device: FT62FC6x
// Memory: PROM=6Kx14, SRAM=616Byte, EEPROM=128Byte
// Description: 程序中开启看门狗并将看门狗时间设置为32ms
// a. 主函数先在DemoPortOut脚输出一个高3ms低3ms的信号,
// b. 然后循环输出高1ms低1ms,500HZ的信号。
// 如果不清看门狗,则每隔32ms单片机复位后,会重复输出a+b信号;
// 如果清看门狗,则一直输出b信号
#include "SYSCFG.h"
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define DemoPortOut PA4
void DelayUs(unchar Time);
void interrupt ISR(void)
{
}
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系统时钟为内部振荡器
//Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
INTCON = 0; //暂禁止所有中断
PORTA = 0B00000000;
TRISA = 0B11101111; //PA输入输出 0-输出 1-输入
//PA4->输出
PORTC = 0B00000000;
TRISC = 0B11111111; //PC输入输出 0-输出 1-输入
WPUA = 0B01000000; //PA端口上拉控制 1-开上拉 0-关上拉
//开PA6上拉
WPUC = 0B00000000; //PC端口上拉控制 1-开上拉 0-关上拉
//60系列PC口无上拉
CLRWDT();
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit7(PAPU)=0 ENABLED PULL UP PA
//BIT5:PSRCAH4和PSRCA[4]共同决定源电流。00:4mA; 11: 33mA; 01、10:8mA
//BIT4:PSRCAH3和PSRCA[3]共同决定源电流。00:4mA; 11: 33mA; 01、10:8mA
//BIT3:UCFG1<1:0>为01时此位有意义。0:禁止LVR;1:打开LVR
//BIT2:快时钟测量慢周期的平均模式。0:关闭平均模式;1:打开平均模式
//BIT1:0:关闭快时钟测量慢周期;1:打开快时钟测量慢周期
//BIT0:0:睡眠时停止工作:1: 睡眠时保持工作。当T2时钟不是选择指令时钟的时候比较器,CxIN为数字IO口
}
void DelayUs(unsigned char Time)
{
unsigned char a;
for(a=0;a<Time;a++)
{
NOP();
}
}
void DelayMs(unsigned char Time)
{
unsigned char a,b;
for(a=0;a<Time;a++)
{
for(b=0;b<5;b++)
{
DelayUs(197);
}
}
}
void DelayS(unsigned char Time)
{
unsigned char a,b;
for(a=0;a<Time;a++)
{
for(b=0;b<10;b++)
{
DelayMs(100);
}
}
}
/*-------------------------------------------------
* 函数名称:WDT_INITIAL
* 功能: 初始化设置看门狗1S时间复位
* 相关寄存器:
* 1、INTCON
* 2、OPTION
* 3、WDTCON
WDTCLK = 32KHz
看门狗时间:默认2ms (1/WDTCLK)*后分频系数*时钟周期
-------------------------------------------------*/
void WDT_INITIAL (void)
{
CLRWDT(); //清看门狗
PSA=0; //时钟分频分给WDT
WDTCON = 0B00001010; //WDTPS=0101=1:1024,PS=000=1:1
//定时时间=(1024*1)/32000=32ms
}
void main(void)
{
DelayMs(20); //等待上电稳定
POWER_INITIAL(); //系统初始化
WDT_INITIAL();
DemoPortOut = 1;
DelayMs(3); //3ms
DemoPortOut = 0;
DelayMs(3); //3ms
while(1)
{
CLRWDT(); //清看门狗
DemoPortOut = 1;
DelayMs(1); //1ms
DemoPortOut = 0;
DelayMs(1); //1ms
}
}
(2)Timer0
(3)Timer1
(4)Timer2
(5)Timer3
11、PWM
- 4路同周期,独立占空比PWM通道:P1A、P1B、P1C、P1D
- 通道1带有互补输出:/P1A
- 1路带死区控制的PWM通道:P1A,/P1A
- 16bit分辨率
- 输出极性独立控制
- 映射到GPIO口进行PWM输出
- 蜂鸣器模式
- 单脉冲模式
- 第2功能
- 周期与占空比双缓冲读写
- 时钟源:PWM通道专用定时器Timer2,6个时钟源选择(HIRC、LIRC、指令时钟、外部时钟LP/XT/EC)
- PWM周期=T2CLK*预分频*2T*(PR2+1)
- 占空比=P1xDT/(PR2+1)
- 脉宽=T2CLK*预分频*P1xDT
- 死区时间:如果 P1DC ≠ “00 0000”,P1Ax 和 P1AxN (/P1A) 的低到高转换沿将产生延迟,延迟时间即为”死区”时间。有效脉宽和占空比也相应减小。死区定时器以 Timer2 时钟作为计数时钟源
- PWM输出:重映射到IO引脚、蜂鸣器模式、单脉冲模式
(1)PWM结构框图
(2)PWM_Demo
// Project: FT62FC6x_PWM.prj
// Device: FT62FC6x
// Memory: PROM=6Kx14, SRAM=616Byte, EEPROM=128Byte
// Description: 上电后所有PWM口输出,仿真时的烧录口除外。
#include "SYSCFG.h";
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
void DelayUs(unchar Time);
void interrupt ISR(void)
{
}
void DelayUs(unsigned char Time)
{
unsigned char a;
for(a=0;a<Time;a++)
{
NOP();
}
}
void DelayMs(unsigned char Time)
{
unsigned char a,b;
for(a=0;a<Time;a++)
{
for(b=0;b<5;b++)
{
DelayUs(197);
}
}
}
//unsigned char address=0;
//unsigned char * pt=0;
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系统时钟为内部振荡器
//Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
TRISD=0;
TRISC=0;
TRISB=0;
TRISA=0;
PORTA=0;
PORTB=0;
PORTC=0;
PORTD=0;
T2CON0=0; //;BIT6:3]=TOUTPS 后分频比 0000=1:1~1111=1:16
//;BIT2=TMR2ON 1=TIMER2打开 0=关闭
//;BIT[1:0]=T2CKPS 00=1:1 01=1:4 1x=1:16
T2CON1=0X01; // CLK = Fsys
//T2CKSRC0=0x02;
PR2H=0;
PR2L=31; //PWM period
//PWM输出使能控制:P1OE0 P1OE1
P1OE1 =0b11100110;
//7:P1D2OE 1-输出使能 0-不输出
//6:P1D1OE 1-输出使能 0-不输出
//5:P1D0OE 1-输出使能 0-不输出
//2:P1C1OE 1-输出使能 0-不输出
//1:P1B1OE 1-输出使能 0-不输出
P1OE0 = 0B11111111;
//7:P1C0OE 1-输出使能 0-不输出
//6:P1B0OE 1-输出使能 0-不输出
//5:P1A2NOE 1-输出使能 0-不输出
//4:P1A2OE 1-输出使能 0-不输出
//3:P1A1NOE 1-输出使能 0-不输出
//2:P1A1OE 1-输出使能 0-不输出
//1:P1A0NOE 1-输出使能 0-不输出
//0:P1A0OE 1-输出使能 0-不输出
//输出极性选择
P1POL0=0x00 ;
//7:P1C0P 1-低有效 0-高有效
//6:P1B0P 1-低有效 0-高有效
//5:P1A2NP 1-低有效 0-高有效
//4:P1A2P 1-低有效 0-高有效
//3:P1A1NP 1-低有效 0-高有效
//2:P1A1P 1-低有效 0-高有效
//1:P1A0NP 1-低有效 0-高有效
//0:P1A0P 1-低有效 0-高有效
P1POL1=0x00 ;
//7:P1D2P 1-低有效 0-高有效
//6:P1D1P 1-低有效 0-高有效
//5:P1D0P 1-低有效 0-高有效
//2:P1C1P 1-低有效 0-高有效
//1:P1B1P 1-低有效 0-高有效
//P1AUX |= 0B00001111; //第二功能输出设置
P1ADTH=0;
P1ADTL =3;
P1BDTH=0;
P1BDTL=10;
P1CDTH=0;
P1CDTL=26;
P1DDTH=0;
P1DDTL =29;
TMR2H=0;
TMR2L=0;
T2CON0=T2CON0|0x04;
}
void main()
{
DelayMs(20); //等待上电稳定
POWER_INITIAL();
while(1)
{
}
}