GreenTco https://bbs.21ic.com/?49073 [收藏] [复制] [RSS]

日志

一天天学用IAR+STM8——PWM

已有 5506 次阅读2010-8-9 04:44 |个人分类:软件专题|系统分类:单片机| 学习, 编程, IAR, STM8

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


#include <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();
}


 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)