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