<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

STM32F030單片機的翻轉引腳介紹

冬至配餃子 ? 來源:TopSemic嵌入式 ? 作者:TopSemic ? 2022-08-11 11:15 ? 次閱讀

1. 第一個工程 翻轉引腳

上一篇文章我們詳細介紹了 STM32F030 從復位時取得復位向量,系統初始化,然后跳轉到 main( ) 函數的過程。下面我們結合一個最簡單的例子,對 Cube 庫的使用做一個簡單的介紹。我們用 Keil 打開下面這個工程:STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesGPIOGPIO_IOToggleMDK-ARMProject.uvprojx

編譯下載運行此代碼,會看到一個 LED燈(連至MCU的 PA5引腳)不停地閃爍。為了完成這個簡單的功能,我們看到這個工程里包含了不少文件:

pYYBAGL0cyCAB-0qAAEaDl99aj4274.png

如果是初次用這種庫的方式做開發,乍一看還真感覺有點亂。不過讓我們一個一個看一下這些文件,理清它們的關系后就會體會到這種方式的巨大優點。

2. 文件分類解釋

工程里的文件分為五大類:啟動代碼,M0內核初始化,驅動,板級支持包(BSP),用戶代碼。一般來說我們開發應用程序,主要關注用戶代碼文件就行了。如果硬件電路板做了改動,則修改BSP里的內容。在早期的單片機開發中,芯片內資源很少,通常的情況是一個工程師就從硬件到軟件編程都做了,是沒有 BSP(Board Support Package)這種概念的。BSP概念來源于較復雜的CPU系統的開發,一般是廠家設計主板,并提供 BSP(包含啟動代碼,驅動,Bootloader等)。我們這里的 BSP 概念稍有不同,它是指對某一塊兒以 MCU 為核心的電路板的支持代碼包。啟動代碼,內核初始化和驅動,沒有包含在內。BSP會調用驅動層的代碼。對于 STM32 Nucleo 這塊兒開發板來說,板上資源很少,所以BSP只提供了相應的按鍵(BUTTON)和指示燈(LED)支持代碼。里面的ADC,SPI,LCD等代碼是支持其它板子的,可以先忽略。

啟動代碼

為理解匯編代碼,我們先熟悉一下這些偽指令:

ALIGN 變量或代碼對齊。如:

ALIGN = 3 以8(2的3次方)字節對齊。

EQU 給標號賦值。如:

Stack_SizeEQU 0x400;

DCD 分配1個或多個字(words)的內存空間。如:

Data DCD 1,5,8; 定義3個字并賦值為 1,5 和 8。

AREA 定義一個代碼或數據段(section),命名并指定屬性。如:

AREA Func01, CODE, READONLY;

定義了一個名字為 Func01 的只讀代碼段。

SPACE 保留一段空間并初始化為 0。如:

Data SPACE 100; 為 Data 保留 100個字節初始化為 0 的內存空間。

IMPORT 導入其它文件中的標號,以在當前文件中引用。如:

IMPORT SystemInit

LDR R0, =SystemInit

BLX R0

從文件 system_stm32f0xx.c 中導入 SystemInit 這個函數并調用。

EXPORT 導出能被連接器(Linker)識別的標號。從ASM文件導出的標號可以在C中引用。

[WEAK] 如果在其它地方定義了相同的標號,則此處定義被覆蓋。

PROC 定義一個函數的起始地址。

ENDP 標志當前函數結束。

例子:

SysTick_Handler PROC

EXPORT SysTick_Handler [WEAK]

B.

ENDP

導出 SysTick_Handler 這個中斷處理函數。如果在其它地方定義了一個新的 SysTick_Handler 函數,那么新函數將覆蓋此處定義的這個陷阱函數。匯編語句 B.為在當前語句死循環。下面我們看一下啟動文件 startup_stm32f030x8.s

定義堆和棧:

poYBAGL0czaAeB7EAACy7Dd09s0266.png

中斷向量表:

poYBAGL0c1aAE3g5AAGKgtNQHHU605.png

現在這個工程用到的只有綠線框中的幾個向量:

__initial_sp

初始堆棧指針

Reset_Handler

復位向量,我們在上一篇文章已經講到如何從復位向量一步一步執行到用戶代碼中的主程序main( )。

SysTick_Handler

系統時鐘中斷向量。此程序每 1ms 產生一次中斷。

需要注意的是 SysTick_Handler 這個中斷處理函數在用戶代碼文件stm32f0xx_it.c

