找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1297|回复: 0
打印 上一主题 下一主题
收起左侧

关于辉芒微单片机FT62F083-RB内部PWM使用 附源程序和PCB文件

[复制链接]
跳转到指定楼层
楼主
ID:370644 发表于 2023-8-31 14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
辉芒微单片机FT62F083-RB内部可以做滑条滑轮调光,在调光的同时,还需要用到内部的PWM,所以配置起来较麻烦。研究了半天,故记录下来。
内部PWM使用注意事项:

其实它就是3个寄存器+1个重映射寄存器
第1个寄存器TIM1CCMR1( TIM1CCMR2 TIM1CCMR3 TIM1CCMR4 表示4组PWM寄存器)使能它,并选择对应的PWM模式,通常我们是这样设置的 TIM1CCMR1 =0B01101000;//通道1 选择PWM模式1并使能。其它3组同理。
第2个寄存器TIM1CCER1:它前4位控制PWM2,后4位控制PWM1,我们发现有N的就选择NE那一个选择位,若没有N就选择E那个选择位,不要选择P那个位就行了。
第3个寄存器TIM1CCER2:它前2位控制PWM4,后4位控制PWM3,同样我们发现有N的就选择NE那一个选择位,若没有N就选择E那个选择位,不要选择P那个位就行了。
4个、重映射 AFP0=0B00001100; 将PWM2 PWM3重映射到对应的位即可。

具体操纵如下:
一、TIM1CCMR1 :
bit7 保留位
bit 6-4:
该3位定义了输出参考信号OC1REF的动作,而OC1REF决定了OC1的值。OC1REF是高电平有效,而OC1的有效电平取决于CC1P位。
000:冻结。输出实际比较值(CCRx_SHAD)与计数器TIM1_CNT间的比较对OC1REF不起作用;
001:匹配时设置通道1的输出为有效电平。当计数器TIM1_CNT的值与捕获/比较寄存器1(TIM1_CCR1)相同时,强制OC1REF为高。
010:匹配时设置通道1的输出为无效电平。当计数器TIM1_CNT的值与捕获/比较寄存器1(TIM1_CCR1)相同时,强制OC1REF为低。
011:翻转。当TIM1_CCR1=TIM1_CNT时,翻转OC1REF的电平。
100:强制为无效电平。强制OC1REF为低。
101:强制为有效电平。强制OC1REF为高。
110:PWM模式1- 在向上计数时,一旦TIM1_CNT<实际比较值(CCRx_SHAD)时OC1REF为有效电平,否则为无效电平;在向下计数时,一旦TIM1_CNT>实际比较值(CCRx_SHAD)时,OC1REF为无效电平,否则为有效电平。
111:PWM模式2- 在向上计数时,一旦TIM1_CNT<实际比较值(CCRx_SHAD)时OC1REF为无效电平,否则为有效电平;在向下计数时,一旦TIM1_CNT>实际比较值(CCRx_SHAD)时,OC1REF为有效电平,否则为无效电平。
注1:一旦LOCK级别设为3(TIM1_BKR寄存器中的LOCK位)并且T1CC1S=00(该通道配置成输出) 则该位不能被修改。
注2:在PWM模式1或PWM模式2中,只有当比较结果改变了或在输出比较模式中从冻结模式切换到PWM模式时,OC1REF电平才改变。(参考17.5.7PWM模式)
bit3:

T1OC1PE:输出比较1预装载使能
0:禁止TIM1CCR1H/L寄存器的预装载功能,可随时写入T1CCR1预加载寄存器,并且新写入的数值立即起作用。
1:开启TIM1CCR1H/L寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIM1CCR1H/L的预装载值在更新事件到来时被加载至当前寄存器中。
注1:一旦LOCK级别设为3(TIM1BKR寄存器中的T1LOCK位)并且T1CC1S=00(该通道配置成输出) 则该位不能被修改。
注2:为了操作正确,在PWM模式下必须使能预装载功能。但在单脉冲模式下(TIM1CR1寄存器的T1OPM=1),它不是必须的。
bit2:保留位
bit 1-2:
T1CC1S[1:0]:捕获/比较1 选择。
这2位定义通道的方向(输入/输出),及输入脚的选择:
00:通道1被配置为输出;
01:通道1被配置为输入,IC1映射在TI1FP1上;
10:通道1被配置为输入,IC1映射在TI2FP1上;
11:通道1被配置为输入,IC1映射在TRC上。此模式仅工作在内部触发器输入被选中时(由
TIM1SMCR寄存器的T1TS位选择)。
注:T1CC1S仅在通道关闭时(TIM1CCER1寄存器的T1CC1E=0,T1CC1NE=0且已被更新)才是可写的。


     TIM1CCMR2 :同上
     TIM1CCMR3 :同上
     TIM1CCMR4 :同上
实际程序中这样写得:
        TIM1CCMR1 =0B01101000;//通道1 PWM模式1并使能
        TIM1CCMR2 =0B01101000;//CC2通道2 PWM模式1并使能
TIM1CCMR3 =0B01101000;//CC3通道3 PWM模式1并使能
TIM1CCMR4 =0B01101000;//CC4通道4 PWM模式1并使能
二、TIM1CCER1:
bit7:T1CC2NP:输入捕获/比较2互补输出极性。参考CC1NP的描述。
bit6
T1CC2NE:输入捕获/比较2互补输出使能。参考CC1NE的描述。
bit5
T1CC2P:输入捕获/比较2输出极性。参考CC1P的描述。
bit4
T1CC2E:输入捕获/比较2输出使能。参考CC1E的描述。
////////////////////////////////////////////////  CC1NP这一路的配置情况
bit3
T1CC1NP:输入捕获/比较1互补输出极性
0:OC1N高电平有效;
1:OC1N低电平有效。

