本帖最后由 nizhenyuchina 于 2020-10-16 14:13 编辑
imer4_oco_init_t OcoInit;
timer4_pwm_init_t PwmInit;
oco_low_ch_compare_mode_t LowChCmpMode;
oco_high_ch_compare_mode_t HighChCmpMode;
port_init_t PortInit;
irq_regi_conf_t IrqRegiConf;
MEM_ZERO_STRUCT( PortInit);
MEM_ZERO_STRUCT( OcoInit);
MEM_ZERO_STRUCT( PwmInit);
//设置IO
PortInit.enPinMode = Pin_Mode_Out;
PortInit.enExInt = Disable;
PortInit.enPullUp = Enable;
PortInit.enPinOType = Pin_OType_Cmos;
PORT_Init(PortB,Pin13, &PortInit);
PORT_Init(PortA,Pin08, &PortInit);
//使能外设时钟 60MHZ
PWC_Fcg2PeriphClockCmd(PWC_FCG2_PERIPH_TIM41, Enable);
////////////////////////////////////////////////////////////
//设置TIMER4定时器的计数器工作模式
//控制状态寄存器 停止计数 且清零计数器
TMR41->CCSR = 0x0050;
TMR41->CNTR = 0x0000;
TMR41->CPSR = 0xFFFF;
TMR41->CVPR = 0x0000;
//设置屏蔽的下溢中断个数
TMR41->CVPR_f.ZIM = 0;
//设置屏蔽的上溢中断个数
TMR41->CVPR_f.PIM = 0;
////////////////////////////////////
//控制状态寄存器
TMR41->CCSR_f.STOP = 1u;
//计数器时钟分频
TMR41->CCSR_f.CKDIV = Timer4CntPclkDiv1;
//锯齿波工作模式
TMR41->CCSR_f.MODE = Timer4CntSawtoothWave;
TMR41->CCSR_f.BUFEN = Enable;
TMR41->CCSR_f.ECKEN = 0;
//下溢中断关闭
TMR41->CCSR_f.IRQZEN = Disable;
//上溢中断关闭
TMR41->CCSR_f.IRQPEN = Disable;
////////////////////////////////////////////
//设定峰值(周期值)
TMR41->CPSR = MinPeriodValue;
//设定比较值
TMR41->OCCRUL = (MinPeriodValue>>1);
TMR41->OCCRUH = 120;//(MinPeriodValue>>1);
//设置TIMER4通用扩展寄存器
//////////////////////////////////////////////////////////////////
//设置OCMR寄存器 计数器上下计数 上下溢点 OCCRH OCCRL数值的关系
//计数器向下计数 & OCCRxl计数不匹配 & OCCRxh计数匹配 bit18 19
TMR41->OCMRLUL_f.EOPNDCL = OcoOpOutputHold;//;
//bit16 17
TMR41->OCMRLUL_f.EOPNUCL = OcoOpOutputHold;
//计数下溢 & OCCRxl计数不匹配 & OCCRxh计数匹配 bit31 B30
TMR41->OCMRLUL_f.EOPNZRL = 0;//OcoOpOutputHold;
// 计数下溢 & OCCRxl计数不匹配 & OCCRxh计数不匹配bit15 B14
TMR41->OCMRLUL_f.OPNZRL = OcoOpOutputLow;//OcoOpOutputHold;
// 计数上溢 & OCCRxl计数不匹配 & OCCRxh计数匹配bit29 B28
TMR41->OCMRLUL_f.EOPNPKL = OcoOpOutputHold;//
// 计数上溢 & OCCRxl计数不匹配 & OCCRxh计数不匹配bit13 B12
TMR41->OCMRLUL_f.OPNPKL = OcoOpOutputLow;//
//计数下溢 & OCCRxl计数匹配 & OCCRxh计数匹配 bit27 B26
TMR41->OCMRLUL_f.EOPZRL = OcoOpOutputHold;
//计数下溢 & OCCRxl计数匹配 & OCCRxh计数不匹配bit11 B10
TMR41->OCMRLUL_f.OPZRL = OcoOpOutputHold;
//计数器向上计数 & OCCRxl计数匹配 & OCCRxh计数匹配 bit25 B24
TMR41->OCMRLUL_f.EOPUCL = OcoOpOutputHold;
//计数器向上计数 & OCCRxl计数匹配 & OCCRxh计数不匹配bit9 B8
TMR41->OCMRLUL_f.OPUCL = OcoOpOutputHigh;
//计数上溢 & OCCRxl计数匹配 & OCCRxh计数匹配 bit23 22
TMR41->OCMRLUL_f.EOPPKL = OcoOpOutputHold;
//计数上溢 & OCCRxl计数匹配 & OCCRxh计数不匹配 bit7 B6
TMR41->OCMRLUL_f.OPPKL = OcoOpOutputHold;
//计数器向下计数 & OCCRxl计数匹配 & OCCRxh计数匹配 bit21 B20
TMR41->OCMRLUL_f.EOPDCL = OcoOpOutputHold;
//计数器向下计数 & OCCRxl计数匹配 & OCCRxh计数不匹配bit5 B4
TMR41->OCMRLUL_f.OPDCL = OcoOpOutputHold;
//计数下溢 & OCCRxl计数匹配 bit3
TMR41->OCMRLUL_f.OCFZRL = OcoOpOutputHold;
//计数器向上计数 & OCCRxl计数匹配 bit2
TMR41->OCMRLUL_f.OCFUCL = OcoOpOutputHold;//OcoOcfSetOcoOpOutputHold;
//计数上溢 & OCCRxl计数匹配 bit1
TMR41->OCMRLUL_f.OCFPKL = OcoOpOutputHold;
//计数器向下计数 & OCCRxl计数匹配 bit0
TMR41->OCMRLUL_f.OCFDCL = OcoOpOutputHold;
//////////////////////////////////////////////////////////////
//设置OCMRxl设定的动作,OCCRxl OCCRxh 是否缓冲 和何时传送
//禁止计数值与OCCRxl匹配条件的扩展控制功能 关闭
TMR41->OCERU_f.MCECL =1;//0;
//禁止计数值与OCCRxh匹配条件的扩展控制功能 关闭
TMR41->OCERU_f.MCECH =1;//0;
//周期间隔响应功能链接无效,OCMRxl的缓存传送由MLBUFEN设定决定
TMR41->OCERU_f.LMML =0;
TMR41->OCERU_f.LMMH =0;
//周期间隔响应功能链接无效,OCCRxl的缓存传送由MLBUFEN设定决定
TMR41->OCERU_f.LMCL = 0;
TMR41->OCERU_f.LMCH = 0;
//OCMRxl缓存寄存器的值直接写入OCMRxl
TMR41->OCERU_f.MLBUFEN =0;
//OCMRxh缓存寄存器的值直接写入OCMRxh
TMR41->OCERU_f.MHBUFEN =0;
//CCRxl缓存寄存器的值在计数上溢时写入OCCRxl
TMR41->OCERU_f.CLBUFEN = 2;
//CCRxh缓存寄存器的值在计数上溢时写入OCCRxh
TMR41->OCERU_f.CHBUFEN = 2;
//////////////////////////////////////////////////
//通用控制状态寄存器
TMR41->OCSRU_f.OCEH = Enable;
TMR41->OCSRU_f.OCEL = Enable;
//输出无效时端口状态
TMR41->OCSRU_f.OCPH = 0;
TMR41->OCSRU_f.OCPL = 0;
//////////////////////////////////////////////
//EMB 扩展控制寄存器
TMR4_CR->ECER1_f.EMBVAL =2;//输出低电平
//设置无效
TMR41->ECSR_f.HOLD = 0;
///////////////////////////////////////////////
//初始化PWM I/O口
PORT_SetFunc(PortB, Pin13, Func_Tim4, Disable);
PORT_SetFunc(PortA, Pin08, Func_Tim4, Disable);
////////////////////////////////////////////////////
//设置PWM,死区定时器模式 时钟分频 输出极性
TMR41->POCRU_f.DIVCK = 0 ;
TMR41->POCRU_f.PWMMD = 1 ;
TMR41->POCRU_f.LVLS = 0 ;
//
EMB2->CTL_f.PWMSEL = 7;
EMB2->CTL_f.OSCSTPEN =1;
EMB2->CTL_f.INVSEL =1;
EMB2->CTL_f.PORTINEN=1;
//设定死区时间
TMR41->PDBRU = DeadTime;
TMR41->PDARU = DeadTime;
//
TMR41->PFSRU = 0;
///////////////////////////////////
TMR41->CCSR_f.CLEAR = 1;
TMR41->CCSR_f.STOP = 0;
//PWM_Off() ;
EMB_SwBrake(EMB2, true);
唯一还有软件控制使能PWM的输出与关闭 没调试出来
|