极海半导体-APM32F103定时器产生PWM注意点:
1 概述
	在调试定时器时,自动重装载缓冲使能、使能输出比较通道 1 预装载、产生更新事件的概念不好理解,经过使能、禁止的对比采集PWM波形,对比这几个寄存器的概念。
	(1)数值类
| 寄存器 | 
						自动重装载寄存器(TMRx_AUTORLD) | 
| 
						寄存器位 | 
						自动重装载数值(Auto  Reload Value) | 
| 寄存器 | 
							通道 1 捕获/比较寄存器(TMRx_CC1) | 
| 
							寄存器位 | 
							CC1 包含了当前装入捕获/比较寄存器数值 | 
	(2)控制类
| 寄存器 | 
						控制寄存器 1(TMRx_CTRL1) | 
| 
						寄存器位 | 
					TMRx_AUTORLD-> ARPEN:自动重装载缓冲使能(Auto-reload  Preload Enable) | 
| 寄存器 | 
						通道x捕获/比较寄存器(TMRx_CCx) | 
| 
						寄存器位 | 
					TMRx_CCx-> OC1PEN:使能输出比较通道 1 预装载(Output Compare Channel1 Preload Enable) | 
| 寄存器 | 
						控制事件产生寄存器(TMRx_CEG) | 
| 
						寄存器位 | 
					TMRx_CEG->UEG:产生更新事件(Update  Event Generate) | 
| 寄存器数值 | 
						TMRx_AUTORLD-> ARPEN=0 | 
| 
						关键代码 | 
						//     TMR_EnableAutoReload(TMR1); | 
| 
						现象 | 
					会立刻改变频率                                                                    | 
| 寄存器数值 | 
						TMRx_AUTORLD-> ARPEN=1 | 
| 
						   关键代码 | 
						TMR_EnableAutoReload(TMR1); | 
| 
						现象 | 
					会在下一个周期(更新事件)改变频率,不会立刻改变 | 
	使能“自动重装载缓冲”时,PWM的频率会在下一个周期(更新事件)改变;
	禁止“自动重装载缓冲”时,PWM的频率会立刻改变。
	说明:代码中的GPIO翻转用作触发信号,以采集波形
	void Trigger_IO_Init(void)
	{
	   GPIO_Config_T  configStruct;
	   RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOC);
	   configStruct.pin = GPIO_PIN_0;
	   configStruct.mode = GPIO_MODE_OUT_PP;
	   configStruct.speed = GPIO_SPEED_50MHz;
	   GPIO_Config(GPIOC, &configStruct);
	}
	void SoftDelay(uint32_t counter)
	{
	     int i=0,j=0;
	     for(i=0;i<counter;i++)
	     {
	         for(j=0;j<100;j++)
	         {
	              __NOP();__NOP();__NOP();__NOP();__NOP();
	         }
	     }
	}
	int main(void)
	{
	   GPIO_Config_T GPIO_ConfigStruct;
	   TMR_BaseConfig_T TMR_TimeBaseStruct;
	   TMR_OCConfig_T OCcongigStruct;
	     uint32_tpclk1_value=0,pclk2_value;
	     Trigger_IO_Init();
	     RCM_ReadPCLKFreq(&pclk1_value,&pclk2_value);
	   RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA |RCM_APB2_PERIPH_TMR1 | RCM_APB2_PERIPH_GPIOB));
	   GPIO_ConfigStruct.pin = GPIO_PIN_13;
	   GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP;
	   GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz;
	   GPIO_Config(GPIOB, &GPIO_ConfigStruct);
	   GPIO_ConfigStruct.pin = GPIO_PIN_8;
	   GPIO_Config(GPIOA, &GPIO_ConfigStruct);
	   TMR_TimeBaseStruct.clockDivision = TMR_CLOCK_DIV_1;
	   TMR_TimeBaseStruct.countMode = TMR_COUNTER_MODE_UP;
	   TMR_TimeBaseStruct.division=720-1;     
	   TMR_TimeBaseStruct.period = 10-1;
	   TMR_ConfigTimeBase(TMR1, &TMR_TimeBaseStruct);
	   OCcongigStruct.idleState = TMR_OC_IDLE_STATE_RESET;
	   OCcongigStruct.mode = TMR_OC_MODE_PWM1;
	   OCcongigStruct.nIdleState = TMR_OC_NIDLE_STATE_RESET;
	   OCcongigStruct.nPolarity = TMR_OC_NPOLARITY_HIGH;
	   OCcongigStruct.outputNState = TMR_OC_NSTATE_ENABLE;
	   OCcongigStruct.outputState = TMR_OC_STATE_ENABLE;
	   OCcongigStruct.polarity = TMR_OC_POLARITY_HIGH;
	   OCcongigStruct.pulse = 3;
	   TMR_ConfigOC1(TMR1, &OCcongigStruct);
	   TMR_ConfigOC1Preload(TMR1, TMR_OC_PRELOAD_ENABLE);
	//   TMR_EnableAutoReload(TMR1);
	   TMR_Enable(TMR1);
	     TMR_EnablePWMOutputs(TMR1);
	     SoftDelay(100);
	     TMR_ConfigAutoreload(TMR1,20-1);
	     GPIO_SetBit(GPIOC,GPIO_PIN_0);  __NOP();__NOP();__NOP();__NOP();__NOP();
	     GPIO_ResetBit(GPIOC,GPIO_PIN_0);  __NOP();__NOP();__NOP();__NOP();__NOP();
	    while(1)
	    {
	    }
	}
 
    
 
   
   
   
  