bit2
T1CC1NE:输入捕获/比较1互补输出使能
0:关闭- OC1N禁止输出,因此OC1N的输出电平依赖于MOE、OSSI、OSSR、OIS1、
OIS1N和CC1E位的值。
1:开启- OC1N信号输出到对应的输出引脚,其输出电平依赖于MOE、OSSI、OSSR、
OIS1、OIS1N和CC1E位的值。

bit1
T1CC1P:输入捕获/比较1输出极性CC1通道配置为输出:
0:OC1高电平有效;
1:OC1低电平有效。
bit0
T1CC1E:输入捕获/比较1输出使能
CC1通道配置为输出:
0: 关闭- OC1禁止输出,因此OC1的输出电平依赖于MOE、OSSI、OSSR、OIS1、OIS1N和CC1NE位的值。
1: 开启- OC1信号输出到对应的输出引脚,其输出电平依赖于MOE、OSSI、OSSR、OIS1 、 OIS1N 和 CC1NE 位 的 值 。


三、TIM1CCER2:
bit7:空位
bit6:空位
bit5
T1CC4P:输入捕获/比较4输出极性。参考CC1P的描述。
bit4
T1CC4E:输入捕获/比较4输出使能。参考CC1E的描述。
////////////////////////////////////////////////  CC1NP这一路的配置情况
bit3
T1CC3NP:输入捕获/比较3互补输出极性
0:OC3N高电平有效;
1:OC3N低电平有效。

bit2
T1CC3NE:输入捕获/比较3互补输出使能
0:关闭- OC3N禁止输出,
1:开启- OC3N信号输出到对应的输出引脚,

bit1
T1CC3P:输入捕获/比较1输出极性CC3通道配置为输出:
0:OC3高电平有效;
1:OC3低电平有效。

bit0
T1CC3E:输入捕获/比较1输出极性CC3通道配置为输出:
0:OC3高电平有效;
1:OC3低电平有效。

四、重映射 AFP0=0B00001100; //管脚重映射寄存器 0 比如:AFP0=0B00001100;表示time1的CH2 CH3重映射到PC6和PC5管脚  具体查FT62F083-RB规格书五、重映射 AFP1=0B00000000;  //管脚重映射寄存器 1






