天天看点

STC8——PWM介绍及使用1、相关寄存器2、编写流程

目录

  • 1、相关寄存器
  • 2、编写流程

1、相关寄存器

  • 增强型 PWM 控制寄存器(切换引脚功能)
STC8——PWM介绍及使用1、相关寄存器2、编写流程
  • 控制寄存器
    STC8——PWM介绍及使用1、相关寄存器2、编写流程
  • PWM 时钟选择寄存器
    STC8——PWM介绍及使用1、相关寄存器2、编写流程
  • PWM 翻转点设置计数值寄存器
    STC8——PWM介绍及使用1、相关寄存器2、编写流程
    STC8——PWM介绍及使用1、相关寄存器2、编写流程
  • PWM 计数值寄存器
    STC8——PWM介绍及使用1、相关寄存器2、编写流程
  • PWM 通道控制寄存器
    STC8——PWM介绍及使用1、相关寄存器2、编写流程

2、编写流程

  • 配置GPIO工作模式(推挽输出)
  • 切换PWM引脚
  • 设置时钟、周期
  • 设置低电平翻转值
  • 使能PWM输出
  • 启动PWM
#define PWMx_CR_BASE_ADDR 0xff04
#define PWMx_T1_BASE_ADDR 0xff00
#define PWMx_T2_BASE_ADDR 0xff02
	uint16 match_temp;
	uint16 period_temp; 
	uint8 freq_div = 0;
	
	pwm_set_gpio(pwmch);					//设置为推挽输出

	
	//清除PWM引脚
	(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) &= ~(0x03 << 3);
	//切换PWM引脚
	(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) |= (pwmch & 0x03) << 3;
	
	freq_div = (sys_clk / freq) >> 15;
	period_temp = sys_clk / freq / (freq_div + 1);				//周期
	match_temp = period_temp * ((float) duty / PWM_DUTY_MAX);	//占空比

	//设置pwmn频率为 系统时钟/freq_div
	PWMCKS = freq_div;
	//设置PWMn周期为period_temp个 PWM 时钟
	PWMC = (uint16)period_temp; 	

	// 在计数值为 match_temp 地方 pwmch 通道输出低电平
	(*(unsigned int  volatile xdata *)(PWMx_T1_BASE_ADDR + (pwmch & 0xF0))) = (uint16)match_temp;
//	// 在计数值为 match_temp 地方 pwmch 通道输出高电平
//	(*(unsigned int  volatile xdata *)(PWMx_T2_BASE_ADDR + (pwmch & 0xF0))) = (uint16)0;


	//使能 PWMx 输出
	(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) |= 1 << 7;

	PWMCR = 0x80; // 启动 PWM 模块
           

继续阅读