OpenEdv-开源电子网

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

stm32f103c8t6定时器时钟实际频率比设定频率小了十倍

[复制链接]

3

主题

3

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2017-5-16
在线时间
8 小时
发表于 2020-1-22 13:07:14 | 显示全部楼层 |阅读模式
1金钱
用的德莱飞的核心板,配置完时钟后,定时器设定pwm输出模式,但是设定的200khz,示波器采集到的是22khz。这一般是什么原因呢?没有系统学习,所以不知道从哪里下手。我把相关代码贴上来。







  1. void delay_init(){
  2. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8
  3.     fac_us=SystemCoreClock/8000000;                                //为系统时钟的1/8  
  4.     fac_ms=(u16)fac_us*1000;                                        //非OS下,代表每个ms需要的systick时钟数  
  5. }

  6. void delay_us(u32 nus){               
  7.         u32 temp;                     
  8.         SysTick->LOAD=nus*fac_us;                                         //时间加载                           
  9.         SysTick->VAL=0x00;                                                //清空计数器
  10.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数          
  11.         do
  12.         {
  13.                 temp=SysTick->CTRL;
  14.         }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
  15.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
  16.         SysTick->VAL =0X00;                                               //清空计数器         
  17. }

  18. void delay_ms(u16 nms){                                     
  19.         u32 temp;                  
  20.         SysTick->LOAD=(u32)nms*fac_ms;                                //时间加载(SysTick->LOAD为24bit)
  21.         SysTick->VAL =0x00;                                                        //清空计数器
  22.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;        //开始倒数  
  23.         do
  24.         {
  25.                 temp=SysTick->CTRL;
  26.         }while((temp&0x01)&&!(temp&(1<<16)));                //等待时间到达   
  27.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;        //关闭计数器
  28.         SysTick->VAL =0X00;                                               //清空计数器                      
  29. }

  30. void uart_init(u32 bound){
  31.     //GPIO端口设置
  32.     GPIO_InitTypeDef GPIO_InitStructure;
  33.     USART_InitTypeDef USART_InitStructure;
  34.     NVIC_InitTypeDef NVIC_InitStructure;
  35.      
  36.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //使能USART1,GPIOA时钟

  37.     //USART1_TX   GPIOA.9
  38.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  39.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  40.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  41.     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9

  42.     //USART1_RX          GPIOA.10初始化
  43.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  44.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  45.     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

  46.     //Usart1 NVIC 配置
  47.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  48.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
  49.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
  50.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
  51.     NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器

  52.     //USART 初始化设置

  53.     USART_InitStructure.USART_BaudRate = bound;//串口波特率
  54.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  55.     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  56.     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  57.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  58.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  59.     USART_Init(USART1, &USART_InitStructure); //初始化串口1
  60.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
  61.     USART_Cmd(USART1, ENABLE);                    //使能串口1

  62. }

  63. void LED_Init(void){
  64.     GPIO_InitTypeDef  GPIO_InitStructure;

  65.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);         //使能PB,PE端口时钟

  66.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;                                 //LED0-->PB.5 端口配置
  67.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  68.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  69.     GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOB.5
  70.     GPIO_SetBits(GPIOB,GPIO_Pin_2);                                                 //PB.5 输出高

  71.     //        GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
  72.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                             //LED1-->PE.5 端口配置, 推挽输出
  73.     GPIO_Init(GPIOE, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
  74.     GPIO_SetBits(GPIOE,GPIO_Pin_5);                                                  //PE.5 输出高

  75.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                             //LED1-->PE.5 端口配置, 推挽输出
  76.     GPIO_Init(GPIOA, &GPIO_InitStructure);                                           //推挽输出 ,IO口速度为50MHz
  77.     GPIO_SetBits(GPIOA,GPIO_Pin_6);                                                  //PE.5 输出高 .               
  78. }

  79. void TIM3_PWM_Init(u16 arr,u16 psc){
  80.         GPIO_InitTypeDef GPIO_InitStructure;
  81.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  82.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  83.        
  84.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
  85.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设和AFIO复用功能模块时钟

  86.    //设置该引脚为复用输出功能,输出TIM3 CH1的PWM脉冲波形        GPIOA.6
  87.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
  88.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
  89.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  90.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO

  91.    //初始化TIM3
  92.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  93.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  94.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  95.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  96.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  97.        
  98.         //初始化TIM3 Channel2 PWM模式         
  99.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  100.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  101.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  102.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC1

  103.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器

  104.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3
  105.        
  106.         TIM3->CCR1 = arr/4;
  107. }

  108. int main(void){                       
  109.     u16 count;
  110.     delay_init();                     //延时函数初始化          
  111.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  112.     uart_init(115200);         //串口初始化为115200
  113.     LED_Init();                             //LED端口初始化
  114.     TIM3_PWM_Init((360-1),0);         //不分频。PWM频率=72000/(359+1)=200Khz
  115.     while(1);
  116. }
  117.    
复制代码


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

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10570
金钱
10570
注册时间
2017-2-18
在线时间
1913 小时
发表于 2020-2-3 11:29:51 | 显示全部楼层
你先确定下你代码设置芯片主频为多少,然后再去看下你的arr psc设置是否让PWM频率为200khz
回复

使用道具 举报

2

主题

20

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1159
金钱
1159
注册时间
2019-3-25
在线时间
101 小时
发表于 2020-7-18 23:57:48 | 显示全部楼层
peng1554 发表于 2020-2-3 11:29
你先确定下你代码设置芯片主频为多少,然后再去看下你的arr psc设置是否让PWM频率为200khz

你好,我也遇到同样的问题,这个怎么看芯片的主频设置呢?我在system_stm32f10x.c里看SYSCLK_FREQ_72MHz是定义成72M的,怎么实际用定时器时只到8M了,麻烦指点指点,谢谢谢谢
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2021-5-13
在线时间
24 小时
发表于 2021-10-9 11:40:44 来自手机 | 显示全部楼层
我也是这个问题哎 有大佬解决一下吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-28 01:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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