工具/软件:Linux
我需要一个简单的连续 PWM 信号从 AM335x GPMC_AD8 [GPIO0_22]引脚输出。 无需同步、所有时序/启动都不重要、因为这只能驱动 LCD 背光以实现亮度-只需在具有几个占空比设置的1kHz 镇流器中实现某种效果。 TRM (spru73o pdf)示例15-27 pg2308非常完美。 我无法安装 BloaterWare PWM 混乱、并且在我继承的内核上没有 sysfs PWM 功能。 我似乎无法正确配置。 下面是一些用于定义我的设置序列的伪代码。 有人看不到我遗漏了什么? 该引脚仅处于 HI 位置、从不启动脉冲链。
谢谢- Steve
----
//所需的连续 PWM 输出 GPMC_ad8/GPIO0_22引脚、无需同步。
//格式为 WRITE_Some PWM_BASE_REGISTER[OFFSET]|=值
//大多数定义的名称都是按照 StarterWare 命名的
//
#define SOC_CONTRAL_REGS 0x44E10000 // TRM pg1411
#define PWM_CLOCK _ENABLE 0x2
#define PWMS_CLOCK _CONFIG 0x08
#define PER_EPWMSS0_CLKCTRL_OFFSET 0xd4
#define PER_EPWMSS1_CLKCTRL_OFFSET 0xcc
#define PER_EPWMSS2_CLKCTRL_OFFSET 0xd8
#define CONTRAL_PWMS_CTRL 0x0664 // TRM pg1449
#define CONTRAL_CONF_GPMC_AD (n)(0x0800 +(n * 4))
#define CONTRAL_CONF_GPMC_AD8 0x0820
#define SOC_PWMSS0_regs 0x48300000
#define SOC_PWMSS1_regs 0x48302000
#define SOC_PWMSS2_regs 0x48304000 //这是所需的 PWM2基址
#define SOC_ECAP_REGS 0x00000100
#define SOC_eQEP_regs 0x00000180
#define SOC_ePWM_regs 0x00000200 // ePWM 寄存器偏移
#define SOC_ePWM_2_regs (SOC_PWMSS2_regs + SOC_ePWM_regs)// epwm2 base
#define PWMS_CLOCK _CONFIG 0x08
#define PWMS_EHRPWM_CLK_EN_ACK 0x0100
#define PWMSS_CTRL_PWMSS2_TBCLKEN 0x04
// ePWMx 初始化寄存器
#define EHRPWM_TBCTL 0x0 //选择向上计数或 dwn 计数、选择时钟等
#define EHRPWM_TBSTS 0x2
#define EHRPWM_TBPHSHR 0x4
#define EHRPWM_TBPHS 0x6 //用于清除相位寄存器
#define EHRPWM_TBCTR 0x8 //这应该是 TBCNT,用于清除 TB 计数器寄存器
在 TBCLK 计数中#define EHRPWM_TBPRD 0xA //周期寄存器
#define EHRPWM_CMPCTL 0xE //设置影子模式
#define EHRPWM_CMPAHR 0x10
#define EHRPWM_CMPA 0x12 //时钟计数中的比较寄存器
#define EHRPWM_CMPB 0x14
#define EHRPWM_AQCTLA 0x16
#define EHRPWM_AQCTLB 0x18
/********
* PWM en 寄存器基地址地址0x44E00000
(二 /
printf ("启用 PWM2");
write_per_regs[per_EPWMSS2_CLKCTRL_offset]= PWM_CLOCK_ENABLE;
/*********
* PWM 寄存器基地址地址0x44E10000
(三 /
printf ("设置 pinmux CTRL \n");
//将 GPIO0_22、GPMC_AD8的引脚多路复用设置为 Mode4
//写入[0x44E10000 + 0x820]|= 0x14;//引脚 Mode4应为 ehrpwm2a,上拉使能
WRITE_PWM_REGs[CONTACT_CONF_GPMC_AD8]|= 0x14;//引脚模式4应为 ehrpwm2a、上拉使能
//启用 pwm2的时基时钟,44E10000 + 664 |= 4,TRM pg1449
//写入[0x44E10000 + 0x664]= 0;//启用所有 pwm2 tbclks
WRITE_PWM_regs[CONTINL_PWMSS_CTRL]|=~PWMSS_CTRL_PWMSS2_TBCLKEN;
/********
* pwm2寄存器基地址为0x48304000
(二 /
printf ("pwm2时序设置\n");
//启用时钟,48304000 + 08 |= 100
write_pwm2_regs[PWMSS_clock_config]|= PWMSS_EHRPWM_CLK_EN_ACK;
//设置 TBPRD、x48304200 + 0x0A、TRM pg2376
write_pwm2_regs[SOC_ePWM_regs + EHRPWM_TBPRD]|= 0x04;//根据 TRM 示例图15-27、pg2308
//清除 TBPHS、TRM pg2374、复位为0、但应清除。
write_pwm2_regs[SOC_ePWM_regs + EHRPWM_TBPHS]= 0x0;
//清除 TBCNT,TRM pg2374,重置为0。
write_pwm2_regs[SOC_ePWM_regs + EHRPWM_TBCTR]|= 0x0;
//设置 TBCTL、TRM pg2370、[0x48304000 + 0x200 + 0]|= 0xCB2、CTRMODE=2、CLKDIV=3
write_per_regs[SOC_ePWM_regs + EHRPWM_TBCTL]|= 0x0CB2;// TRM ex 图15-27
//设置比较值 A 和 B,尽管不需要 B。TRM pg2380
write_pwm2_regs[SOC_ePWM_regs + EHRPWM_CMPA]|= 0x02;
write_pwm2_regs[SOC_ePWM_regs + EHRPWM_CMPB]|= 0x02;
//设置 CMPCTL,应复位为0。
//设置 AQCTLx 寄存器、TRM pg2382、CAU=2、CAD=1、CBU=2、 CBD = 1。
write_pwm2_regs[SOC_ePWM_regs + EHRPWM_AQCTLA]|= 0x0660;
write_pwm2_regs[SOC_ePWM_regs + EHRPWM_AQCTLB]|= 0x0660;