记得之前问个原子相同的问题,本来也是想arr已经是固定的了,4个通道输出的频率只能一样了,但是还是得到原子提醒可以用输出比较的方法。于是找了相关配寄存器的资料。由于IO口紧张,不得不用高级定时器TIM1,配了两天没配出来,调试结果是频率改变不了而且周期很大,足有1s. 参考:(在网上找到原子之前与其他人讨论的方法,且已改正他最后回帖提出的错误 http://www.openedv.com/posts/list/2475.htm#13142)我是跟着他的方法配的,唯一不同的是高级定时器还要配 TIM1->BDTR|=0x8000; 这个寄存器,且已验证过他的结果可行,但我的就是配不出来。
这是我的配法:
void PWM_test(u16 psc)
{
RCC->APB2ENR|=1<<11; //TIM1时钟使能
RCC->APB2ENR|=1<<2;
GPIOA->CRH&=0XFFFF0FF0;//PA8 11 输出    A8对应CH1,PA11对应CH4
GPIOA->CRH|=0X0000B00B;//复用功能输出
GPIOA->ODR|=1<<11; //PA11,PA8上拉
GPIOA->ODR|=1<<8;
TIM1->ARR=0xffff; //装满
TIM1->  SC=psc; //预分频
TIM1->CCR1=10;
TIM1->CCR4=20;
TIM1->CCMR1|=3<<4; //CH1 输出比较模式
TIM1->CCMR2|=3<<12; //CH4 输出比较模式
TIM1->DIER|=1<<1; //CC1IE 允许捕获比较中断1
TIM1->DIER|=1<<4; //CC4IE 允许捕获比较中断4
TIM1->CCER|=1<<0; //OC1 输出使能 CC1E=1
TIM1->CCER|=1<<12; //OC4 输出使能 CC4E=1
TIM1->BDTR|=0x8000;
TIM1->CR1=0x8000; //ARPE使能
TIM1->CR1|=0x01; //使能定时器1
MY_NVIC_Init(1,3,TIM1_CC_IRQChannel,2);//抢占1,子优先级3,组2
}
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
PWM_test(719); //10K计数频率
while(1)
{
}
}
void TIM1_CC_Handler(void)
{
u16 cap;
if(TIM1->SR&0X0002) //查看CC1IF标记
{
cap=TIM1->CNT;
TIM1->CCR1 = cap + 10;
}
if(TIM1->SR&0X0010)
{
cap=TIM1->CNT;
TIM1->CCR4 = cap + 20;
}
TIM1->SR&=~(1<<1); //清标记位
TIM1->SR&=~(1<<4);
}
原子莫烦躁,希望能耐心指点迷津 。谢谢了~~~~~
|