STC15系列PWM中断控制寄存器介绍以及PWM相关示例

news2024/12/24 2:23:08

STC15系列PWM中断控制寄存器介绍以及PWM呼吸灯代码实现


  • 📌相关篇《STC15系列PWM功能相关功能寄存器介绍》
  • ✨以下数据来源于stc15手册。

📓增强型PWM波形发生器的中断控制

在这里插入图片描述

1.PWM中断优先级控制寄存器:IP2在这里插入图片描述

  • PPWMFD:PWM异常检测中断优先级控制位。
    当PPWMFD=0时,PWM异常检测中断为最低优先级中断(优先级0)
    当PPWMFD-1时,PWM异常检测中断为最高优先级中断(优先级1)
  • PPWM: PWM中断优先级控制位。
    当PPWM=0时,PWM中断为最低优先级中断(优先级0)
    当PPWM=1时,PWM中断为最高优先级中断(优先级1

中断优先级控制寄存器IP和IP2的各位都由可用户程序置“1”和清“0”。但IP寄存器可位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IP2寄存器的内容只能用字节操作指令来更新。STC15系列单片机复位后IP和IP2均为00H,各个中断源均为低优先级中断。

2. PWM控制寄存器:PWMCR

在这里插入图片描述

  • ECBI :PWM计数器归零中断使能位
    0:关闭PWM计数器归零中断(CBIF依然会被硬件置位)
    1:使能PWM计数器归零中断

3. PWM中断标志寄存器:PWMIF

在这里插入图片描述

  • CBIF :PWM计数器归零中断标志位
    当PWM计数器归零时,硬件自动将此位置1。当ECBI==1时,程序会跳转到相应中断
    入口执行中断服务程序。需要软件清零。
  • C7IF :第7通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C7IF(详见EC7T1SI和EC7T2SI)。当PWM发生翻转时,硬件自动将此位置1。当EPWM7I==1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
  • C6IF:第6通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C6IF (详见EC6TISI和EC6T2SI)当PWM发生翻转时,硬件自动将此位置1。程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
  • C5IF:第S通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发CSIF(详见ECSTISI和ECST2SI) 。当PWM发生翻转当EPWMSI–1时,程序会跳转到相应中断入口执行中断服时,硬件自动将此位置1。务程序。需要软件清零。
  • C4IF:第4通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C4IF (详见EC4TISI和EC4T2SI) 。当PWM发生翻转时,硬件自动将此位置1。当EPWM4–1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
  • C3FF:第3通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C3IF (详见EC3TISI和EC3T2SI) 。当PWM发生翻转时,硬件自动将此位置1。当EPWM3I–1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。
  • C2IF:第2通道的PWM中断标志位
    可设置在翻转点1和翻转点2触发C2IF (详见EC2T1SI和EC2T2SI) 。当PWM发生翻转时,硬件自动将此位置1。当EPWM2I–1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。

4. PWM外部异常控制寄存器:PWMFDCR

在这里插入图片描述

  • EFDI :PWM异常检测中断使能位
    0:关闭PWM异常检测中断(FDIF�然会被硬件置位)
    1:使能PWM异常检测中断
  • FDIF :PWM异常检测中断标志位
    当发生PWM异常(比较器正极P5.5/CMP+的电平比比较器负极P5.4/CMP-的电平高
    或比较器正极 比较器正极P5.5/CMP+的电平比内部参考电压源1.28V高或者P2.4的电平为高) 为高)
    时,硬件自动将此位置1。当EFDI==1时,程序会跳转到相应中断入口执行中断服务程序。需要软件清零。

5. PWM2的控制寄存器:PWM2CR

在这里插入图片描述

  • EPWM2I :PWM2中断使能控制位
    0:关闭PWM2中断
    1:使能PWM2中断,当C2IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC2T2SI:PWM2的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C2正F置1,此时若EPWM2I–1,则程序将跳转到相应中断入口执行中断服务程序
  • EC2T1SI :PWM2的T1匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C2IF置1,此时若EPWM2I==1,则程序将跳转到相应中断入口执行中断服务程序。

6. PWM3的控制寄存器:PWM3CR

