0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

寄存器開發(fā),HAL開發(fā)和LL開發(fā)的區(qū)別和參考代碼

撞上電子 ? 2023-11-17 08:00 ? 次閱讀

1,寄存器開發(fā)【難度值:難】
寄存器開發(fā)是一種直接訪問微控制器寄存器的編程方法,它提供了對硬件的極大靈活性和直接控制。在寄存器級開發(fā)中,程序員通過直接寫入和讀取寄存器來配置和控制微控制器的外設(shè),而不依賴高級的抽象層。
以下是寄存器級開發(fā)的一般步驟和示例:1.包含頭文件在程序中包含與目標(biāo)微控制器系列相關(guān)的寄存器定義頭文件。

#include"stm32f4xx.h"

2. 初始化時鐘配置系統(tǒng)時鐘和外設(shè)時鐘。

// 配置系統(tǒng)時鐘RCC->CR |= RCC_CR_HSEON; // 啟動外部高速時鐘// 等待HSE穩(wěn)定while (!(RCC->CR & RCC_CR_HSERDY)) {}RCC->CFGR |= RCC_CFGR_SW_HSE; // 切換系統(tǒng)時鐘到HSE

3. 配置外設(shè)直接寫入外設(shè)寄存器進(jìn)行配置。例如,配置GPIO引腳:

// 配置GPIO引腳GPIOA->MODER |= GPIO_MODER_MODER5_0; // 將引腳5配置為通用輸出模式GPIOA->OTYPER &= ~GPIO_OTYPER_OT_5; // 將引腳5配置為推挽輸出

4. 中斷處理如果使用中斷,配置和實現(xiàn)中斷處理函數(shù)。例如,配置USART中斷:

// 配置USART中斷NVIC_SetPriority(USART1_IRQn, 0);NVIC_EnableIRQ(USART1_IRQn);


5. 主循環(huán)在主循環(huán)中進(jìn)行任務(wù)處理。例如,使用USART進(jìn)行通信

