OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2623|回复: 4

TIM3输出PWM实验中关于72M与36M频率问题

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-29
在线时间
12 小时
发表于 2019-9-11 00:24:55 | 显示全部楼层 |阅读模式
在原子哥的PWM实验中,TIM3_PWM_Init(899,0); //不分频,PWM 频率=72000/900=80Khz;但是在定时器实验中有说明,APB1能输出最大的频率是36M。其中矛盾请各位指正。




源码:
void TIMER3_PWM_Init(u16 arr,u16 psc){
        TIM_TimeBaseInitTypeDef        TIM3_TimeBaseInitTypeDef;
        GPIO_InitTypeDef GPIO_PWM_InitStructure;
        TIM_OCInitTypeDef        TIM3_OCInitTypeDef;
       
        /*开始定时器和IO口时钟*/
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
       
                /*重映射PWM IO口   TIMER3_CH2->PB5*/
        GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
       
        /*初始化IO口配置*/
        GPIO_PWM_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                //复用推挽
        GPIO_PWM_InitStructure.GPIO_Pin=GPIO_Pin_5;
        GPIO_PWM_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOB,&GPIO_PWM_InitStructure);

       
        /*初始化定时器*/
        TIM3_TimeBaseInitTypeDef.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM3_TimeBaseInitTypeDef.TIM_CounterMode=TIM_CounterMode_Up;                //向上计数模式
        TIM3_TimeBaseInitTypeDef.TIM_Period=arr;                        //自动装载值
        TIM3_TimeBaseInitTypeDef.TIM_Prescaler=psc;                //预分频系数
        TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseInitTypeDef);
       
        /*初始化输出比较参数*/
        TIM3_OCInitTypeDef.TIM_OCMode=TIM_OCMode_PWM2;                                //cnt<CCR比较值无效
        TIM3_OCInitTypeDef.TIM_OCPolarity=TIM_OCPolarity_High;                //cnt>CCR,有效值为高电平
        TIM3_OCInitTypeDef.TIM_OutputState=TIM_OutputState_Enable;
        TIM_OC2Init(TIM3,&TIM3_OCInitTypeDef);
       
        /*使能预装载寄存器*/
        TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);
       
        /*使能定时器*/
        TIM_Cmd(TIM3,ENABLE);
}


主程序:
int main(void)
{
u16 led0pwmval=0;
u8 dir=1;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置 NVIC 中断分组 2
uart_init(115200); //串口初始化波特率为 115200
LED_Init(); //LED 端口初始化
TIM3_PWM_Init(899,0); //不分频,PWM 频率=72000/900=80Khz
while(1)
{
delay_ms(10);
if(dir)led0pwmval++;
else led0pwmval--;
if(led0pwmval>300)dir=0;
if(led0pwmval==0)dir=1;
TIM_SetCompare2(TIM3,led0pwmval);
}
}  


捕获.JPG
捕获.JPG
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-9-11 17:14:22 | 显示全部楼层
你最后一句应该是18M,其余是对的
回复 支持 1 反对 0

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2019-9-11 10:00:47 | 显示全部楼层
原子例程中AHB时钟72M , APB1时钟36M时钟,AHB时钟经过2分频了。所以定时器2-7的时钟为72M
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-29
在线时间
12 小时
 楼主| 发表于 2019-9-11 10:43:41 | 显示全部楼层
peng1554 发表于 2019-9-11 10:00
原子例程中AHB时钟72M , APB1时钟36M时钟,AHB时钟经过2分频了。所以定时器2-7的时钟为72M

是不是这么理解这句话,当sysclk=72M时,如果APB1预分频为1,至定时器(2~7)的频率为72M。如果APB1预分频为2,至定时器(2~7)的频率为72/2*2=72M。

如果APB1预分频为4,至定时器(2~7)的频率为72/4*2=36M。
如果APB1预分频为8,至定时器(2~7)的频率为72/8*2=9M。
捕获.JPG
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-29
在线时间
12 小时
 楼主| 发表于 2019-9-11 18:09:45 | 显示全部楼层
peng1554 发表于 2019-9-11 17:14
你最后一句应该是18M,其余是对的

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-28 14:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表