在这里插入图片描述

  • EPWM3I :PWM3中断使能控制位
    0:关闭PWM3中断
    1:使能PWM3中断,当C3IF被硬件置1时,程序将跳转到相应中断入口执行中断服务
    程序。
  • EC3T2SI :PWM3的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C3IF置1,此时若EPWM3I==1,则程序将跳转到相应中断入口执行中断服务程序。
  • EC3T1SI :PWM3的T1匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C3IF置1,此时若EPWM3I==1,则程序将跳转到相应中断入口执行中断服务程序。

7.PWM4的控制寄存器: PWM4CR

  • EPWM4I :PWM4中断使能控制位
    0:关闭PWM4中断
    1:使能PWM4中断,当C4IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC4T2SI :PWM4的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C4IF置1,此时若EPWM4I==1,则程序将跳转到相应中断入口执行中断服务程序。
  • EC4T1SI :PWM4的T1匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C4IF置1,此时若EPWM4I==1,则程序将跳转到相应中断入口执行中断服务程序。

8. PWM5的控制寄存器:PWM5CR

在这里插入图片描述

  • EPWM5I :PWM5中断使能控制位
    0:关闭PWM5中断
    1:使能PWM5中断,当C5IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC5T2SI :PWM5的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C5IF置1,此时若EPWM5I==1,则程序将跳转到相应中断入口执行中断服务程序。
  • ECSTISI:PWM5的Tl配发生波形翻转时的中断控制位
    0: 关闭TI翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将CSIF置1,此时若EPWMSI==1,则程序将跳转到相应中断入口执行中断服务程序

9.PWM6的控制寄存器:PWM6CR

在这里插入图片描述

  • EPWM6I :PWM6中断使能控制位
    0:关闭PWM6中断
    1:使能PWM6中断,当C6IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC6T2SI :PWM6的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C6IF置1,此时若EPWM6I==1,则程序将跳转到相应中断入口执行中断服务程序。
  • EC6T1SI :PWM6的T1匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C6IF置1,此时若EPWM6I==1,则程序将跳转到相应中断入口执行中断服务程序。

10. PWM7的控制寄存器:PWM7CR在这里插入图片描述

  • EPWM7I :PWM7中断使能控制位
    0:关闭PWM7中断
    1:使能PWM7中断,当C7IF被硬件置1时,程序将跳转到相应中断入口执行中断服务程序。
  • EC7T2SI:PWM7的T2匹配发生波形翻转时的中断控制位
    0:关闭T2翻转时中断
    1:使能T2翻转时中断,当PWM波形发生器内部计数值与T2计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C7IF置1,此时若EPWM7I–1,则程序将跳转到相应中断入口执行中断服务程序。
  • EC7TISI:PWM7的TI匹配发生波形翻转时的中断控制位
    0:关闭T1翻转时中断
    1:使能T1翻转时中断,当PWM波形发生器内部计数值与T1计数器所设定的值相匹配时,PWM的波形发生翻转,同时硬件将C7IF置1,此时若EPWM7I-1,则程序将跳转到相应中断入口执行中断服务程序。

中断向量地址及中断控制

在这里插入图片描述

  • 在Keil C中声明中断函数:
void PWM_Routine(void)  interrupt 22;
void PWMFD_Routine(void) interrupt 23;
  • PWM波形发生器的结构框图
    在这里插入图片描述

🌻PWM呼吸灯实现代码

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15Fxx 系列 使用PWM实现渐变灯实例-----------------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


#include "reg51.h"

#define CYCLE   0x1000L     //4096定义PWM周期2.7KHz

#define PWMC        (*(unsigned int  volatile xdata *)0xfff0)
#define PWMCH       (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL       (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS      (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1      (*(unsigned int  volatile xdata *)0xff00)
#define PWM2T1H     (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L     (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2      (*(unsigned int  volatile xdata *)0xff02)
#define PWM2T2H     (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L     (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR      (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1      (*(unsigned int  volatile xdata *)0xff10)
#define PWM3T1H     (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L     (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2      (*(unsigned int  volatile xdata *)0xff12)
#define PWM3T2H     (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L     (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR      (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1      (*(unsigned int  volatile xdata *)0xff20)
#define PWM4T1H     (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L     (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2      (*(unsigned int  volatile xdata *)0xff22)
#define PWM4T2H     (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L     (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR      (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1      (*(unsigned int  volatile xdata *)0xff30)
#define PWM5T1H     (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L     (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2      (*(unsigned int  volatile xdata *)0xff32)
#define PWM5T2H     (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L     (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR      (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1      (*(unsigned int  volatile xdata *)0xff40)
#define PWM6T1H     (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L     (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2      (*(unsigned int  volatile xdata *)0xff42)
#define PWM6T2H     (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L     (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR      (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1      (*(unsigned int  volatile xdata *)0xff50)
#define PWM7T1H     (*(unsigned char volatile xdata *)0xff50)
#define PWM7T1L     (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2      (*(unsigned int  volatile xdata *)0xff52)
#define PWM7T2H     (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L     (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR      (*(unsigned char volatile xdata *)0xff54)