while (1) { // 等待發(fā)送緩沖區(qū)就緒while(!(USART1->SR&USART_SR_TXE)){} // 發(fā)送數(shù)據(jù) USART1->DR = data_to_send; // 等待接收緩沖區(qū)非空 while (!(USART1->SR & USART_SR_RXNE)) {} // 接收數(shù)據(jù) received_data = USART1->DR;}

在寄存器級開發(fā)中,程序員需要仔細(xì)閱讀芯片手冊和寄存器定義,了解寄存器的功能和配置方式。這樣做的好處是可以對硬件有更直接的控制,但同時也需要更多的了解和小心處理硬件細(xì)節(jié)。
2,HAL庫開發(fā)【難度值:易】當(dāng)使用HAL庫進(jìn)行開發(fā)時,主要是通過調(diào)用HAL庫提供的函數(shù)來配置和控制STM32微控制器的外設(shè)。HAL庫旨在提供一種跨STM32系列通用的接口,使得開發(fā)者可以以相對高層次的抽象水平來進(jìn)行開發(fā),而不必深入了解底層硬件的細(xì)節(jié)。
以下是使用HAL庫進(jìn)行開發(fā)的一般步驟:

1. 初始化:在程序的開始階段,通常會調(diào)用 `HAL_Init()` 來初始化HAL庫。這個函數(shù)執(zhí)行一些底層的初始化工作,包括設(shè)置系統(tǒng)時鐘。

HAL_Init();

2. 系統(tǒng)時鐘配置:使用 `HAL_RCC_ClockConfig()` 等函數(shù)來配置系統(tǒng)時鐘。這涉及到選擇和配置時鐘源、設(shè)置分頻器等。

//配置系統(tǒng)時鐘為最大頻率HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_5);

3. 外設(shè)初始化

對需要使用的外設(shè)進(jìn)行初始化。這通常涉及使用 `HAL_InitTick()` 和 `HAL_MspInit()` 等函數(shù)來初始化一些必要的外設(shè)和中斷。

// 初始化系統(tǒng)滴答定時器HAL_InitTick(TICK_INT_PRIORITY);

4. 外設(shè)配置使用HAL庫提供的配置函數(shù),例如 `HAL_UART_Init()`、`HAL_GPIO_Init()` 等,對外設(shè)進(jìn)行配置。

// 配置UARTUART_HandleTypeDef uart;uart.Instance = USART1;uart.Init.BaudRate = 115200;uart.Init.WordLength = UART_WORDLENGTH_8B;uart.Init.StopBits = UART_STOPBITS_1;uart.Init.Parity = UART_PARITY_NONE;uart.Init.Mode = UART_MODE_TX_RX;uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;uart.Init.OverSampling = UART_OVERSAMPLING_16;HAL_UART_Init(&uart);

5. 中斷處理如果使用中斷,需要配置和實現(xiàn)相應(yīng)的中斷處理函數(shù)。HAL庫提供了 `HAL_NVIC_SetPriority()` 等函數(shù)來配置中斷優(yōu)先級。

// 配置USART中斷 HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); HAL_NVIC_EnableIRQ(USART1_IRQn);

6. 主循環(huán)在主循環(huán)中處理任務(wù)。通常使用 `HAL_UART_Transmit()`、`HAL_UART_Receive()` 等函數(shù)來進(jìn)行通信。

while (1) { // 接收數(shù)據(jù) HAL_UART_Receive(&uart,rx_buffer,1,HAL_MAX_DELAY); //處理數(shù)據(jù) // 發(fā)送數(shù)據(jù) HAL_UART_Transmit(&uart, tx_buffer, sizeof(tx_buffer), HAL_MAX_DELAY); }

以上是使用HAL庫進(jìn)行STM32開發(fā)的一般步驟。HAL庫提供了大量的函數(shù)和抽象,使得開發(fā)者能夠相對輕松地進(jìn)行STM32微控制器的開發(fā),而不必深入研究底層硬件的復(fù)雜性。 3,LL庫開發(fā)【難度值:中】

LL庫是HAL庫的底層實現(xiàn),提供了對STM32微控制器的底層寄存器級別的直接訪問。LL庫是HAL庫的一部分,它的目標(biāo)是提供對硬件的底層控制,同時保持相對較高的可移植性。

以下是使用LL庫進(jìn)行開發(fā)的一般步驟和示例:

1.包含頭文件在程序中包含LL庫相關(guān)的頭文件。

#include "stm32f4xx_ll_gpio.h" #include "stm32f4xx_ll_rcc.h"

2. 初始化時鐘配置系統(tǒng)時鐘和外設(shè)時鐘。

LL_Init1msTick(SystemCoreClock); LL_SYSTICK_EnableIT();


3.配置外設(shè)直接寫入寄存器進(jìn)行配置。例如,配置GPIO引腳:

// 配置GPIO引腳 LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA); LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_5, LL_GPIO_MODE_OUTPUT); LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_5, LL_GPIO_SPEED_FREQ_LOW);

4.中斷處理如果使用中斷,配置和實現(xiàn)中斷處理函數(shù)。例如,配置USART中斷:

// 配置USART中斷 NVIC_SetPriority(USART1_IRQn, 0); NVIC_EnableIRQ(USART1_IRQn);


5. 主循環(huán)

在主循環(huán)中進(jìn)行任務(wù)處理。例如,使用USART進(jìn)行通信:

while (1) { // 發(fā)送數(shù)據(jù) while (!LL_USART_IsActiveFlag_TXE(USART1)) {} LL_USART_TransmitData8(USART1, data_to_send);
// 等待接收數(shù)據(jù) while (!LL_USART_IsActiveFlag_RXNE(USART1)) {} received_data = LL_USART_ReceiveData8(USART1); }

使用LL庫進(jìn)行開發(fā)相對于使用寄存器級別的開發(fā)提供了更高的抽象層次,但仍然直接操作硬件寄存器。這使得LL庫的使用更加直觀,同時保持了相對較高的性能。

總的來說,新手推薦學(xué)習(xí)HAL,因為簡單,網(wǎng)上資料也多,等對HAL有一定的基礎(chǔ)之后,再學(xué)習(xí)LL庫,LL庫是直接操作寄存器的,代碼比較精簡,運行效率比較高,也是一種趨勢。寄存器現(xiàn)在完全不推薦,因為ST官方都放棄了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 微控制器
    +關(guān)注

    關(guān)注

    48

    文章

    7564

    瀏覽量

    151517
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5355

    瀏覽量

    120531
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4791

    瀏覽量

    68694
收藏 人收藏

    評論

    相關(guān)推薦

    HAL庫在STM32開發(fā)中的重要性

    過程 HAL庫提供了一套完整的函數(shù)接口,用于操作STM32微控制的各種外設(shè)和功能模塊。這些函數(shù)接口封裝了底層硬件的復(fù)雜性,使得開發(fā)者無需深入了解硬件細(xì)節(jié)即可實現(xiàn)功能。因此,HAL庫大
    的頭像 發(fā)表于 12-02 13:35 ?378次閱讀

    Modbus協(xié)議的讀取保持寄存器

    功能碼用于讀取從設(shè)備保持寄存器的內(nèi)容,不支持廣播模式。消息頓中指定了需要讀取的保持寄存器的起始地址和數(shù)目。而保持寄存器中各地址的具體內(nèi)容和意義則由設(shè)備開發(fā)者自行規(guī)定。
    的頭像 發(fā)表于 10-30 10:54 ?1453次閱讀

    寄存器間接尋址和寄存器尋址的區(qū)別

    寄存器間接尋址和寄存器尋址是計算機(jī)體系結(jié)構(gòu)中兩種重要的尋址方式,它們在指令執(zhí)行過程中起著關(guān)鍵作用。下面將從定義、原理、特點、應(yīng)用場景以及區(qū)別等方面對這兩種尋址方式進(jìn)行詳細(xì)闡述。
    的頭像 發(fā)表于 10-05 17:13 ?1646次閱讀

    寄存器和高速緩存有什么區(qū)別

    寄存器和高速緩存(Cache)都是計算機(jī)系統(tǒng)中用于存儲數(shù)據(jù)的重要組成部分,但它們在功能、位置、容量、速度以及使用方式上存在著顯著的區(qū)別。
    的頭像 發(fā)表于 09-10 14:32 ?1486次閱讀

    寄存器尋址和直接尋址的區(qū)別

    寄存器尋址和直接尋址是計算機(jī)指令系統(tǒng)中的兩種基本尋址方式。它們在指令的執(zhí)行過程中起著至關(guān)重要的作用,決定了指令操作數(shù)的來源和目標(biāo)。下面我們將介紹這兩種尋址方式的特點、區(qū)別以及在實際應(yīng)用中的優(yōu)缺點
    的頭像 發(fā)表于 07-12 10:42 ?1921次閱讀

    寄存器分為基本寄存器和什么兩種

    寄存器是計算機(jī)中用于存儲數(shù)據(jù)的高速存儲單元,它們是CPU內(nèi)部的重要組成部分。寄存器可以分為基本寄存器和擴(kuò)展寄存器兩種類型。 一、基本寄存器
    的頭像 發(fā)表于 07-12 10:31 ?1435次閱讀

    DP83640寄存器及物理層接口開發(fā)指導(dǎo)

    DP83640寄存器及物理層接口開發(fā)指導(dǎo)
    發(fā)表于 07-08 14:58 ?0次下載

    手把手帶你移植HAL庫函數(shù)

    開發(fā)者更高效地進(jìn)行嵌入式開發(fā)。手把手帶你移植HAL庫函數(shù)HAL庫提供了一套抽象接口,使開發(fā)者無需直接操作底層硬件
    的頭像 發(fā)表于 05-18 08:04 ?1955次閱讀
    手把手帶你移植<b class='flag-5'>HAL</b>庫函數(shù)

    stm32的寄存器開發(fā)和庫開發(fā)有什么區(qū)別?到底哪個更好?

    stm32的寄存器開發(fā)和庫開發(fā)有什么區(qū)別,到底哪個更好?
    發(fā)表于 05-13 08:24

    寄存器和內(nèi)存的區(qū)別

    在計算機(jī)體系結(jié)構(gòu)中,寄存器和內(nèi)存是兩個至關(guān)重要的組成部分。它們各自承擔(dān)著不同的角色,共同確保計算機(jī)系統(tǒng)的正常運行。本文將對寄存器和內(nèi)存進(jìn)行詳細(xì)的介紹,包括它們的定義、功能以及二者之間的主要區(qū)別。
    的頭像 發(fā)表于 05-12 17:11 ?2335次閱讀

    存儲寄存器區(qū)別

    存儲數(shù)據(jù)和指令。兩者在功能、結(jié)構(gòu)、性能以及應(yīng)用上都有著顯著的區(qū)別。本文將對存儲寄存器區(qū)別進(jìn)行詳細(xì)的探討和分析。
    的頭像 發(fā)表于 05-12 16:55 ?2301次閱讀

    代碼開發(fā)平臺的崛起:優(yōu)勢、特點與應(yīng)用

    代碼開發(fā)平臺是近年來迅速崛起的一種創(chuàng)新型軟件開發(fā)工具,以其高效、靈活的開發(fā)模式正顛覆著傳統(tǒng)的開發(fā)方式。不再需要編寫大量繁雜的
    的頭像 發(fā)表于 04-18 10:43 ?380次閱讀
    低<b class='flag-5'>代碼</b><b class='flag-5'>開發(fā)</b>平臺的崛起:優(yōu)勢、特點與應(yīng)用

    stm32f401使用hall庫HAL_DMA_Init中DMA_SxCR寄存器的配置無效怎么解決?

    adc+dma采樣,代碼是通過cubemx生成的,調(diào)試時發(fā)現(xiàn)adc通過dma采集到的數(shù)據(jù)不對,通過單步仿真發(fā)現(xiàn)在HAL_DMA_Init函數(shù)中配置dma的CR寄存器沒有生效,但是在dma初始化完成后再對cr
    發(fā)表于 03-15 06:16

    CPU的6個主要寄存器

    CPU寄存器是中央處理內(nèi)的組成部分,是有限存貯容量的高速存貯部件。寄存器是CPU內(nèi)部的元件,包括通用寄存器、專用寄存器和控制
    的頭像 發(fā)表于 02-03 15:15 ?4423次閱讀

    web前端開發(fā)和前端開發(fā)區(qū)別

    Web前端開發(fā)和前端開發(fā)是兩個相似但略有不同的概念。本文將詳細(xì)討論這兩者之間的區(qū)別。 定義和范圍: Web前端開發(fā)是指開發(fā)和維護(hù)Web應(yīng)用程
    的頭像 發(fā)表于 01-18 09:54 ?3564次閱讀