久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17952|回復: 3
打印 上一主題 下一主題
收起左側

STM32 高級定時器TIM1“計時不準”?

[復制鏈接]
跳轉到指定樓層
樓主
ID:65608 發表于 2014-9-15 17:16 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      最近,在學習STM32單片機,選用的型號是通用型STM32F103,在學習定時器應用時,遇到了一個很頭疼的問題,懷疑STM32 高級定時器TIM1“計時不準”。       事情的來龍去脈是這樣的,之前寫了一個通過tim1定時器中斷實現led閃爍的程序,測試時led閃爍頻率和我設置的頻率一致,當我后面繼續這個程序上添加ad采樣程序后,調試時,偶然發現led閃爍頻率變慢,RCC時鐘配置和原來一樣,為什么加個ad采樣程序,會影響定時器工作,這讓我覺得非常奇怪。
       led閃爍頻率變慢,可以肯定與RCC配置和定時器配置有關,當時寫的程序如下:
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();                     
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus=RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  
FLASH_SetLatency(FLASH_Latency_2);
RCC_HCLKConfig(RCC_SYSCLK_Div1);  
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);   
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);     //16M外部晶振,16/2M*9=72
RCC_PLLCmd(ENABLE);              
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource() !=0x08);
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);      
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
}

void TIM1_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef     TIM_OCInitStructure;
TIM_DeInit(TIM1);
TIM_InternalClockConfig(TIM1);
TIM_TimeBaseStructure.TIM_Period = 2000;          //計數2000次,每2000/2K=1s產生一次中斷   
TIM_TimeBaseStructure.TIM_Prescaler = 35999;    //進行預分頻35999+1,72M/36K=2K Hz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);

TIM_PrescalerConfig(TIM1,35999,TIM_PSCReloadMode_Immediate);
TIM_ClearFlag(TIM1,TIM_FLAG_Update);
        TIM_ARRPreloadConfig(TIM1, DISABLE);
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
}


      從程序上看Tim1每一秒產生一次中斷,在中斷函數中實現led亮一秒暗一秒,但是實際led閃爍頻率會變慢,而當我改變ad采集口時,led閃爍頻率會變得更慢,配置io會影響時鐘,很無厘頭,這芯片還敢用嗎?實在沒辦法,我配置了一下Tim2,用Tim2定時中斷,結果一切都工作正常。這是什么邏輯,高級定時器tim1反而沒普通定時器tim2靠譜,無語。。。。。
       最近又查了下資料,終于發現tim1定時器有一些特有的配置功能,它可以控制溢出中斷的周期,它是由寄存器TIM1_RCR控制,如下圖所示,庫函數中是由TIM_TimeBaseStructure.TIM_RepetitionCounter 來控制


當TIM_TimeBaseStructure.TIM_RepetitionCounter=N時,表示重復溢出N次后,才產生一次中斷;當TIM_TimeBaseStructure.TIM_RepetitionCounter=0時,當然就表示溢出直接中斷。所以當在配置tim1定時器時,在TIM_TimeBaseInit();前面加一句TIM_TimeBaseStructure.TIM_RepetitionCounter=0;定時器1一切工作正常。
       問題雖然解決,但依然很奇怪的是,TIM1_RCR的復位值為0,即使我不在程序中將其置零,也不會影響它的值,為什么程序運行時它的值會莫名其妙的被改變,這個問題想不通!
       P.S. 測試時又偶然發現,TIM1和TIM2工作時的時鐘頻率都是72M,不是說TIM2是來源于APB2,是36M嗎?

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:77005 發表于 2016-5-11 23:33 | 只看該作者
哥們  特意注冊一個號來感謝你啊,這個問題困擾我好久。。。
回復

使用道具 舉報

板凳
ID:142416 發表于 2016-10-12 12:07 | 只看該作者
感謝~查了半天~終于知道了~以前能用的就是調整優化級別后出現的問題~
那個來源APB2的定時器是有一個2倍頻的~所以也是72m
回復

使用道具 舉報

地板
ID:194316 發表于 2017-4-27 19:36 | 只看該作者
哥們。我特意注冊了一個號碼,來感謝你的,今天下午排查這個問題半天,看到你的提示,解決問題了,謝謝。對于你說的為什么TIME2 時鐘會是72MHZ,你仔細看時鐘樹,當你配置住時鐘為72Mhz,經過APB1 2分頻為36MHZ,這個時鐘一個是給給了APB1外設,另外是給定時器2-7,但是給定時器2-7之前,有句話是“如果APB1預分頻系數為1,那么頻率不變,不為1,那么頻率為*2”,我們APB1預分頻系數為2,所以定時器2-7的時鐘頻率就為了72Mhz。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 糖心vlog精品一区二区 | 欧美国产日韩在线 | 一区二区网站 | 国产一区视频在线播放 | 亚洲欧美在线观看视频 | 中文字幕理论片 | 久久精品一区二区三区四区五区 | 日韩色网站 | 黄色片免费观看 | 一级黄色片网站 | 久久久精品国产sm调教 | 国产精品久久久国产盗摄 | 国产日产av| 日韩免费高清视频 | 不卡的av| 成人国产在线观看 | 日韩成人在线播放 | av免费网站 | 男人天堂久久 | 日韩综合在线 | 成人激情在线观看 | 中文字幕免费在线观看 | 国产精品一区一区三区 | 成人羞羞国产免费动态 | 成人免费看片在线观看 | h视频免费在线观看 | 永久免费视频 | 亚洲在线视频 | 日本中文字幕视频 | 精品国产乱码一区二区三 | 精品一区二区三区视频 | 成人中文字幕在线观看 | 四虎久久久| 亚洲精品久久久久avwww潮水 | 在线免费av网站 | 精品国产乱码久久久久久蜜柚 | 久久久久国产精品夜夜夜夜夜 | 久草综合在线 | 一区二区亚洲 | 高清视频一区二区 | 一本一道久久a久久精品蜜桃 |