sfr PIN_SW2 =   0xba;

sfr P0M1    =   0x93;
sfr P0M0    =   0x94;
sfr P1M1    =   0x91;
sfr P1M0    =   0x92;
sfr P2M1    =   0x95;
sfr P2M0    =   0x96;
sfr P3M1    =   0xb1;
sfr P3M0    =   0xb2;
sfr P4M1    =   0xb3;
sfr P4M0    =   0xb4;
sfr P5M1    =   0xC9;
sfr P5M0    =   0xCA;
sfr P6M1    =   0xCB;
sfr P6M0    =   0xCC;
sfr P7M1    =   0xE1;
sfr P7M0    =   0xE2;

sfr PWMCFG  =   0xf1;
sfr PWMCR   =   0xf5;
sfr PWMIF   =   0xf6;
sfr PWMFDCR =   0xf7;

void pwm_isr() interrupt 22
{
    static bit dir = 1;
    static int val = 0;
    
    if (PWMIF & 0x40)
    {
        PWMIF &= ~0x40;
        
        if (dir)
        {
            val++;
            if (val >= CYCLE) dir = 0;
        }
        else
        {
            val--;
            if (val <= 1) dir = 1;
        }
        PIN_SW2 |= 0x80;
        PWM2T2 = val;
        PIN_SW2 &= ~0x80;
    }
}

void main()
{
    P0M0 = 0x00;//配置IO组为准双向口
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;

    PIN_SW2 |= 0x80;                //使能访问XSFR
    PWMCFG = 0x00;                  //配置PWM的输出初始电平为低电平
    PWMCKS = 0x00;                  //选择PWM的时钟为Fosc/1
    PWMC = CYCLE;                   //设置PWM周期
    PWM2T1 = 0x0000;                //设置PWM2第1次反转的PWM计数
    PWM2T2 = 0x0001;                //设置PWM2第2次反转的PWM计数
                                    //占空比为(PWM2T2-PWM2T1)/PWMC
    PWM2CR = 0x00;                  //选择PWM2输出到P3.7,不使能PWM2中断
    PWMCR = 0x01;                   //使能PWM信号输出
    PWMCR |= 0x40;                  //使能PWM归零中断
    PWMCR |= 0x80;                  //使能PWM模块
    PIN_SW2 &= ~0x80;

    EA = 1;

    while (1);
}


🌼使用增强型PWM控制舞台灯光示例

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15Fxx 系列 使用增强型PWM控制舞台灯光示例---------------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


#include "reg51.h"

#define CYCLE   0x1000L     //定义PWM周期(最大值为32767)

