STM8单片机PWM应用(IAR)
          
            时间:01-21 11:00 阅读:2071次
*温馨提示:点击图片可以放大观看高清大图
                
         
        
		  
               简介:本文给大家介绍了STM8单片机PWM应用(IAR)。
               
                        
          
            PD3复用功能是TIM2_CC2,正好可以用来测试PWM功能。本例程通过电位器调整PWM脉宽来调整接在PD3的LED1亮度。
#include 
void CLK_init(void)
{
  CLK_CKDIVR = 0x08;         // 16M内部RC经2分频后系统时钟为8M
}
void GPIO_init(void)
{
  PD_DDR = 0x08;             // 配置PD端口的方向寄存器PD3输出
  PD_CR1 = 0x08;             // 设置PD3为推挽输出
}
void TIM2_init(void)
{
  TIM2_CCMR2 = 0x70;         // PWM 模式 2
  TIM2_CCER1 = 0x30;         // CC2配置为输出
  TIM2_ARRH = 0x03;           // 配置PWM分辨率为10位,ARR=0x3FF
  TIM2_ARRL = 0xFF;           // PWM频率=8M/0x03FF=7820Hz
  TIM2_CR1 = 0x01;           // 计数器使能,开始计数
}
void ADC_init(void)
{
  ADC_CSR = 0x03;            // ADC输入引脚AIN3
  ADC_CR1 = 0x01;            // ADC开启
}
void Run(void)
{
  unsigned int value;
  ADC_CSR &= ~0x80;       // 清除EOC转换结束标志
  ADC_CR1 |= 0x01;           // 开始单次转换
  while(!(ADC_CSR&0x80));    // 等待单次转换完成
  value = ((int)ADC_DRH<<2); // 先读高8位,默认设置数据左对齐
  value |= ADC_DRL;                 // 再读低8位
  TIM2_CCR2H = (unsigned char)(value>>8);   // 更新CC2比较寄存器
  TIM2_CCR2L = (unsigned char)(value);
}
void init_devices(void)
{
  asm("sim");  //禁止中断
  CLK_init();
  GPIO_init();
  TIM2_init();
  ADC_init();
  asm("rim");  //使能中断
}
void main( void )
{
  init_devices();
  while(1)    Run();
}