stm32开发教程_单片机STM32
本博客的編寫目的:
一、自我總結(jié),記錄。
二、分享,輸出,加深思考。
三、不作細致如書本般編排,盡管那樣的排版很好看,但是過于耗費時間,還有很多東西沒有必要說明,完全可以自己去解決,但還是盡量做好排版,便于閱讀。
四、盡可能舉一反三,做到真正能夠處理實際問題。
有關(guān)stm32F1,stm32F4 固件驅(qū)動包的下載,請打開這篇文章:
https://blog.csdn.net/xiaoeleis/article/details/105789061
STM32開發(fā)實戰(zhàn) (1)
目錄
一、概述,目的
二、搭建步驟
三、時鐘部分案例分析
四、理論總結(jié)
一、概述,目的
目的:解決STM32入門問題
個人認為STM32的最快,最直接的入門方法之一就是:從STM32CubeMx+keilV5入手。無論 你采用FreeRTOS還是Keil自帶的RTX,通過圖形化的界面配置,都能快速生成項目所需的基礎(chǔ)層架構(gòu)代碼,從而將主要精力用于自身項目需求開發(fā)上,大大提高開發(fā)效率。
上一段話包含兩層意思:1、在不熟悉STM32的情況下,如何入手學(xué)習(xí)相關(guān)的技術(shù)知識。2、在不熟悉STM32的情況下,作為公司在職開發(fā)人員,如何快速進入STM32相關(guān)的項目開發(fā)工作中,保證開發(fā)效率。
二、搭建步驟
看圖去官網(wǎng)或者下載站下載:STM32CubeMX,MDK5(MDK-ARM V5)
安裝完成后,就可以選擇你要使用的具體芯片型號,本篇芯片為stm32030系列 、stm32103系列
初始界面如下,圖形化的管腳配置,點點鼠標就可以,so easy!更深入的在后續(xù)章節(jié)再說。
左側(cè)欄先要注意的幾個問題:
1、你可以選擇是否使用FREERTOS
2、如果選擇外部時鐘,請務(wù)必選擇 “RCC-HSE 選項,如圖配置”否則 Input frequency 輸入選項不可更改,系統(tǒng)時鐘最高只能為64MHZ,達不到72MHZ
3、SYS選項,時鐘源雖然默認看起來是SysTick,但實際上沒起作用,所以,需要重新選擇一次,知道SYS標題變綠色,即選擇成功。
自己摸索一下,看看網(wǎng)上的教程,比如“微雪教程”。然后,菜單欄 project->Generate code
注意一些相關(guān)提示:
生成代碼之后,就可以直接打開工程了。
這是沒有安裝MDK-ARM V5的提示:
打開工程后默認的項目文件列表:
三、時鐘部分案例分析
對于單片機系統(tǒng)來說,CPU和總線以及外設(shè)的時鐘設(shè)置是非常重要的,因為沒有時鐘就沒有時序。
AHB總線,這是貫穿所有外設(shè)的一條總線,上圖可知:AHB經(jīng)過橋接,由APB1、APB2控制著幾乎所有外設(shè);
APB2屬于高速設(shè)備; (控制著如:ADC、GPIO、EXIT、TIM1等外設(shè))
APB1屬于低速設(shè)備; (控制著如:DAC、TIMx、USART、I2C等外設(shè))
**很多人在講解知識時,如上作以解釋,有用嗎?反正我覺得是沒用。那怎么做更好呢?
看一個我碰到的項目實例:一同事在用STM32CubeMx生成的代碼,要交到我這里來對項目代碼進行整合,代碼里用到的延時函數(shù)有兩個HAL_Delay(), osDelay(),理論上,這兩個延時函數(shù)的參數(shù)延時基準都是ms,也就是說HAL_Delay(1000), osDelay(1000)都表示延時1000ms,但是我還是要測試一下延時是否準確,因為還有其他好多地方要用到,而且對延時精度要求可能更高點**。
通過示波器測試得知osDelay(1000)是準確的,而HAL_Delay(1000)的延時值實際只有500ms,問題在哪呢?通過圖形配置部分,得知他設(shè)置的SYS 時鐘源為TIM1,那么,理論上是和APB2的FCKL2相關(guān)。我們先定得找到延時函數(shù)所用到的參數(shù)配置,看源代碼:
函數(shù)原型:
__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,顯然不符合理論要求
串口輸出調(diào)試信息:
DBSTRLONG(“PCLK1Freq”,HAL_RCC_GetPCLK1Freq());
DBSTRLONG(“PCLK2Freq”,HAL_RCC_GetPCLK2Freq());
PCLK1Freq 36000000
PCLK2Freq 18000000
由uwTimclock = HAL_RCC_GetPCLK2Freq();// 這里修改后,測試延時仍然不正確,為什么?PCLK2Freq 18000000 頻率是不對的,而要修改PCLK2Freq的值,無非就是修改APB2的分頻值。本來是可以直接再圖形配置這里直接修改的,但是我要做代碼整合,很多代碼自動升后,修改不方便,就直接通過源碼修改。在系統(tǒng)時鐘初始化函數(shù)里,如下:
SystemClock_Config(void)
{
…// 此處省略
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; // 這里修改RCC_HCLK_DIV4 –> RCC_HCLK_DIV1
…// 此處省略
}
串口輸出調(diào)試信息:
DBSTRLONG(“PCLK1Freq”,HAL_RCC_GetPCLK1Freq());
DBSTRLONG(“PCLK2Freq”,HAL_RCC_GetPCLK2Freq());
PCLK1Freq 36000000
PCLK2Freq 72000000
再次測試,結(jié)果就正確了。
上邊的問題說明三點:
1、雖然定時器(Timer)1是由APB2的PCLK2提供的時鐘輸出,但是解決問題的辦法并不是死的,所以由HAL_RCC_GetPCLK1Freq();提供的頻率輸出,結(jié)果不會錯誤,然而不符合理論要求:所以還是要在源
頭修改。特別是整合程序時,基本我不再用STM32CubeMX去自動生成代碼,不然很多代碼被自動修改,會造成很大麻煩。2、STM32CubeMX生成的代碼,有可能存在BUG,所以調(diào)試需全面考慮。
3、在不用手冊,通過觀察CubeMX圖形配置部分,然后明確具體有關(guān)時鐘總線,外設(shè)關(guān)系的情況下,就可以找到代碼的問題所在。
然后參照上圖詳細總結(jié)一下系統(tǒng)時鐘的關(guān)系如下:
其中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、或者系統(tǒng)時鐘。
系統(tǒng)時鐘SYSCLK,它是供STM32中絕大部分部件工作的時鐘源。系統(tǒng)時鐘可選擇為PLL輸出、HSI或者HSE。系統(tǒng)時鐘最大頻率為72MHz,它通過AHB分頻器分頻后送給各模塊使用,AHB分頻器可選擇1、2、4、8、16、64、128、256、512分頻。其中AHB分頻器輸出的時鐘送給5大模塊使用:
①、送給AHB總線、內(nèi)核、內(nèi)存和DMA使用的HCLK時鐘。
②、通過8分頻后送給Cortex的系統(tǒng)定時器時鐘。
③、直接送給Cortex的空閑運行時鐘FCLK。
④、送給APB1分頻器。APB1分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB1外設(shè)使用(PCLK1,最大頻率36MHz),另一路送給定時器(Timer)2、3、4倍頻器使用。該倍頻器可選擇1或者2倍頻,時鐘輸出供定時器2、3、4使用。
⑤、送給APB2分頻器。APB2分頻器可選擇1、2、4、8、16分頻,其輸出一路供APB2外設(shè)使用(PCLK2,最大頻率72MHz),另一路送給定時器(Timer)1倍頻器使用。該倍頻器可選擇1或者2倍頻,時鐘輸出供定時器1使用。另外,APB2分頻器還有一路輸出供ADC分頻器使用,分頻后送給ADC模塊使用。ADC分頻器可選擇為2、4、6、8分頻。
在以上的時鐘輸出中,有很多是帶使能控制的,例如AHB總線時鐘、內(nèi)核時鐘、各種APB1外設(shè)、APB2外設(shè)等等。當需要使用某模塊時,記得一定要先使能對應(yīng)的時鐘。
需要注意的是定時器的倍頻器,當APB的分頻為1時,它的倍頻值為1,否則它的倍頻值就為2。
連接在APB1(低速外設(shè))上的設(shè)備有:電源接口、備份接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、窗口看門狗、Timer2、Timer3、Timer4。注意USB模塊雖然需要一個單獨的48MHz時鐘信號,但它應(yīng)該不是供USB模塊工作的時鐘,而只是提供給串行接口引擎(SIE)使用的時鐘。USB模塊工作的時鐘應(yīng)該是由APB1提供的。
連接在APB2(高速外設(shè))上的設(shè)備有:UART1、SPI1、Timer1、ADC1、ADC2、所有普通IO口(PA~PE)、第二功能IO口。
總結(jié)
以上是生活随笔為你收集整理的stm32开发教程_单片机STM32的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MegaCli使用手册
- 下一篇: java set的first_Java