#define PWMC        (*(unsigned int  volatile xdata *)0xfff0)
#define PWMCH       (*(unsigned char volatile xdata *)0xfff0)
#define PWMCL       (*(unsigned char volatile xdata *)0xfff1)
#define PWMCKS      (*(unsigned char volatile xdata *)0xfff2)
#define PWM2T1      (*(unsigned int  volatile xdata *)0xff00)
#define PWM2T1H     (*(unsigned char volatile xdata *)0xff00)
#define PWM2T1L     (*(unsigned char volatile xdata *)0xff01)
#define PWM2T2      (*(unsigned int  volatile xdata *)0xff02)
#define PWM2T2H     (*(unsigned char volatile xdata *)0xff02)
#define PWM2T2L     (*(unsigned char volatile xdata *)0xff03)
#define PWM2CR      (*(unsigned char volatile xdata *)0xff04)
#define PWM3T1      (*(unsigned int  volatile xdata *)0xff10)
#define PWM3T1H     (*(unsigned char volatile xdata *)0xff10)
#define PWM3T1L     (*(unsigned char volatile xdata *)0xff11)
#define PWM3T2      (*(unsigned int  volatile xdata *)0xff12)
#define PWM3T2H     (*(unsigned char volatile xdata *)0xff12)
#define PWM3T2L     (*(unsigned char volatile xdata *)0xff13)
#define PWM3CR      (*(unsigned char volatile xdata *)0xff14)
#define PWM4T1      (*(unsigned int  volatile xdata *)0xff20)
#define PWM4T1H     (*(unsigned char volatile xdata *)0xff20)
#define PWM4T1L     (*(unsigned char volatile xdata *)0xff21)
#define PWM4T2      (*(unsigned int  volatile xdata *)0xff22)
#define PWM4T2H     (*(unsigned char volatile xdata *)0xff22)
#define PWM4T2L     (*(unsigned char volatile xdata *)0xff23)
#define PWM4CR      (*(unsigned char volatile xdata *)0xff24)
#define PWM5T1      (*(unsigned int  volatile xdata *)0xff30)
#define PWM5T1H     (*(unsigned char volatile xdata *)0xff30)
#define PWM5T1L     (*(unsigned char volatile xdata *)0xff31)
#define PWM5T2      (*(unsigned int  volatile xdata *)0xff32)
#define PWM5T2H     (*(unsigned char volatile xdata *)0xff32)
#define PWM5T2L     (*(unsigned char volatile xdata *)0xff33)
#define PWM5CR      (*(unsigned char volatile xdata *)0xff34)
#define PWM6T1      (*(unsigned int  volatile xdata *)0xff40)
#define PWM6T1H     (*(unsigned char volatile xdata *)0xff40)
#define PWM6T1L     (*(unsigned char volatile xdata *)0xff41)
#define PWM6T2      (*(unsigned int  volatile xdata *)0xff42)
#define PWM6T2H     (*(unsigned char volatile xdata *)0xff42)
#define PWM6T2L     (*(unsigned char volatile xdata *)0xff43)
#define PWM6CR      (*(unsigned char volatile xdata *)0xff44)
#define PWM7T1      (*(unsigned int  volatile xdata *)0xff50)
#define PWM7T1H     (*(unsigned char volatile xdata *)0xff50)
#define PWM7T1L     (*(unsigned char volatile xdata *)0xff51)
#define PWM7T2      (*(unsigned int  volatile xdata *)0xff52)
#define PWM7T2H     (*(unsigned char volatile xdata *)0xff52)
#define PWM7T2L     (*(unsigned char volatile xdata *)0xff53)
#define PWM7CR      (*(unsigned char volatile xdata *)0xff54)

sfr P_SW2   =   0xba;

sfr P0M1    =   0x93;
sfr P0M0    =   0x94;
sfr P1M1    =   0x91;
sfr P1M0    =   0x92;
sfr P2M1    =   0x95;
sfr P2M0    =   0x96;
sfr P3M1    =   0xb1;
sfr P3M0    =   0xb2;
sfr P4M1    =   0xb3;
sfr P4M0    =   0xb4;
sfr P5M1    =   0xC9;
sfr P5M0    =   0xCA;
sfr P6M1    =   0xCB;
sfr P6M0    =   0xCC;
sfr P7M1    =   0xE1;
sfr P7M0    =   0xE2;

sfr PWMCFG  =   0xf1;
sfr PWMCR   =   0xf5;
sfr PWMIF   =   0xf6;
sfr PWMFDCR =   0xf7;

sbit PWM2   =   P3^7;
sbit PWM3   =   P2^1;
sbit PWM4   =   P2^2;
sbit PWM5   =   P2^3;
sbit PWM6   =   P0^7;
sbit PWM7   =   P0^6;

void PWM_config(void);

void PWM2_SetPwmWide(unsigned short Wide);
void PWM3_SetPwmWide(unsigned short Wide);
void PWM4_SetPwmWide(unsigned short Wide);
void PWM5_SetPwmWide(unsigned short Wide);
void PWM6_SetPwmWide(unsigned short Wide);
void PWM7_SetPwmWide(unsigned short Wide);

