通過 CCxE、 CCxNE、 MOE、 OSSI 和 OSSR 位(TIMx_CCER 和TIMx_BDTR 寄存器)的組合使能 OCx 輸出。實際上,需要將TIMx_BDTR 寄存器的 MOE和AOE位置1。這就是和普通配置PWM輸出的不同點。代碼如下↓
/*******************************************************************
* 功 能:
* 作 者: Jahol Fan
* 參 數:
* 返回值:
* 其 他: PA9 PWM輸出控制轉速,PA9的復用功能1是TIM1_CH2,
TIM1:168MHZ
*******************************************************************/
void TIM1_PwmInit(u16 psc,u16 arr)
{
GPIO_Init(GPIOA,PIN9,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);
GPIO_AFSet(GPIOA,9,1); //PA9,AF1
RCC->APB2ENR |= 1<<0;//使能定時器1的時鐘
TIM1->CR1 |= 1<<7;//使用 TIM1_ARR 寄存器的影子寄存器
TIM1->CR1 &=~(1<<3);//選擇定時模式:循環定時
TIM1->CR1 &=~(1<<2);//選擇更新事件源:計數器上溢或者UG位置一都可生成更新事件
TIM1->CR1 &=~(1<<1);//使能更新事件生成
TIM1->PSC = psc-1;//設置預分頻值
TIM1->ARR = arr-1;//設置ARR自動重裝載值(上限值)。
TIM1->CCMR1 &=~(7<<12); //清零
TIM1->CCMR1 |= 6<<12;//設置為PWM模式1
TIM1->CCMR1 |=(1<<11);//使能TIM1_CCR2 的影子寄存器
TIM1->CCMR1 &=~(3<<8);//定時器通道配置為輸出。
TIM1->CCER |=(1<<5);//配置定時器通道的有效電平為低電平
TIM1->CCR2 = arr/2;//設置CCR2的值。
TIM1->BDTR |= 1<<15;//主輸出使能
TIM1->BDTR |= 1<<14;//MOE 可由軟件置 1,也可在發生下一更新事件時自動置 1(如果斷路輸入無效)
//TIM1->BDTR |= 1<<10;
//TIM1->BDTR |= 1<<11;
TIM1->EGR |= 1<<0;//UG位置1,主動生成更新事件,目的:初始化寄存器包括更新影子寄存器。
TIM1->SR = 0;//將狀態標志位清零
TIM1->CCER|=1<<4;//開啟PWM輸出
TIM1->CR1 |= 1<<0;//使能計數器
}
上一篇:基于stm32串口環形緩沖隊列處理機制—入門級(單字節)
下一篇:STM32局部變量的數組最大能到多少?
推薦閱讀
史海拾趣