中進行了重定義,所以當 SysTick 中斷發生時,實際會跳轉到用戶代碼的中斷處理函數,而不是跳到下圖所示的匯編代碼中斷處理函數進入死循環。

poYBAGL0c3iADFSSAAFbIKjnoBA640.png

再往下可以看到,對所有芯片級中斷定義了一個共享的陷阱函數。用戶在實際使用到某一個中斷的時候,要在中斷處理文件 stm32f0xx_it.c 中用相同的函數名定義,從而在中斷發生時跳轉到實際的中斷處理函數。

poYBAGL0c46AXt0JAABuJLtK4v4181.png

在此文件的最下面的代碼,是用來傳遞堆棧信息給庫的:

poYBAGL0c6aAXjx_AAD7rxb-h78753.png

在芯片資源比較少時,可以通過選中 Options for Target->Target->Use MicroLIB 選項,使用簡化版的庫來實現 printf 等操作。若資源充足時使用標準庫,庫將調用下面的 __user_initial_stackheap 函數來獲得堆棧信息。

M0 內核初始化

system_stm32f0xx.c此文件只有兩個函數:SystemInit( ),在啟動代碼中調用,把系統時鐘復位到初始默認狀態(8MHz的高頻內部時鐘 HSI)。SystemCoreClockUpdate( ), 在用戶調用庫函數更改時鐘配置后,需要調用此函數以更新全局系統時鐘變量 SystemCoreClock。其它模塊基于此時鐘的計算才會正確。一般來說更改時鐘配置的 HAL函數已經包含此函數的調用,如 HAL_RCC_ClockConfig( ), 無需用戶再次調用。

驅動

stm32f0xx_hal_cortex.c包含 Cortex 內核中兩個重要模塊的驅動:可嵌套中斷向量控制器 NVIC(Nested Vectored Interrupt Controller),系統滴答時鐘 SYSTICK。

stm32f0xx_hal.c

此文件包含用戶程序必須首先調用的 HAL_Init( ),它會使能數據和指令緩存,預取指令隊列;配置系統滴答時鐘產生 1ms 中斷;調用 HAL_MspInit( )回調函數。

HAL_MspInit( )函數用來做系統級的初始化,配置某一模塊相關的 時鐘,引腳,DMA,中斷等資源,但是在所有的例程中都沒有實際用到此函數??梢韵群雎?。

stm32f0xx_hal_rcc.cstm32f0xx_hal_rcc_ex.c

RCC(Reset and Clock Controller)模塊的驅動。一個模塊為什么要兩個驅動文件呢?前一個文件提供了基本的通用的功能驅動,后一個文件是擴展功能驅動,通常針對某一特定型號的芯片。如同我們吃飯需要餐具,_rcc.c 提供碗筷等常用必備工具,_rcc_ex 可能提供的就是酒杯,燭臺等這些東西。

stm32f0xx_hal_gpio.c

GPIO 模塊的驅動。

BSP 板級支持包

stm32f0xx_nucleo.c

針對 STM32 Nucleo 開發板的類型,宏定義,支持代碼。

用戶代碼

main.c 主程序

stm32f0xx_it.c 中斷處理

前面介紹了一大堆文件,主要是為了清除系統的工作流程。在開發中使用庫還是很簡單的。在主程序中調用庫,只需要通過 main.h 包含下面這個頭文件:stm32f0xx_hal.h如果有 BSP 則包含 BSP 的頭文件,在本工程是:stm32f0xx_nucleo.h

使用到哪個模塊就在配置文件中打開使能該模塊的宏定義。

stm32f0xx_hal_conf.h

然后第一步必須調用 HAL_Init( )。

第二步,如果希望系統時鐘工作在默認內部時鐘(8MHz HIS)以外的頻率,則需要調用 SystemClock_Config( )。此函數又調用 HAL_RCC_ClockConfig( ) 完成新配置。

下面是應用代碼:

pYYBAGL0c76APetUAAGGBsrpi0Y741.png

所有模塊一般都是這三個步驟:使能模塊的時鐘,初始化模塊,使用模塊的功能。

stm32f0xx_it.c 中的中斷處理函數 SysTick_Handler( ) 很簡單,每次進入就對滴答計時變量 uwTick 加1,其它 HAL 函數可以基于此變量計時。



審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 單片機
    +關注

    關注

    6008

    文章

    44075

    瀏覽量

    622793
  • led燈
    +關注

    關注

    22

    文章

    1563

    瀏覽量

    107115
  • 中斷處理
    +關注

    關注

    0

    文章

    94

    瀏覽量

    10900
  • STM32F0
    +關注

    關注

    0

    文章

    61

    瀏覽量

    17012
