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;
// 计数器使能,开始计数
}
本文引用地址://m.amcfsurvey.com/article/201611/320481.htmvoid 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();
}
评论