Board logo

标题: 一天天学用IAR+STM8——PWM [打印本页]

作者: yumuzi    时间: 2010-8-10 08:36     标题: 一天天学用IAR+STM8——PWM

一天天学用IAR+STM8——PWM




  开发板上的LED1接在了PD3上,而PD3复用功能是TIM2_CC2,正好可以用来测试PWM功能。当然板上的另外2个LED也可以用,LED2对应PD2/TIM3_CC1,LED3对应PD0/TIM3_CC2。本例程通过电位器来调整LED1的亮度。
#i nclude <iostm8s207sb.h>

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开启
}
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();
}





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0