收藏 人收藏

    評論

    相關推薦

    連續開機半年死機,STM32F030使用內部晶體,現在冬天出現...

    個小模塊,使用內部振蕩器產生時鐘,未使用外部晶體?,F在有幾百個產品在吉林省使用,目前出現了三十四個設備無法與單片機STM32F030通訊,讀不到單片機信息。出現死機狀態。STM32F030
    發表于 08-20 07:14

    STM32F030使用GPRS模塊通過GPRS網絡從服務器上下載程序

    視頻介紹STM32F030使用GPRS模塊通過GPRS網絡從服務器上下載程序,使得單片機能在線升級,不用拿著仿真器去現場給單片機下載程序。如果單片
    發表于 08-05 06:05

    STM32F030_LED是如何配置的

    STM32F030_LED詳細配置總結這幾天到手一塊Cortex_M0的STM32f030單片機,在這里總結下STM32F030的相關詳細外設功能配置,本文詳細說明
    發表于 08-05 08:08

    STM32F030的IAP方法

    程序收尾總想著以后更新的方便性,采用在應用編程(In Application Programming),通過Bootload引導單片機自己往程序存儲器里寫數據或修改程序。下面簡介STM32F030
    發表于 08-05 07:46

    STM32F030庫的相關資料分享

    單片機STM32F030庫:HAL庫目標:在程序軟件中修改讀保護選項字節,這樣程序下載進去之后就自動保護了,不用再在ST-LINK中修改選項字節了注意事項:寫選項字節,除了解鎖OB,還要解鎖
    發表于 01-20 06:13

    怎么做STM32F030的IAP程序

    昨天IAP升級差點翻水水,具體過程容我細細道來。。。單片機在線升級應該是IAP+APP。怎么做STM32F030的IAP程序我就簡單介紹一下吧(其他大佬應該有詳細的,我只說點我自己遇到的問題)。先
    發表于 01-24 06:07

    stm32f030原理圖

    stm32f030原理圖
    發表于 10-09 17:16 ?284次下載

    使用STM32F030單片機讀取溫濕度傳感器SHT20的C語言源代碼免費下載

    本文檔的主要內容詳細介紹的是使用STM32F030單片機讀取溫濕度傳感器SHT20的C語言源代碼免費下載。
    發表于 06-10 17:07 ?116次下載
    使用<b class='flag-5'>STM32F030</b><b class='flag-5'>單片機</b>讀取溫濕度傳感器SHT20的C語言源代碼免費下載

    STM32F030新建工程模板資料免費下載

    本文檔的主要內容詳細介紹的是STM32F030新建工程模板資料免費下載 ,方便新建STM32F030所用,省略配置步驟。
    發表于 08-05 08:00 ?72次下載
    <b class='flag-5'>STM32F030</b>新建工程模板資料免費下載

    STM32F030單片機和TFT薄膜晶體管的電路原理圖免費下載

    本文檔的主要內容詳細介紹的是STM32F030單片機和TFT薄膜晶體管的電路原理圖免費下載。
    發表于 11-11 11:15 ?26次下載
    <b class='flag-5'>STM32F030</b><b class='flag-5'>單片機</b>和TFT薄膜晶體管的電路原理圖免費下載

    如何建一個STM32F030工程模板(標準庫版)

    如何建一個STM32F030工程模板(標準庫版)
    發表于 12-08 20:21 ?0次下載
    如何建一個<b class='flag-5'>STM32F030</b>工程模板(標準庫版)

    STM32F030低溫下RTC不工作

    STM32F030低溫下RTC不工作
    發表于 12-09 09:21 ?19次下載
    <b class='flag-5'>STM32F030</b>低溫下RTC不工作

    stm32f030系列時鐘介紹

    時鐘是微處理器的驅動力,類似人的心臟,只有不停地跳動系統才能正常運行。Stm32不同系列的時鐘基本結構類似,就是外設有些差別。這里以stm32f030系列為例來介紹。
    的頭像 發表于 03-23 10:10 ?2926次閱讀
    <b class='flag-5'>stm32f030</b>系列時鐘<b class='flag-5'>介紹</b>

    STM32F030在低溫下無法啟動

    STM32F030在低溫下無法啟動
    的頭像 發表于 09-27 16:19 ?1163次閱讀
    <b class='flag-5'>STM32F030</b>在低溫下無法啟動

    STM32F030單片機編程中文參考資料

    電子發燒友網站提供《STM32F030單片機編程中文參考資料.pdf》資料免費下載
    發表于 04-01 09:43 ?12次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>