FT62F083单片机内部PWM--5路源程序如下:
  1. #include "common.h"
  2. #include "syscfg.h"
  3. #include "touch.h"
  4. /**************触摸变量?****************/
  5. volatile uint         GKeyValue;            //返回的键值  bit0~bit14对应key1~key15  0没有按下,1按下
  6. extern uchar      fmd_channels;
  7. uint   TouchTimeCount;
  8. /********************************/
  9. #define LED1 RC3 //IO输出
  10. #define LED2 RB4 //IO输出
  11. bit        flag;
  12. uint        dii,dii1,pwm;
  13. uchar dii2,dii3;
  14. //-----------------------------------------------------
  15. void SysInit(void)
  16. {
  17.                 OSCCON = 0B01100001;                //WDT 32KHZ IRCF=110=8M Hz
  18.                                                                 //Bit0=1,系统时钟为内部振荡器
  19.                                                                 //Bit0=0,时钟源由FOSC<2:0>决定即编译选项时选择
  20.                 INTCON = 0;                                                  //暂禁止所有中断
  21.                 PORTA = 0B00000000;               
  22.                 TRISA = 0B00000000;                //PA输入输出 0-输出 1-输入
  23.                 WPUA = 0B00000000;             //PA端口上拉控制 1-开上拉 0-关上拉
  24.                 PORTB = 0B00000000;               
  25.                 TRISB = 0B00000000;                //PB输入输出 0-输出 1-输入 PB3-输出
  26.                 WPUB = 0B00000000;             //PB端口上拉控制 1-开上拉 0-关上拉                                       
  27.                 PORTC = 0B00000000;         
  28.                 TRISC = 0B00000000;                //PC输入输出 0-输出 1-输入 PC3-输入         
  29.                 WPUC = 0B00000000;             //PC端口上拉控制 1-开上拉 0-关上拉
  30.                
  31.                 PSRC0 = 0B11111111;          //PORTA,PORTB源电流设置最大
  32.                 PSRC1 = 0B11111111;                //PORTC,PORTD源电流设置最大   

  33.                 PSINK0 = 0B11111111;          //PORTA灌电流设置最大 0:最小,1:最大
  34.                 PSINK1 = 0B11111111;         //PORTB灌电流设置最大 0:最小,1:最大
  35.                 PSINK2 = 0B11111111;        //PORTC灌电流设置最大 0:最小,1:最大
  36.                 PSINK3 = 0B11111111;        //PORTD灌电流设置最大 0:最小,1:最大

  37.                 ANSELA = 0B00000000;    //全为数字管脚
  38. }
  39. //===========================================================
  40. //Funtion name    keydeal
  41. //parameters:    无
  42. //returned value:无
  43. //===========================================================
  44. /*-------------------------------------------------
  45. *        函数名称:Time4Initial
  46. *        功能:  
  47. *        输入参数:
  48. *        返回参数:无
  49. -------------------------------------------------*/
  50. void Time4Initial(void)
  51. {
  52.         PCKEN |=0B00001000;      //TIME4模块时钟使能
  53.         //CKOCON=0B00110000;
  54.         //TCKSRC=0B00000011;               

  55.         TIM4CR1        =0B00000101;
  56.         //BIT7: 0:TIM1_ARR寄存器没有缓冲,它可以被直接写入; 1:TIM1_ARR寄存器由预装载缓冲器缓冲。
  57.         //BIT6:保留
  58.         //BIT5~BIT4:timer4时钟选择位。
  59.                         //00:系统时钟/主时钟
  60.                                 //01:内部快时钟HIRC
  61.                                 //10:LP时钟,只有当FOSC选择LP模式时才有意义
  62.                                 //11:XT时钟,只有当FOSC选择XT模式时才有意义

  63.         //BIT3:
  64.         //                        0:在发生更新事件时,计数器不停止;
  65.         //                        1:在发生下一次更新事件(清除CEN位)时,计数器停止。

  66.         //BIT2:
  67.         //                 0:如果UDIS允许产生更新事件,则下述任一事件产生一个更新中断:
  68.                                 //寄存器被更新(计数器上溢/下溢)
  69.                                 //软件设置UG位
  70.                                 //时钟/触发控制器产生的更新
  71.         //                1:如果UDIS允许产生更新事件,则只有当下列事件发生时才产生更新中断,并UIF置1:
  72.                                 //寄存器被更新(计数器上溢/下溢)

  73.         //BIT1:
  74.         //                0:一旦下列事件发生,产生更新(UEV)事件:
  75.                                 //计数器溢出/下溢
  76.                                 //产生软件更新事件
  77.                                 //时钟/触发模式控制器产生的硬件复位被缓存的寄存器被装入它们的预装载值。
  78.         //                1:不产生更新事件,影子寄存器(ARR、PSC、CCRx)保持它们的值。如果设置了UG位或时钟/触发控制器发出了一个硬件复位,则计数器和预分频器被重新初始化。

  79.         // BIT0: 0:禁止计数器;1:使能计数器。


  80.         TIM4IER        =0B00000001;
  81.         //BIT0:  0:禁止更新中断;1:允许更新中断。

  82.         TIM4SR        =0B00000000;
  83.         //BIT0:当产生更新事件时该位由硬件置1。它由软件写1清0
  84.                         //0:无更新事件产生;
  85.                         //1:更新事件等待响应。当寄存器被更新时该位由硬件置1:
  86.                         //若TIM4_CR1寄存器的UDIS=0,当计数器上溢或下溢时;
  87.                         //若TIM4_CR1寄存器的UDIS=0、URS=0,当设置TIM4_EGR寄存器的UG位软件对计数器
  88.                         //CNT重新初始化时;
  89.                         //若TIM4_CR1寄存器的UDIS=0、URS=0,当计数器CNT被触发事件重新初始化时。

  90.         TIM4EGR        =0B00000000;
  91.         //BIT0:该位由软件置1,由硬件自动清0。
  92.         //0:无动作;
  93.         //1:重新初始化计数器,并产生一个更新事件。注意预分频器的计数器也被清0(但是预分频系数不变)。若在中心对称模式下或DIR=0(向上计数)则计数器被清0;若DIR=1(向下计数)则计数器取TIM1_ARR的值。

  94.         TIM4CNTR=0; //TIM4 8位计数器

  95.         TIM4PSCR=0B00000110;
  96.         //预分频器对输入的CK_PSC时钟进行分频。
  97.         //计数器的时钟频率fCK_CNT等于fCK_PSC/2(PSC[2:0])。PSC[7:3]由硬件清0。
  98.         //PSCR包含了当更新事件产生时装入当前预分频器寄存器的值(包括由于清除TIMx_EGR寄存器的UG位产生的计数器清除事件)。这意味着如要新的预分频值生效,必须产生更新事件或者CEN=0。

  99.         TIM4ARR        =124;
  100.         //ARR包含了将要装载入实际的自动重装载寄存器的值。
  101.         //当自动重装载的值为空时,计数器不工作。

  102.         INTCON |= 0B11000000;    //开总中断和外设中断
  103. }
  104. /*-------------------------------------------------
  105. * 函数名称:Time2Initial
  106. * 功能:    初始化计时器2
  107. * 输入参数:无
  108. * 返回参数:无
  109. -------------------------------------------------*/
  110. void Time2Initial(void)
  111. {
  112.         PCKEN |= 0B00000100;    //使能timer2时钟模块
  113.         CKOCON = 0B00100000;
  114.         //TCKSRC = 0B00000000;    //TIM2时钟为HIRC的2倍频
  115.         TCKSRC = 0B00000000;    //TIM2时钟为HIRC的2倍频
  116.         //Bit7低频内振模式:1=256K 振荡频率模式,0 = 32K 振荡频率模式

  117.         //Bit[6:4]:TIM2时钟源选择位
  118.         //值        时钟源
  119.         //0                系统时钟/主时钟
  120.         //1                HIRC
  121.         //2                XT时钟/外部时钟
  122.         //3                HIRC的2倍频
  123.         //4                XT时钟/外部时钟的2倍频
  124.         //5                LIRC
  125.         //6                LP时钟/外部时钟
  126.         //7                LP时钟/外部时钟的2位频
  127.    
  128.         //Bit3:保留位
  129.    
  130.         //Bit[2:1]:TIM1时钟源选择位
  131.         //值        时钟源
  132.         //0                系统时钟/主时钟
  133.         //1                HIRC
  134.         //2                XT时钟/外部时钟
  135.         //3                HIRC的2倍频
  136.         //4                XT时钟/外部时钟的2倍频
  137.         //5                LIRC
  138.         //6                LP时钟/外部时钟
  139.         //7                LP时钟/外部时钟的2位频

  140.     TIM2CR1 =0B10000101;  //预载允许,边沿对齐向上计数器,计数器使能
  141.         //Bit7:自动预装载允许位
  142.         //0:TIM2_ARR寄存器没有缓冲,它可以被直接写入;
  143.         //1:TIM2_ARR寄存器由预装载缓冲器缓冲。
  144.    
  145.         //Bit[6:4]:保留位
  146.    
  147.         //Bit3:单脉冲模式
  148.         //0:在发生更新事件时,计数器不停止;
  149.         //1:在发生下一次更新事件(清除CEN位)时,计数器停止。
  150.    
  151.         //Bit2:更新请求源
  152.         //0:如果UDIS允许产生更新事件,则下述任一事件产生一个更新中断:
  153.         //寄存器被更新(计数器上溢/下溢)
  154.         //软件设置UG位
  155.         //时钟/触发控制器产生的更新
  156.         //1:如果UDIS允许产生更新事件,则只有当下列事件发生时才产生更新中断,并UIF置1:
  157.         //寄存器被更新(计数器上溢/下溢)
  158.    
  159.         //Bit1:禁止更新
  160.         //0:一旦下列事件发生,产生更新(UEV)事件:
  161.         //计数器溢出/下溢
  162.         //产生软件更新事件
  163.         //时钟/触发模式控制器产生的硬件复位被缓存的寄存器被装入它们的预装载值。
  164.         //1:不产生更新事件,影子寄存器(ARR_SHAD、PSC_SHAD、CCRx_SHAD)保持它们的值。
  165.    
  166.         //Bit0:允许计数器
  167.         //0:禁止计数器;
  168.         //1:使能计数器。
  169.    
  170.     TIM2IER = 0B00000001;
  171.         //Bit[7:4]:保留位
  172.         //Bit3:允许捕获/比较3中断
  173.         //0:禁止捕获/比较3中断;
  174.         //1:允许捕获/比较3中断。
  175.         //Bit2:允许捕获/比较2中断
  176.         //0:禁止捕获/比较2中断;
  177.         //1:允许捕获/比较2中断。
  178.         //Bit1:允许捕获/比较1中断
  179.         //0:禁止捕获/比较1中断;
  180.         //1:允许捕获/比较1中断。
  181.         //Bit0:允许更新中断
  182.         //0:禁止更新中断;
  183.         //1:允许更新中断。   
  184.    
  185.     //TIM2ARRH =(65536-64896)*4/256;        //自动重载,周期 速度更快了,所以要乘以 X 速度慢就要除以 ÷
  186.     //TIM2ARRL =(65536-64896)*4%256;
  187.     TIM2ARRH =0;
  188.     TIM2ARRL =213;
  189.    
  190.     GIE =1;                //开总中断
  191.   }
  192.   /*-------------------------------------------------
  193. * 函数名:Time1Initial
  194. * 功能:  上电系统初始化
  195. * 输入:  无
  196. * 输出:  无
  197. --------------------------------------------------*/               
  198. void Time1Initial(void)
  199. {
  200.         PCKEN |= 0B00000010;    //使能timer1时钟模块
  201.         CKOCON=0B00100000;
  202.         //TCKSRC = 0B00110011;             //TIM1时钟为HIRC的2倍频
  203.         TCKSRC = 0B00000000;
  204.         //Bit7低频内振模式:1=256K 振荡频率模式,0 = 32K 振荡频率模式

  205.         //Bit[6:4]:TIM2时钟源选择位
  206.         //值        时钟源
  207.         //0                系统时钟/主时钟
  208.         //1                HIRC
  209.         //2                XT时钟/外部时钟
  210.         //3                HIRC的2倍频
  211.         //4                XT时钟/外部时钟的2倍频
  212.         //5                LIRC
  213.         //6                LP时钟/外部时钟
  214.         //7                LP时钟/外部时钟的2位频

  215.         //Bit3:保留位

  216.         //Bit[2:1]:TIM1时钟源选择位
  217.         //值        时钟源
  218.         //0                系统时钟/主时钟
  219.         //1                HIRC
  220.         //2                XT时钟/外部时钟
  221.         //3                HIRC的2倍频
  222.         //4                XT时钟/外部时钟的2倍频
  223.         //5                LIRC
  224.         //6                LP时钟/外部时钟
  225.         //7                LP时钟/外部时钟的2位频

  226.         TIM1CR1 =0B10000101;  //预载允许,边沿对齐向上计数器,计数器使能
  227.         //Bit7:自动预装载允许位
  228.         //0:TIM1_ARR寄存器没有缓冲,它可以被直接写入;
  229.         //1:TIM1_ARR寄存器由预装载缓冲器缓冲。

  230.         //Bit[6:5]:选择对齐模式
  231.         //00:边沿对齐模式。计数器依据方向位(DIR)向上或向下计数。
  232.         //01:中央对齐模式1。计数器交替地向上和向下计数。配置为输出的通道(TIM1_CCMRx寄存器中CciS=00)的输出比较中断标志位,只在计数器向下计数时被置1。
  233.         //10: 中央对齐模式2。计数器交替地向上和向下计数。配置为输出的通道(TIM1_CCMRx寄存器中CciS=00)的输出比较中断标志位,只在计数器向上计数时被置1。
  234.         //11:中央对齐模式3。计数器交替地向上和向下计数。配置为输出的通道(TIM1_CCMRx寄存器中CciS=00)的输出比较中断标志位,在计数器向上和向下计数时均被置1。

  235.         //Bit4:方向
  236.         //0:计数器向上计数;
  237.         //1:计数器向下计数。

  238.         //Bit3:单脉冲模式
  239.         //0:在发生更新事件时,计数器不停止;
  240.         //1:在发生下一次更新事件(清除CEN位)时,计数器停止。

  241.         //Bit2:更新请求源
  242.         //0:如果UDIS允许产生更新事件,则下述任一事件产生一个更新中断:
  243.         //寄存器被更新(计数器上溢/下溢)
  244.         //软件设置UG位
  245.         //时钟/触发控制器产生的更新
  246.         //1:如果UDIS允许产生更新事件,则只有当下列事件发生时才产生更新中断,并UIF置1:
  247.         //寄存器被更新(计数器上溢/下溢)

  248.         //Bit1:        禁止更新
  249.         //0:一旦下列事件发生,产生更新(UEV)事件:
  250.         //计数器溢出/下溢
  251.         //产生软件更新事件
  252.         //时钟/触发模式控制器产生的硬件复位被缓存的寄存器被装入它们的预装载值。
  253.         //1:不产生更新事件,影子寄存器(ARR、PSC、CCRx)保持它们的值。如果设置了UG位或时钟/触发控制器发出了一个硬件复位,则计数器和预分频器被重新初始化。

  254.         //Bit0:        允许计数器
  255.         //0:禁止计数器;
  256.         //1:使能计数器。
  257.         TIM1SMCR=0B00000000;
  258.         //Bit7:保留位

  259.         //Bit[6:4]:触发选择,这3位选择用于选择同步计数器的触发输入。
  260.         //000:内部触发ITR0连接到TIM6 TRGO (此设计没有TIM6,所以固定接0)        
  261.         //001:保留        
  262.         //010:内部触发ITR2连接到TIM5 TRGO(此设计没有TIM5,所以固定接0)
  263.         //011:保留        
  264.         //100:TI1的边沿检测器(TI1F_ED)
  265.         //101:滤波后的定时器输入1(TI1FP1)
  266.         //110:滤波后的定时器输入2(TI2FP2)
  267.         //111:外部触发输入(ETRF)
  268.         //注:这些位只能在未用到(如SMS=000)时被改变,以避免在改变时产生错误的边沿检测。

  269.         //Bit3:保留

  270.         //Bit[2:0]:时钟/触发/从模式选择,当选择了外部信号,触发信号(TRGI)的有效边沿与选中的外部输入极性相关(见输入控制寄存器和控制寄存器的说明)
  271.         //000:时钟/触发控制器禁止 – 如果CEN=1,则预分频器直接由内部时钟驱动。
  272.         //001:编码器模式1 – 根据TI1FP1的电平,计数器在TI2FP2的边沿向上/下计数。
  273.         //010:编码器模式2 – 根据TI2FP2的电平,计数器在TI1FP1的边沿向上/下计数。
  274.         //011:编码器模式3 – 根据另一个输入的电平,计数器在TI1FP1和TI2FP2的边沿向上/下计数。
  275.         //100:复位模式 – 在选中的触发输入(TRGI)的上升沿时重新初始化计数器,并且产生一个更新寄存器的信号。
  276.         //101:门控模式 – 当触发输入(TRGI)为高时,计数器的时钟开启。一旦触发输入变为低,则计数器停止(但不复位)。计数器的启动和停止都是受控的。
  277.         //110:触发模式 – 计数器在触发输入TRGI的上升沿启动(但不复位),只有计数器的启动是受控的。
  278.         //111:外部时钟模式1 – 选中的触发输入(TRGI)的上升沿驱动计数器。
  279.         //注:如果TI1F_ED被选为触发输入(TS=100)时,不要使用门控模式。这是因为TI1F_ED在每次
  280.         //TI1F变化时只是输出一个脉冲,然而门控模式是要检查触发输入的电平。
  281.         //TIM1IER = 0B00000001;

  282.         TIM1IER = 0B00000000;
  283.         //Bit7:允许刹车中断
  284.         //0:禁止刹车中断;
  285.         //1:允许刹车中断。
  286.         //Bit6:触发中断使能
  287.         //0:禁止触发中断;
  288.         //1:使能触发中断。
  289.         //Bit5:允许COM中断
  290.         //0:禁止COM中断;
  291.         //1:允许COM中断。
  292.         //Bit4:允许捕获/比较4中断
  293.         //0:禁止捕获/比较4中断;
  294.         //1:允许捕获/比较4中断。
  295.         //Bit3:允许捕获/比较3中断
  296.         //0:禁止捕获/比较3中断;
  297.         //1:允许捕获/比较3中断。
  298.         //Bit2:允许捕获/比较2中断
  299.         //0:禁止捕获/比较2中断;
  300.         //1:允许捕获/比较2中断。
  301.         //Bit1:允许捕获/比较1中断
  302.         //0:禁止捕获/比较1中断;
  303.         //1:允许捕获/比较1中断。
  304.         //Bit0:允许更新中断
  305.         //0:禁止更新中断;
  306.         //1:允许更新中断。

  307.         TIM1SR1 =0B00000000;
  308.         //Bit7:刹车中断标记(写1清0,写0无效)
  309.         //0:无刹车事件产生;
  310.         //1:刹车输入上检测到有效电平。

  311.         //Bit6:触发器中断标记(写1清0,写0无效)
  312.         //0:无触发器事件产生;
  313.         //1:触发中断等待响应。

  314.         //Bit5:保留位

  315.         //Bit4:捕获/比较4中断标记
  316.         //参考CC1IF描述。

  317.         //Bit3:捕获/比较3中断标记
  318.         //参考CC1IF描述。

  319.         //Bit2:捕获/比较2中断标记
  320.         //参考CC1IF描述。

  321.         //Bit1:捕获/比较1中断标记  如果通道CC1配置为输出模式:(写1清0,写0无效)
  322.         //0:无匹配发生;
  323.         //1:TIMx_CNT的值与TIMx_CCR1的值匹配。
  324.         //注:在中心对称模式下,当计数器值为0时,向上计数,当计数器值为ARR时,向下计数(它从0向上计数到ARR-1,再由ARR向下计数到1)。因此,对所有的SMS位值,这两个值都不置标记。但是,如果CCR1>ARR,则当CNT达到ARR值时,CC1IF置1。
  325.         //如果通道CC1配置为输入模式:当捕获事件发生时该位由硬件置1,它由软件清0或通过读TIM1_CCR1L清0。
  326.         //0:无输入捕获产生;
  327.         //1:计数器值已被捕获(拷贝)至TIM1_CCR1(在IC1上检测到与所选极性相同的边沿)。

  328.         //Bit0:更新中断标记,当产生更新事件时该位由硬件置1。它由软件清0。
  329.         //0:无更新事件产生;
  330.         //1:更新事件等待响应。当寄存器被更新时该位由硬件置1:
  331.         //若TIM1_CR1寄存器的UDIS=0,当计数器上溢或下溢时;
  332.         //若TIM1_CR1寄存器的UDIS=0、URS=0,当设置TIM1_EGR寄存器的UG位软件对计数器
  333.         //CNT重新初始化时;
  334.         //若TIM1_CR1寄存器的UDIS=0、URS=0,当计数器CNT被触发事件重新初始化时 (参考0
  335.         //从模式控制寄存器TIM1_SMCR)。

  336.         TIM1SR2 =0B00000000;

  337.         TIM1EGR =0B00000000;
  338.         //Bit7:产生刹车事件,该位由软件置1,用于产生一个刹车事件,由硬件自动清0。
  339.         //0:无动作;
  340.         //1:产生一个刹车事件。此时MOE=0、BIF=1,若开启对应的中断(BIE=1),则产生相应的中断。

  341.         //Bit[6:5]:保留位

  342.         //Bit4:产生捕获/比较4事件
  343.         //参考CC1G描述。

  344.         //Bit3:产生捕获/比较3事件
  345.         //参考CC1G描述。

  346.         //Bit2:产生捕获/比较2事件
  347.         //参考CC1G描述。

  348.         //Bit1:产生捕获/比较1事件
  349.         //该位由软件置1,用于产生一个捕获/比较事件,由硬件自动清0。
  350.         //0:无动作;
  351.         //1:在通道CC1上产生一个捕获/比较事件: 若通道CC1配置为输出:
  352.         //设置CC1IF=1,若开启对应的中断,则产生相应的中断。若通道CC1配置为输入:
  353.         //当前的计数器值被捕获至TIM1_CCR1寄存器,设置CC1IF=1,若开启对应的中断,则产生相应的中断。若CC1IF已经为1,则设置CC1OF=1。

  354.         //Bit0: 保留位

  355.         TIM1CCMR1 =0B01101000;//CC1通道被配置为输出
  356.         //Bit7:保留位

  357.         //Bit[6:4]:输出比较1模式,该3位定义了输出参考信号OC1REF的动作,而OC1REF决定了OC1的值。OC1REF是高电平有效,而OC1的有效电平取决于CC1P位。
  358.         //000:冻结。输出比较寄存器TIM1_CCR1与计数器TIM1_CNT间的比较对OC1REF不起作用;
  359.         //001:匹配时设置通道1的输出为有效电平。当计数器TIM1_CNT的值与捕获/比较寄存器1(TIM1_CCR1)相同时,强制OC1REF为高。
  360.         //010:匹配时设置通道1的输出为无效电平。当计数器TIM1_CNT的值与捕获/比较寄存器1(TIM1_CCR1)相同时,强制OC1REF为低。
  361.         //011:翻转。当TIM1_CCR1=TIM1_CNT时,翻转OC1REF的电平。
  362.         //100:强制为无效电平。强制OC1REF为低。
  363.         //101:强制为有效电平。强制OC1REF为高。
  364.         //110:PWM模式1- 在向上计数时,一旦TIM1_CNT<TIM1_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIM1_CNT>TIM1_CCR1时通道1为无效电平(OC1REF=0), 否则为有效电平(OC1REF=1)。
  365.         //111:PWM模式2- 在向上计数时,一旦TIM1_CNT<TIM1_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIM1_CNT>TIM1_CCR1时通道1为有效电平,否则为无效电平。
  366.         //注1:一旦LOCK级别设为3(TIM1_BKR寄存器中的LOCK位)并且CC1S=00(该通道配置成输出) 则该位不能被修改。
  367.         //注2:在PWM模式1或PWM模式2中,只有当比较结果改变了或在输出比较模式中从冻结模式切换到PWM模式时,OC1REF电平才改变。(参考17.5.7PWM模式)
  368.         //注3:在有互补输出的通道上,这些位是预装载的。如果TIM1_CR2寄存器的CCPC=1,OCM 位只有在COM事件发生时,才从预装载位取新值。

  369.         //Bit3:输出比较1预装载使能
  370.         //0:禁止TIM1_CCR1寄存器的预装载功能,可随时写入TIM1_CCR1寄存器,并且新写入的数值立即起作用。
  371.         //1:开启TIM1_CCR1寄存器的预装载功能,读写操作仅对预装载寄存器操作,TIM1_CCR1的预装载值在更新事件到来时被加载至当前寄存器中。
  372.         //注1:一旦LOCK级别设为3(TIM1_BKR寄存器中的LOCK位)并且CC1S=00(该通道配置成输出) 则该位不能被修改。
  373.         //注2:为了操作正确,在PWM模式下必须使能预装载功能。但在单脉冲模式下(TIM1_CR1寄存器的OPM=1),它不是必须的?   
  374.         //Bit2:保留位

  375.         //Bit[1:0]:捕获/比较1 选择。这2位定义通道的方向(输入/输出),及输入脚的选择:
  376.         //00:CC1通道被配置为输出;
  377.         //01:CC1通道被配置为输入,IC1映射在TI1FP1上;
  378.         //10:CC1通道被配置为输入,IC1映射在TI2FP1上;
  379.         //11:CC1通道被配置为输入,IC1映射在TRC上。此模式仅工作在内部触发器输入被选中时(由
  380.         //TIM1_SMCR寄存器的TS位选择)。
  381.         //注:CC1S仅在通道关闭时(TIM1_CCER1寄存器的CC1E=0)才是可写的。

  382.         TIM1CCMR2 =0B01101000;//CC2通道被配置为输出
  383.         TIM1CCMR3 =0B01101000;//CC3通道被配置为输出
  384.         TIM1CCMR4 =0B01101000;//CC4通道被配置为输出

  385.         TIM1CCER1 =0B01000100; //--bit3 互补电平0为高1为低 bit2 互补输出 1为输出 bit1 非互补极性 0为高  bit0非互补输出 1为开启 管理 1 1N 2  2N
  386.         //Bit7:输入捕获/比较2互补输出极性。参考CC1NP的描述。

  387.         //Bit6:输入捕获/比较2互补输出使能。参考CC1NE的描述。

  388.         //Bit5:输入捕获/比较2输出极性。参考CC1P的描述。

  389.         //Bit4:输入捕获/比较2输出使能。参考CC1E的描述。

  390.         //Bit3:输入捕获/比较1互补输出极性
  391.         //0:OC1N高电平有效;
  392.         //1:OC1N低电平有效。
  393.         //注1:一旦LOCK级别(TIM1_BKR寄存器中的LCCK位)设为3或2且CC1S=00(通道配置为输出) 则该位不能被修改。

  394.         //Bit2:输入捕获/比较1互补输出使能
  395.         //0:关闭- OC1N禁止输出,因此OC1N的输出电平依赖于MOE、OSSI、OSSR、OIS1、
  396.         //OIS1N和CC1E位的值。
  397.         //1:开启- OC1N信号输出到对应的输出引脚,其输出电平依赖于MOE、OSSI、OSSR、
  398.         //OIS1、OIS1N和CC1E位的值。

  399.         //Bit1:输入捕获/比较1输出极性CC1通道配置为输出:
  400.         //0:OC1高电平有效;
  401.         //1:OC1低电平有效。
  402.         //CC1通道配置为触发(参考图61):
  403.         //0:触发发生在TI1F的高电平或上升沿;
  404.         //1:触发发生在TI1F的低电平或下降沿。
  405.         //CC1通道配置为输入(参考图61):
  406.         //0:捕捉发生在TI1F的高电平或上升沿;
  407.         //1:捕捉发生在TI1F的低电平或下降沿。
  408.         //注1:一旦LOCK级别(TIM1_BKR寄存器中的LCCK位)设为3或2,则该位不能被修改。
  409.         //COM事件发生时,CC1P位才从预装载位中取新值。
  410.             
  411.         //Bit0:输入捕获/比较1输出使能
  412.         //CC1通道配置为输出:
  413.         //0: 关闭- OC1禁止输出,因此OC1的输出电平依赖于MOE、OSSI、OSSR、OIS1、OIS1N和CC1NE位的值。
  414.         //1: 开启- OC1信号输出到对应的输出引脚,其输出电平依赖于MOE、OSSI、OSSR、OIS1、OIS1N和CC1NE位的值。CC1通道配置为输入
  415.         //该位决定了计数器的值是否能捕获入TIM1_CCR1寄存器。
  416.         //0:捕获禁止;
  417.         //0:捕获使能。

  418.         TIM1CCER2 =0B00010100; //--管理 3  3N  4通道
  419.         AFP0=0B00001100; //使用了重映射
  420.         AFP1=0B00000000;  //使用了重映射
  421.         TIM1CNTRH = 0B00000000;                //TIM1计数器
  422.         TIM1CNTRL = 0B00000000;

  423.         TIM1PSCRH = 0B00000000;
  424.         TIM1PSCRL = 0B00000000;

  425.         TIM1ARRH = 0;                //自动重载,周期
  426.         TIM1ARRL = 213;//缩小了3倍

  427.         TIM1RCR = 0B00001111;           //重复计数器的值

  428.         TIM1CCR1H =0;                //PWM脉宽
  429.         TIM1CCR1L = 0;
  430.         TIM1CCR2H =0;               //PWM脉宽
  431.         TIM1CCR2L = 0;
  432.         TIM1CCR3H = 0;               //PWM脉宽
  433.         TIM1CCR3L = 0;
  434.         TIM1CCR4H =0;               //PWM脉宽
  435.         TIM1CCR4L = 0;

  436.         TIM1BKR = 0B11000000;           //输出使能,禁止刹车
  437.         TIM1DTR = 0B00000111;           //死区发生器
  438.         //Bit[7:0]: 死区发生器设置,这些位定义了插入互补输出之间的死区持续时间。假设DT表示其持续时间,tCK_PSC为TIM1的时钟脉冲:
  439.         //DTG[7:5]=0xx => DT=DTG[7:0]x tdtg,其中: tdtg=tCK_PSC.        (f1)
  440.         //DTG[7:5]=10x => DT=(64+DTG[5:0])x tdtg,其中:tdtg= tCK_PSC.        (f2)
  441.         //DTG[7:5]=110 => DT=(32+DTG[4:0])x tdtg,其中:tdtg=8x tCK_PSC. (f3)
  442.         //DTG[7:5]=111 => DT=(32+DTG[4:0])x tdtg,其中:tdtg=16x tCK_PSC. (f4)

  443.         TIM1OISR =0B00000000; //空闲输出状态设置
  444.         //Bit1:输出空闲状态1(OC1N输出)。
  445.         //0:当MOE=0时,则在一个死区时间后,OC1N=0;
  446.         //1:当MOE=0时,则在一个死区时间后,OC1N=1。
  447.         //注:已经设置了LOCK(TIM1_BKR寄存器)级别1、2或3后,该位不能被修改。
  448.         //Bit0:输出空闲状态1(OC1输出)。
  449.         //0:当MOE=0时,如果OC1N使能,则在一个死区后,OC1=0;
  450.         //1:当MOE=0时,如果OC1N使能,则在一个死区后,OC1=1。
  451.         //注:已经设置了LOCK(TIM1_BKR寄存器)级别1、2或3后,该位不能被修改。

  452.         LEBCON =0B00000000; //前沿消隐禁止
  453.         //Bit7:前沿消隐使能位(仅当ADGO=0时可进行切换,否则ADC工作异常)
  454.         //1 = 使能
  455.         //0 = 禁止
  456.         //Bit[6:5]:前沿消隐通道选择
  457.         //00 = TIM1_CH1
  458.         //01 = TIM1_CH2
  459.         //10 = TIM1_CH3
  460.         //11 = TIM1_CH4
  461.         //Bit4:N/A        保留位,读0
  462.         //Bit3:        PWM消隐沿选择
  463.         //0 = PWM上升沿
  464.         //1 = PWM下降沿
  465.         //Bit[2:0]:TIM1的故障源使能,高有效
  466.         //BKS2:选择ADC阈值比较
  467.         //BKS1:选择LVD检测
  468.         //BKS0:选择BKIN管脚
  469.            
  470.         //GIE=1;
  471. }
  472. void Delay(uint ii)
  473. {
  474.         uint x,y;
  475.         for(x=0;x<250;x++)
  476.         for(y=ii;y>0;y--);
  477. }
  478. //===========================================================
  479. //Funtion name:main
  480. //parameters:    无
  481. //returned value:无
  482. //===========================================================
  483. void main(void)
  484. {
  485.         SysInit();
  486.         Time4Initial();
  487.         Time1Initial();//TCKSRC=0B00000011;            //TIM1时钟为HIRC的2倍?                  
  488.         Time2Initial();//TCKSRC=0B00110000;            //TIM2时钟为HIRC的2倍?  
  489.         TouchInital();
  490.         while(1)
  491.         {
  492.                 TIM1CCR1L+=21;Delay(1500);
  493.                 if(TIM1CCR1L>210)
  494.                 TIM1CCR1L=0;
  495.                
  496.                 TIM1CCR2L+=21;Delay(1500);
  497.                 if(TIM1CCR2L>210)
  498.                 TIM1CCR2L=0;
  499.                
  500.                 TIM1CCR3L+=21;Delay(1500);
  501.                 if(TIM1CCR3L>210)
  502.                 TIM1CCR3L=0;

  503.                 TIM1CCR4L+=21;Delay(1500);
  504.                 if(TIM1CCR4L>210)
  505.                 TIM1CCR4L=0;
  506.                 if(dii2>=10)//定时器2 10秒
  507.                 {
  508.                         dii2=0;
  509.                         LED1=~LED1;
  510.                 }
  511.                 if(TouchTimeCount>=(1000/SCANNINGTIME/(fmd_channels+1)))          //按键扫描频率
  512.                 {
  513.                         TouchTimeCount=0;
  514.                         GKeyValue = TouchKeyScan();                                          //按键扫描并获取按键值
  515.                 }
  516.                 switch(GKeyValue)//开关机键
  517.                 {
  518.                         case         0x1000:        
  519.                         if(flag==0)
  520.                         {
  521.                                 flag=1;
  522.                                 LED1=~LED1;
  523.                         }
  524.                         break;        
  525.                         case         0x0800:        
  526.                         if(flag==0)
  527.                         {
  528.                                 flag=1;
  529.                                 LED1=~LED1;
  530.                         }
  531.                         break;        
  532.                         case         0x0400:        
  533.                         if(flag==0)
  534.                         {
  535.                                 flag=1;
  536.                                 LED1=~LED1;
  537.                         }
  538.                         break;        
  539.                         case         0x0000:
  540.                         flag=0;
  541.                         break;        
  542.                 }                       
  543.         }
  544. }
  545. //-----------------------------------------------------
  546. void interrupt ISR(void)
  547. {  
  548.      if(T4UIE && T4UIF)                        
  549.         {
  550.                 T4UIF = 1;                           
  551.         
  552.                 TouchTimeCount++;
  553.         }
  554.         if(T2UIE && T2UIF)                        
  555.         {
  556.                 T2UIF = 1;                            //写1清零标志位            
  557.                 dii++;
  558.                 if(dii>=12500*3)
  559.                 {
  560.                         dii=0;
  561.                         dii2++;
  562.                 }
  563.         }
  564. }
复制代码
程序:在上面
原理图: 无
仿真: 无
PCB: PCB文件.7z (185.63 KB, 下载次数: 15)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶1 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表