void main()
{
    PWM_config();

    PWM2_SetPwmWide(0);         //输出全低电平
    PWM3_SetPwmWide(1);         //输出1/2550高电平
    PWM4_SetPwmWide(CYCLE);     //输出全高电平
    PWM5_SetPwmWide(CYCLE-1);   //输出2549/2550低电平
    PWM6_SetPwmWide(CYCLE/2);   //输出1/2高电平
    PWM7_SetPwmWide(CYCLE/3);   //输出1/3高电平

    while (1);
}

void PWM_config(void)
{
    P0M0 &= ~0xc0;
    P0M1 &= ~0xc0;
    P0 &= ~0xc0;                    //设置P0.6/.P0.7电平
    P2M0 &= ~0x0e;
    P2M1 &= ~0x0e;
    P2 &= ~0x0e;                    //设置P2.1/P2.2/P2.3电平
    P3M0 &= ~0x80;
    P3M1 &= ~0x80;
    P3 &= ~0x80;                    //设置P3.7电平

    P_SW2 |= 0x80;

    PWMCKS = 0x00;
    PWMC = CYCLE;                   //设置PWM周期
    PWM2T1 = 1;
    PWM2T2 = 0;
    PWM2CR = 0x00;                  //PWM2输出到P3.7
    PWM3T1 = 1;
    PWM3T2 = 0;
    PWM3CR = 0x00;                  //PWM3输出到P2.1
    PWM4T1 = 1;
    PWM4T2 = 0;
    PWM4CR = 0x00;                  //PWM4输出到P2.2
    PWM5T1 = 1;
    PWM5T2 = 0;
    PWM5CR = 0x00;                  //PWM5输出到P2.3
    PWM6T1 = 1;
    PWM6T2 = 0;
    PWM6CR = 0x08;                  //PWM6输出到P0.7
    PWM7T1 = 1;
    PWM7T2 = 0;
    PWM7CR = 0x08;                  //PWM7输出到P0.6
    PWMCFG = 0x00;                  //配置PWM的输出初始电平
    PWMCR = 0x3f;                   //使能PWM信号输出
    PWMCR |= 0x80;                  //使能PWM模块
    P_SW2 &= ~0x80;
}

void PWM2_SetPwmWide(unsigned short Wide)
{
    if (Wide == 0)
    {
        PWMCR &= ~0x01;
        PWM2 = 0;
    }
    else if (Wide == CYCLE)
    {
        PWMCR &= ~0x01;
        PWM2 = 1;
    }
    else
    {
        P_SW2 |= 0x80;
        PWM2T1 = Wide;
        P_SW2 &= ~0x80;
        PWMCR |= 0x01;
    }
}

void PWM3_SetPwmWide(unsigned short Wide)
{
    if (Wide == 0)
    {
        PWMCR &= ~0x02;
        PWM3 = 0;
    }
    else if (Wide == CYCLE)
    {
        PWMCR &= ~0x02;
        PWM3 = 1;
    }
    else
    {
        P_SW2 |= 0x80;
        PWM3T1 = Wide;
        P_SW2 &= ~0x80;
        PWMCR |= 0x02;
    }
}

void PWM4_SetPwmWide(unsigned short Wide)
{
    if (Wide == 0)
    {
        PWMCR &= ~0x04;
        PWM4 = 0;
    }
    else if (Wide == CYCLE)
    {
        PWMCR &= ~0x04;
        PWM4 = 1;
    }
    else
    {
        P_SW2 |= 0x80;
        PWM4T1 = Wide;
        P_SW2 &= ~0x80;
        PWMCR |= 0x04;
    }
}

void PWM5_SetPwmWide(unsigned short Wide)
{
    if (Wide == 0)
    {
        PWMCR &= ~0x08;
        PWM5 = 0;
    }
    else if (Wide == CYCLE)
    {
        PWMCR &= ~0x08;
        PWM5 = 1;
    }
    else
    {
        P_SW2 |= 0x80;
        PWM5T1 = Wide;
        P_SW2 &= ~0x80;
        PWMCR |= 0x08;
    }
}

void PWM6_SetPwmWide(unsigned short Wide)
{
    if (Wide == 0)
    {
        PWMCR &= ~0x10;
        PWM6 = 0;
    }
    else if (Wide == CYCLE)
    {
        PWMCR &= ~0x10;
        PWM6 = 1;
    }
    else
    {
        P_SW2 |= 0x80;
        PWM6T1 = Wide;
        P_SW2 &= ~0x80;
        PWMCR |= 0x10;
    }
}

