辉芒微单片机学习笔记1-FT62FC6x

目录

1、主要特性

2、系统结构框图

3、FT62FC6引脚分布​编辑

4、IO端口

5、复位系统

(1)上电复位(POR)

(2)系统复位

(3)低电压复位(BOR/LVR)

(4)非法指令复位

(5)看门狗复位                

(6)外部IO复位

(7)复位电路结构图

6、低电压检测

7、时钟系统

8、低功耗

(1)SLEEP

(2)PROM

9、中断

(1)非外设中断

(2)外设中断

(3)中断结构框图

10、定时器

(1)WDT

(2)Timer0

(3)Timer1

(4)Timer2

(5)Timer3

11、PWM

(1)PWM结构框图

(2)PWM_Demo 


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模式下运行

TOUCH25个触摸按键
通信接口

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。
  1. VDD低于 VPOR时,CPU 处于完全复位状态
  2. VDD上升至 VPOR 以上时,芯片开始初始化配置(BOOT)过程
  3. 初始化配置完成后,指令将从 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、低电压检测

  1. 所有控制位和参数选择位均由用户指令设置,而不是初始化配置时;
  2. 必须正确设置 I/O:TRISx = 1; ANSELAx = 1;
  3. LVD 事件将置位 LVDW 而不是/BOR
  4. 可通过指令配置为中断,且不会触发系统复位;
  5. 可通过 LVDDEB 使能消抖功能。消抖时间(TLVD) 为 3 – 4x 消抖时钟 LVDCKS (如果未预先启动,所 选时钟源将自动开启)
  6. LVD 输入可以配置成 VDD或其他 2 I/O,后者允许将 LVD 当作单输入比较器功能使用,与 9 LVDL 电压值(VLVD-REF) 之一进行比较;
  7. 可设置 LVD 的极性,因此 LVD 可作为 VLVD-REF比较器;
  8. 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)
    {
        
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值