本博客的編寫目的:一、自我總結,記錄。 二、分享,輸出,加深思考。 三、不作細致如書本般編排,盡管那樣的排版很好看,但是過于耗費時間,還有很多東西沒有必要說明,完全可以自己去解決,但還是盡量做好排版,便于閱讀。 四、盡可能舉一反三,做到真正能夠處理實際問題。
有關stm32F1,stm32F4 固件驅動包的下載,請打開這篇文章: https://blog.csdn.net/xiaoeleis/article/details/105789061
STM32開發實戰 (1) 目錄
一、概述,目的 二、搭建步驟 三、時鐘部分案例分析 四、理論總結
一、概述,目的
目的:解決STM32入門問題 個人認為STM32的最快,最直接的入門方法之一就是:從STM32CubeMx+keilV5入手。無論 你采用FreeRTOS還是Keil自帶的RTX,通過圖形化的界面配置,都能快速生成項目所需的基礎層架構代碼,從而將主要精力用于自身項目需求開發上,大大提高開發效率。 上一段話包含兩層意思:1、在不熟悉STM32的情況下,如何入手學習相關的技術知識。2、在不熟悉STM32的情況下,作為公司在職開發人員,如何快速進入STM32相關的項目開發工作中,保證開發效率。
二、搭建步驟
看圖去官網或者下載站下載:STM32CubeMX,MDK5(MDK-ARM V5)
安裝完成后,就可以選擇你要使用的具體芯片型號,本篇芯片為stm32030系列 、stm32103系列
初始界面如下,圖形化的管腳配置,點點鼠標就可以,so easy!更深入的在后續章節再說。 左側欄先要注意的幾個問題: 1、你可以選擇是否使用FREERTOS 2、如果選擇外部時鐘,請務必選擇 “RCC-HSE 選項,如圖配置”否則 Input frequency 輸入選項不可更改,系統時鐘最高只能為64MHZ,達不到72MHZ 3、SYS選項,時鐘源雖然默認看起來是SysTick,但實際上沒起作用,所以,需要重新選擇一次,知道SYS標題變綠色,即選擇成功。
自己摸索一下,看看網上的教程,比如“微雪教程”。然后,菜單欄 project->Generate code
注意一些相關提示:
生成代碼之后,就可以直接打開工程了。
這是沒有安裝MDK-ARM V5的提示:
打開工程后默認的項目文件列表:
三、時鐘部分案例分析
對于單片機系統來說,CPU和總線以及外設的時鐘設置是非常重要的,因為沒有時鐘就沒有時序。
AHB總線,這是貫穿所有外設的一條總線,上圖可知:AHB經過橋接,由APB1、APB2控制著幾乎所有外設; APB2屬于高速設備; (控制著如:ADC、GPIO、EXIT、TIM1等外設) APB1屬于低速設備; (控制著如:DAC、TIMx、USART、I2C等外設)
**很多人在講解知識時,如上作以解釋,有用嗎?反正我覺得是沒用。那怎么做更好呢? 看一個我碰到的項目實例:一同事在用STM32CubeMx生成的代碼,要交到我這里來對項目代碼進行整合,代碼里用到的延時函數有兩個HAL_Delay(), osDelay(),理論上,這兩個延時函數的參數延時基準都是ms,也就是說HAL_Delay(1000), osDelay(1000)都表示延時1000ms,但是我還是要測試一下延時是否準確,因為還有其他好多地方要用到,而且對延時精度要求可能更高點**。
通過示波器測試得知osDelay(1000)是準確的,而HAL_Delay(1000)的延時值實際只有500ms,問題在哪呢?通過圖形配置部分,得知他設置的SYS 時鐘源為TIM1,那么,理論上是和APB2的FCKL2相關。我們先定得找到延時函數所用到的參數配置,看源代碼: 函數原型: __weak void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); while((HAL_GetTick() – tickstart) < Delay) { } }
–> __weak uint32_t HAL_GetTick(void) { return uwTick; } –> static __IO uint32_t uwTick; __weak void HAL_IncTick(void) { uwTick++; } –> void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) // 在 此文件下,定義了 TIM_HandleTypeDef htim1; { HAL_IncTick(); } –> __weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{ /Configure the SysTick to have interrupt in 1ms time basis/ // 1ms 中斷 時基 HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
/*Configure the SysTick IRQ priority */ HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority ,0);
/* Return function status */ return HAL_OK; } –> HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { …// 此處省略
/* Compute TIM1 clock */ uwTimclock = HAL_RCC_GetPCLK1Freq(); // 開始這里用的PCLK1
…// 此處省略 }
由uwTimclock = HAL_RCC_GetPCLK1Freq(); // 開始這里用的PCLK1,顯然不符合理論要求 串口輸出調試信息: DBSTRLONG(“PCLK1Freq”,HAL_RCC_GetPCLK1Freq()); DBSTRLONG(“PCLK2Freq”,HAL_RCC_GetPCLK2Freq());
PCLK1Freq 36000000 PCLK2Freq 18000000 由uwTimclock = HAL_RCC_GetPCLK2Freq();// 這里修改后,測試延時仍然不正確,為什么?PCLK2Freq 18000000 頻率是不對的,而要修改PCLK2Freq的值,無非就是修改APB2的分頻值。本來是可以直接再圖形配置這里直接修改的,但是我要做代碼整合,很多代碼自動升后,修改不方便,就直接通過源碼修改。在系統時鐘初始化函數里,如下: SystemClock_Config(void) { …// 此處省略 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 這里修改RCC_HCLK_DIV4 –> RCC_HCLK_DIV1 …// 此處省略 } 串口輸出調試信息: DBSTRLONG(“PCLK1Freq”,HAL_RCC_GetPCLK1Freq()); DBSTRLONG(“PCLK2Freq”,HAL_RCC_GetPCLK2Freq());
PCLK1Freq 36000000 PCLK2Freq 72000000
再次測試,結果就正確了。
上邊的問題說明三點:
1、雖然定時器(Timer)1是由APB2的PCLK2提供的時鐘輸出,但是解決問題的辦法并不是死的,所以由HAL_RCC_GetPCLK1Freq();提供的頻率輸出,結果不會錯誤,然而不符合理論要求:所以還是要在源 頭修改。特別是整合程序時,基本我不再用STM32CubeMX去自動生成代碼,不然很多代碼被自動修改,會造成很大麻煩。 2、STM32CubeMX生成的代碼,有可能存在BUG,所以調試需全面考慮。 3、在不用手冊,通過觀察CubeMX圖形配置部分,然后明確具體有關時鐘總線,外設關系的情況下,就可以找到代碼的問題所在。
然后參照上圖詳細總結一下系統時鐘的關系如下:
其中40kHz的LSI供獨立看門狗IWDG使用,另外它還可以被選擇為實時時鐘RTC的時鐘源。另外,實時時鐘RTC的時鐘源還可以選擇LSE,或者是HSE的128分頻。RTC的時鐘源通過RTCSEL[1:0]來選擇。 STM32中有一個全速功能的USB模塊,其串行接口引擎需要一個頻率為48MHz的時鐘源。該時鐘源只能從PLL輸出端獲取,可以選擇為1.5分頻或者1分頻,也就是,當需要使用USB模塊時,PLL必須使能,并且時鐘頻率配置為48MHz或72MHz。 另外,STM32還可以選擇一個時鐘信號輸出到MCO腳(PA8)上,可以選擇為PLL輸出的2分頻、HSI、HSE、或者系統時鐘。 系統時鐘SYSCLK,它是供STM32中絕大部分部件工作的時鐘源。系統時鐘可選擇為PLL輸出、HSI或者HSE。系統時鐘最大頻率為72MHz,它通過AHB分頻器分頻后送給各模塊使用,AHB分頻器可選擇1、2、4、8、16、64、128、256、512分頻。其中AHB分頻器輸出的時鐘送給5大模塊使用: ?、?、送給AHB總線、內核、內存和DMA使用的HCLK時鐘。 ?、?、通過8分頻后送給Cortex的系統定時器時鐘。 ?、?、直接送給Cortex的空閑運行時鐘FCLK。 ?、?、送給APB1分頻器。APB1分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB1外設使用(PCLK1,最大頻率36MHz),另一路送給定時器(Timer)2、3、4倍頻器使用。該倍頻器可選擇1或者2倍頻,時鐘輸出供定時器2、3、4使用。 ?、?、送給APB2分頻器。APB2分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB2外設使用(PCLK2,最大頻率72MHz),另一路送給定時器(Timer)1倍頻器使用。該倍頻器可選擇1或者2倍頻,時鐘輸出供定時器1使用。另外,APB2分頻器還有一路輸出供ADC分頻器使用,分頻后送給ADC模塊使用。ADC分頻器可選擇為2、4、6、8分頻。 在以上的時鐘輸出中,有很多是帶使能控制的,例如AHB總線時鐘、內核時鐘、各種APB1外設、APB2外設等等。當需要使用某模塊時,記得一定要先使能對應的時鐘。 需要注意的是定時器的倍頻器,當APB的分頻為1時,它的倍頻值為1,否則它的倍頻值就為2。 連接在APB1(低速外設)上的設備有:電源接口、備份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看門狗、Timer2、Timer3、Timer4。注意USB模塊雖然需要一個單獨的48MHz時鐘信號,但它應該不是供USB模塊工作的時鐘,而只是提供給串行接口引擎(SIE)使用的時鐘。USB模塊工作的時鐘應該是由APB1提供的。 連接在APB2(高速外設)上的設備有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。
196284.html
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
網絡推廣與網站優化公司(網絡優化與推廣專家)作為數字營銷領域的核心服務提供方,其價值在于通過技術手段與策略規劃幫助企業提升線上曝光度、用戶轉化率及品牌影響力。這...
在當今數字化時代,公司網站已成為企業展示形象、傳遞信息和開展業務的重要平臺。然而,對于許多公司來說,網站建設的價格是一個關鍵考量因素。本文將圍繞“公司網站建設價...
在當今的數字化時代,企業網站已成為企業展示形象、吸引客戶和開展業務的重要平臺。然而,對于許多中小企業來說,高昂的網站建設費用可能會成為其發展的瓶頸。幸運的是,隨...
我的qq群里有人發起投票怎么制止?這個不能直接刪除。車主需要遵循以下步驟。首先,點擊投票鏈接。進入投票界面后,點擊右上角,會出現刪除操作。點擊刪除,然后再次點擊投票鏈接顯示 "投票 "。最后一步,把發布廣告投票的人踢出去,拉黑。先點擊這個投票鏈接,再點擊右上角的三個點投票刪除,再點擊表示已經刪除。QQ群里匿名投票除了發起人,群主和管理員可以看到誰投了票嗎?也可以被所有員工看到,可以在群設置中看到,...
magisk怎么用?首先解鎖引導加載程序,然后輕掃恢復,然后輕掃magick。Magick可用于任何第三方系統、官方系統或官方系統。必須首先解鎖引導加載程序,然后輸入recovery,然后輸入magick。magick中的模塊不多。如果需要的話,你可以去XDA或庫安找到你需要的模塊。其實Magick是刷手機的一種方式,但需要注意的是,刷手機的風險不容忽視。有時刷錯ROM可能會導致手機變成磚頭。一些...
師生年下文的意思?1.“明年”的意思是指年輕一方占主導地位。不是BL的專屬稱號。2.少爺的導師,課后的合同,老師,逆風而行,都是經典的師生戀。高校學生的敵人(一)托人(* _ *)嘻嘻.拓人的大學生系列,講的是學長學弟。3.水鏡的《玻璃心》是這本書的學長和學妹嗎?太久了,記不起來了。水鏡的文筆很好,細膩而脆弱的感情,淡淡的卻很感人?!赌居∩返摹睹咄谩访鑼懙氖菐熒鷳?,也是師生戀。4.說白了就是師生...