這一章我們在前一章GPIO的工程修改。復制GPIO的工程,修改文件夾名。點擊打開STM32cubeMX的工程文件重新配置。開啟定時器TIM3,選擇內部時鐘。
定時器就相當于單片機的鬧鐘,下面我們以基本定時器為例簡單介紹一下定時器。
從上圖我們可以看到,基本定時器主要由下面三個寄存器組成。
計數器寄存器 (TIMx_CNT)
預分頻器寄存器 (TIMx_PSC)
自動重載寄存器 (TIMx_ARR)
計數器寄存器 (TIMx_CNT)存儲的是當前的計數值。預分頻器 (TIMx_PSC)為多少個SK_PSC脈沖計數一次,如圖192 預分頻器的值為1(預分頻寄存器默認為0,為不分頻),則為兩個脈沖計數一次。即為二分頻。如果要10000分頻,則預分頻器的值為1000-1。
自動重裝寄存器 (TIMx_ARR)存儲的是計數器的溢出值,例如圖194中計數器遞增計數到36計數器溢出,觸發一次事件。而實際上為37個脈沖觸發一次溢出事件(從0開始計數)。
要確定定時的時間我們必須先確定CK_PSC的頻率,TIM3配置中選擇內部時鐘作為時鐘源,查看數據手冊或者查看代碼可以知道TIM3是掛接到APB1時鐘線上。
內部時鐘設置為不分頻(CKD),則CK_PSC的時鐘頻率等于APB1的時鐘頻率108MHz,即108000 000Hz。若要定時時間為1s,則即可設置10800分頻(預分頻器寄存器 (TIMx_PSC)的值為10800-1),定時器的時鐘CK_CNT的頻率為10000Hz.則自動重載寄存器 (TIMx_ARR)設置為10000-1即定時為1s.TRGO為觸發輸出,可以觸發內部ADC/DAC,這里我們沒有用到這個功能,參數為默認設置。
定時器有如下三種計數模式
遞增計數模式:計數器從 0 計數到自動重載值,然后重新從 0 開始計數并生成計數器上溢事件。
遞減計數模式:計數器從自動重載值開始遞減到 0,然后重新從自動重載值開始計數并生成計數器下溢事件。
中心對齊模式:計數器從 0 開始計數到自動重載值 – 1 ,生成計數器上溢事件;然后從自動重載值開始向下計數到 1 并生成計數器下溢事件。之后從0 開始重新計數。
在NVIC Settings框勾選開啟定時器中斷。優先級為默認?;蛘咴贜VIC配置中使能TIM3中斷。
生成報告,以及生成代碼,編譯程序。
打開main.c文件。把main()函數里while循環上一章的代碼刪掉,while循環里面為空。在main.c文件后面USER CODE BEGIN 4 和 USER CODE END 4 中間添加中斷回調函數。定時器中斷處理函數中翻轉一次LED1~LED4的電平。
01 | /* USER CODE BEGIN 4 */ |
02 | /** |
03 | * @brief Period elapsed callback in non blocking mode |
04 | * @param htim: TIM handle |
05 | * @retval None |
06 | */ |
07 | void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) |
08 | { |
09 | if (htim->Instance == htim3.Instance) |
10 | { |
11 | /* Toggle LED */ |
12 | BSP_LED_Toggle(LED1); |
13 | BSP_LED_Toggle(LED2); |
14 | BSP_LED_Toggle(LED3); |
15 | BSP_LED_Toggle(LED4); |
16 | } |
17 | } |
18 | /* USER CODE END 4 */ |
在main.c文件中while(1)循環前面添加如果代碼啟動基本定時器中斷模式計數。
1 | /* USER CODE BEGIN 2 */ |
2 |
3 | /*##-1- Start the TIM Base generation in interrupt mode ####################*/ |
4 | HAL_TIM_Base_Start_IT(&htim3); |
5 |
6 | /* USER CODE END 2 */ |
重新編譯程序,編譯通過后下載到Open746-C開發板。按復位可以看到LED1~LED4間隔1s閃爍一次。
現在我們再次分析一下程序。工程中配置TIM3定時器選擇內部時鐘不分頻作為時鐘源,掛載到APB1時鐘總線上(108MHz),設置為遞增計數模式,預分頻器設置為10800-1,即10800分頻,最后定時器的頻率為10000HZ。一個脈沖的時間為1/10000s。則若要定時1s,則自動重載寄存器設置為10000-1(如要定時0.2s,則自動重裝寄存器設置為0.2/(1/10000)-1.即2000-1)。
在main()函數中調用HAL_TIM_Base_Start_IT(&htim3)開啟定時器,定時器從0開始計數,當計數到10000-1,即9999時,產出上溢出事件,計數器又從0開始繼續計數。由于我們開啟了定時器中斷,所以發生上溢出事件時會觸發定時器中斷。程序會轉跳到中斷服務函數中運行。我們在中斷服務函數中翻轉LED的電平。下次定時器再次溢出觸發中斷繼續翻轉LED的電平。所以我們會看到LED不斷閃爍。
上一篇:STM32CubeMX系列教程4:PWM
下一篇:STM32CubeMX系列教程2:外部中斷(EXIT)
推薦閱讀
史海拾趣
在Covid-19疫情期間,Elma展現了其應對挑戰的能力。公司引入了良好的保護措施,并不斷調整和改進以適應疫情帶來的變化。同時,Elma還積極響應市場需求,為醫療領域提供了大量旋轉開關等關鍵設備,為歐洲和東南亞的醫院做出了重大貢獻。此外,公司還為瑞士的客戶開發和制造了消毒設備,幫助當地進行疫情防控。
以上5個故事涵蓋了Elma Electronic Inc公司在電子行業發展的多個方面,展現了其強大的實力和應對挑戰的能力。
隨著科技的不斷進步和市場需求的變化,維峰電子始終將技術創新作為公司發展的核心驅動力。公司投入大量資金和人力,在研發方面取得了顯著成果。近年來,公司成功申請并獲得了多項國家專利,包括外觀設計專利、發明專利和實用新型專利等。這些專利的獲得不僅提升了公司的技術競爭力,也為客戶提供了更加優質的產品和服務。
維峰電子(WCON)于2002年在廣東成立,由創始人李文化帶領的團隊共同創立。創業初期,公司面臨著資金短缺、技術落后和市場競爭激烈等多重挑戰。然而,團隊憑借著對電子連接器行業的深刻理解和堅定信念,不斷研發新產品,優化生產工藝,逐漸在市場中站穩腳跟。他們通過不懈努力,成功開發出多款具有競爭力的電子連接器產品,為公司后續的發展奠定了堅實基礎。
ENSIGN在資本市場上的表現也備受關注。近年來,ENSIGN的股價穩步上漲,市值不斷擴大。多家投資機構對ENSIGN的前景表示樂觀,并上調了其目標股價。ENSIGN憑借其穩健的財務表現、強大的研發能力和廣闊的市場前景,吸引了眾多投資者的關注。
這些故事概述了ENSIGN在電子行業中的發展歷程和多元化戰略。通過不斷創新和拓展業務領域,ENSIGN逐漸成為了電子行業中備受矚目的企業之一。
Eurofarad公司深知品質是企業生存和發展的根本。因此,公司一直注重品質管理,建立了嚴格的質量控制體系。同時,公司還不斷提升服務水平,為客戶提供全方位的售前咨詢和售后服務。這些措施不僅提高了客戶的滿意度和忠誠度,還為公司的口碑和品牌形象增添了光彩。
為了拓展更廣闊的市場,Diode Laser Concepts公司開始實施國際化戰略。公司先是在亞洲和歐洲設立了辦事處,隨后又在美國等地建立了生產基地。通過與國際知名企業的合作,公司不僅將產品銷售到了全球各地,還積累了豐富的國際經驗,提升了品牌影響力。
摘要:在傳感器網絡中,作為上層協議和應用程序的運行基礎的操作系統有別于傳統的嵌入式操作系統,針對一個典型的傳感器網絡操作系統TinyOs,從其特點出發,采用與具體的組件代碼相結合的方式,對其體系結構、運行機制和通訊機制等關鍵技術進行分析 ...… 查看全部問答∨ |
我的平臺是 CE5.0+Monahans 300,存放鏡像的NAND為128M,RAM 64M,FlashStorge 2G; 當我系統鏡像大于32.8M的時候,我裝的A4輸入法不能用,而另外的輸入法卻能用,但系統鏡像小于等于32.8M的時候都能用。 怎么會這樣?當鏡像大于32.8M的時候,怎 ...… 查看全部問答∨ |
硬件街機游戲開發,單片機游戲開發,CPLD/FPGA、ARM平臺游戲開發群成立 本超級QQ群成立,上限人數為500。 目標是發展中國游戲產業,提升硬件游戲開發技術交流。提供大的平臺。 發展的方向是游戲動漫相結合,此群不是網絡游戲開發,為單板街機游戲開發。 所屬第三產業。以電腦板游戲開發為主體,希望大家能在這個平 ...… 查看全部問答∨ |
|
最近做個搶答器,用nrf24l01做無線收發模塊,單片機控制,其實做的時候思路不是很清晰,看了datasheet還有網上一個程序,他原本是用個3v的單片機做的,我用的這個是5v的,MI,MO,SCK口都是接的P1口那幾個最后好像沒什么反應,我是直接接上去的...昨天看了下 ...… 查看全部問答∨ |
|
短學期的實習內容是dds信號發生器的設計,單片機老師要求用430,查了幾天資料還是一頭霧水,想知道msp430f149跟ad9850的管腳是怎么接的,求高手賜教?!? 查看全部問答∨ |
|