void PWM7_SetPwmWide(unsigned short Wide)
{
    if (Wide == 0)
    {
        PWMCR &= ~0x20;
        PWM7 = 0;
    }
    else if (Wide == CYCLE)
    {
        PWMCR &= ~0x20;
        PWM7 = 1;
    }
    else
    {
        P_SW2 |= 0x80;
        PWM7T1 = Wide;
        P_SW2 &= ~0x80;
        PWMCR |= 0x20;
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序员010宠物交易系统商城系统

宠物交易系统商城系统分为用户小程序端和管理员后台网页端&#xff0c;其中后端是采用java编程语言&#xff0c;mysql数据库&#xff0c;idea开发工具&#xff0c;ssm框架开发&#xff0c;本系统分为用户和管理员两个端&#xff0c;其中用户可以在小程序端进行注册登陆&#xf…

嵌入式Linux从入门到精通之第十节:系统编程之进程

进程的定义 程序:程序是存放在存储介质上的一个可执行文件。进程:进程是程序的执行实例,包括程序计数器、寄存器和变量的当前值。程序是静态的,进程是动态的: 程序是一些指令的有序集合,而进程是程序执行的过程。进程的状态是变化的,其包括进程的创建、调度和消亡。 在…

【微服务】分布式搜索引擎elasticsearch(1)

分布式搜索引擎elasticsearch&#xff08;1&#xff09;1.elasticsearch1.1.了解ES1.1.1.elasticsearch的作用1.1.2.ELK技术栈1.1.3.elasticsearch和lucene1.1.4.为什么不是其他搜索技术&#xff1f;1.1.5.总结1.2.倒排索引1.2.1.正向索引1.2.2.倒排索引1.2.3.正向和倒排1.3.es…

08-linux网络管理-nc命令(TCP|UDP网络联通测试,文件传输,带宽测试)

文章目录1. 安装2. 选项2.1 帮助命令2.2 常用示例- 监听TCP端口&#xff08;默认&#xff09;- 监听UDP端口- 链接TCP端口- 链接UDP端口- 接收数据重定向- 上传数据3. 完整示例3.1 示例1&#xff08;端口联通检查&#xff09;3.2 示例2&#xff08;文件传输&#xff09;3.3 带宽…

Linux权限的基本知识

本文已收录至《Linux知识与编程》专栏&#xff01;作者&#xff1a;ARMCSKGT演示环境&#xff1a;CentOS 7 目录 前言 正文 权限是什么&#xff1f; Linux权限的划分 Linux用户的切换命令 Linux文件权限 Linux文件类型 Linux文件权限 Linux角色划分 文件权限的访问和…

buu [MRCTF2020]keyboard 1

题目描述&#xff1a; 题目分析&#xff1a; 由标题keyboard可知与键盘有关 看到一串数字有重复的&#xff0c;且重复数在1~4之间&#xff0c;符合九键拼音键盘 个数便对应位数 例如&#xff1a;6对应m , 666对应o 所以以上对应下来是 “mobilephond” 试过之后不对&#…

Unity-Tcp-网络聊天功能(一): 基本功能

Protobuff的效率较高。TCP用于延迟不高的游戏效果较好&#xff0c;UDP对开发人员友好&#xff08;对于消息的重发等&#xff0c;降低网络延迟&#xff09;&#xff0c;Websocket在网页端H5端进行通信&#xff0c;1.TCP相关API介绍与服务端编写TCP是面向连接的。因此需要创建监听…

【JavaEE多线程】synchronized原理篇

目录 一、synchronized的优化机制 1)无锁状态 2)偏向锁状态:非必要&#xff0c;不加锁 3)轻量级锁 4)重量级锁&#xff1a;挂起等待 二、锁消除 三、锁粗化 锁的粒度 锁粗化的好处 在这一篇文章当中&#xff0c;我们也提到了synchronized的作用。 Java对于synchroniz…

Python super()函数:调用父类的构造方法

Python 中子类会继承父类所有的类属性和类方法。严格来说&#xff0c;类的构造方法其实就是实例方法&#xff0c;因此毫无疑问&#xff0c;父类的构造方法&#xff0c;子类同样会继承。但我们知道&#xff0c;Python 是一门支持多继承的面向对象编程语言&#xff0c;如果子类继…

『Nonebot 插件编写教程』nonebot2处理消息的完整过程

文章目录前言捕获消息处理消息Bot机器人参数Event事件参数回复消息字符串与Message调用MessageSegment接口前言 前面已经有不止一篇博客教大家如何搭建nonebot2环境了大家可以去专栏查看&#xff0c;这篇博客并不会再次带大家来搭建nonebot2环境&#xff0c;而是着手与插件的编…

【微服务】Sentinel规则持久化

Sentinel 规则持久化 一、修改微服务 修改微服务&#xff0c;让其监听Nacos中的sentinel规则配置。 具体步骤如下&#xff1a; 1.引入依赖 在order-service中引入sentinel监听nacos的依赖&#xff1a; <dependency><groupId>com.alibaba.csp</groupId>…

数据结构实验三: 图的操作与实现

数据结构实验一:线性表,堆栈和队列实现 数据结构实验二 :二叉树的操作与实现 数据结构实验三: 图的操作与实现 数据结构实验四 : 查找和排序算法实现 文章目录一、实验目的&#xff1a;二、使用仪器、器材三、实验内容及原理1、教材P310实验题1&#xff1a;实现图的邻接矩阵和邻…

Springboot扩展点之BeanFactoryPostProcessor

Springboot扩展点之BeanFactoryPostProcessor1.功能特性BeanFactoryPostProcessor的执行是Spring Bean生命周期非常重要的一部分&#xff1b; BeanFactory级别的后置处理器&#xff0c;在Spring生命周期内&#xff0c;org.springframework.beans.factory.config.BeanFactoryPos…

【C语言】10题相关讲解+总结----有用的知识1

总结【C语言】10题&#xff0c;有兴趣的可以看看1.结构体与typedef联系2.结构体中涉及的操作符3.指针数组与数组指针4.数组首元素的作用5.喝汽水问题6.上三角矩阵判定7 矩阵相等判定8.VS调试技巧9.Debug与Release关系10.调整奇数偶数顺序11.有序序列合并1.结构体与typedef联系 …

开发互动直播应用很简单:声网 Android Demo保姆级运行教程

本文作者是来自声网开发者社区的用户“Xiaohua”。 前言 本人在参与《声网开发者漫游指南》期间&#xff0c;通过学习了解和学会跑通声网的实时互动Demo&#xff0c;但因为课程提供的demo是移动端和pc端的&#xff0c;很少接触过&#xff0c;所以只能花点时间学习一下才能运行…

如何屏蔽 iOS 软件自动更新,去除更新通知和标记

如何禁用 iPhone、iPad 软件自动更新。适用于 iOS、iPadOS 和 watchOS&#xff0c;即 iPhone、iPad 和 Apple Watch 通用。 请访问原文链接&#xff1a;https://sysin.org/blog/disable-ios-update/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&a…

WebAssembly编译之(4)-WASM编译进阶(多文件、多接口)

引言 上一节我们讲到如何用Emscripten将一个C编译陈wasm&#xff0c;并导出可供Javascirpt调用的接口&#xff0c;以及C导出类的函数接口、导出类的封装对象等。然而&#xff0c;编译的方式比较玛法&#xff0c;有没办法能更友好一点实现wasm的编译呢 WASM 相关文档&#xff1a…

【自学Docker】Docker diff命令

Docker diff命令 大纲 docker diff命令教程 docker diff 命令用于比较一个 Docker容器 不同版本提交的文件差异。该命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker diff命令会列出 3 种容器内文件状态变化&#xff08;A - Add, D - Delete, C - Chang…

Java-基础-3.容器

一&#xff1a;为什么会出现容器&#xff1f; 在之前的学习中&#xff0c;我们学习了变量和常量。都是一个字符或者字符串&#xff0c;数字的情况。但是在实际的生产中&#xff0c;我们一次会接受到很多类型不同&#xff0c;个数不同的数据。所以&#xff0c;为了方便我们后续…

红杉:2022企业数字化年度指南

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年12月份热门报告盘点罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿2023年&#xff0c;如何科学制定年度规划&#xff1f;《底层逻辑》高清配图华为2021数字…