1,寄存器開發【難度值:難】
寄存器開發是一種直接訪問微控制器寄存器的編程方法,它提供了對硬件的極大靈活性和直接控制。在寄存器級開發中,程序員通過直接寫入和讀取寄存器來配置和控制微控制器的外設,而不依賴高級的抽象層。
以下是寄存器級開發的一般步驟和示例:1.包含頭文件在程序中包含與目標微控制器系列相關的寄存器定義頭文件。
#include"stm32f4xx.h"
2. 初始化時鐘配置系統時鐘和外設時鐘。
// 配置系統時鐘RCC->CR |= RCC_CR_HSEON; // 啟動外部高速時鐘// 等待HSE穩定while (!(RCC->CR & RCC_CR_HSERDY)) {}RCC->CFGR |= RCC_CFGR_SW_HSE; // 切換系統時鐘到HSE
3. 配置外設直接寫入外設寄存器進行配置。例如,配置GPIO引腳:
// 配置GPIO引腳GPIOA->MODER |= GPIO_MODER_MODER5_0; // 將引腳5配置為通用輸出模式GPIOA->OTYPER &= ~GPIO_OTYPER_OT_5; // 將引腳5配置為推挽輸出
4. 中斷處理如果使用中斷,配置和實現中斷處理函數。例如,配置USART中斷:
// 配置USART中斷NVIC_SetPriority(USART1_IRQn, 0);NVIC_EnableIRQ(USART1_IRQn);
5. 主循環在主循環中進行任務處理。例如,使用USART進行通信:
while (1) { // 等待發送緩沖區就緒while(!(USART1->SR&USART_SR_TXE)){} // 發送數據 USART1->DR = data_to_send; // 等待接收緩沖區非空 while (!(USART1->SR & USART_SR_RXNE)) {} // 接收數據 received_data = USART1->DR;}
在寄存器級開發中,程序員需要仔細閱讀芯片手冊和寄存器定義,了解寄存器的功能和配置方式。這樣做的好處是可以對硬件有更直接的控制,但同時也需要更多的了解和小心處理硬件細節。
2,HAL庫開發【難度值:易】當使用HAL庫進行開發時,主要是通過調用HAL庫提供的函數來配置和控制STM32微控制器的外設。HAL庫旨在提供一種跨STM32系列通用的接口,使得開發者可以以相對高層次的抽象水平來進行開發,而不必深入了解底層硬件的細節。
以下是使用HAL庫進行開發的一般步驟:
1. 初始化:在程序的開始階段,通常會調用 `HAL_Init()` 來初始化HAL庫。這個函數執行一些底層的初始化工作,包括設置系統時鐘。
HAL_Init();
2. 系統時鐘配置:使用 `HAL_RCC_ClockConfig()` 等函數來配置系統時鐘。這涉及到選擇和配置時鐘源、設置分頻器等。
//配置系統時鐘為最大頻率HAL_RCC_ClockConfig(&RCC_ClkInitStruct,FLASH_LATENCY_5);
3. 外設初始化
對需要使用的外設進行初始化。這通常涉及使用 `HAL_InitTick()` 和 `HAL_MspInit()` 等函數來初始化一些必要的外設和中斷。
// 初始化系統滴答定時器HAL_InitTick(TICK_INT_PRIORITY);
4. 外設配置使用HAL庫提供的配置函數,例如 `HAL_UART_Init()`、`HAL_GPIO_Init()` 等,對外設進行配置。
// 配置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. 中斷處理如果使用中斷,需要配置和實現相應的中斷處理函數。HAL庫提供了 `HAL_NVIC_SetPriority()` 等函數來配置中斷優先級。
// 配置USART中斷 HAL_NVIC_SetPriority(USART1_IRQn, 0, 1); HAL_NVIC_EnableIRQ(USART1_IRQn);
6. 主循環在主循環中處理任務。通常使用 `HAL_UART_Transmit()`、`HAL_UART_Receive()` 等函數來進行通信。
while (1) { // 接收數據 HAL_UART_Receive(&uart,rx_buffer,1,HAL_MAX_DELAY); //處理數據 // 發送數據 HAL_UART_Transmit(&uart, tx_buffer, sizeof(tx_buffer), HAL_MAX_DELAY); }
以上是使用HAL庫進行STM32開發的一般步驟。HAL庫提供了大量的函數和抽象,使得開發者能夠相對輕松地進行STM32微控制器的開發,而不必深入研究底層硬件的復雜性。 3,LL庫開發【難度值:中】
LL庫是HAL庫的底層實現,提供了對STM32微控制器的底層寄存器級別的直接訪問。LL庫是HAL庫的一部分,它的目標是提供對硬件的底層控制,同時保持相對較高的可移植性。
以下是使用LL庫進行開發的一般步驟和示例:
1.包含頭文件在程序中包含LL庫相關的頭文件。
#include "stm32f4xx_ll_gpio.h" #include "stm32f4xx_ll_rcc.h"
2. 初始化時鐘配置系統時鐘和外設時鐘。
LL_Init1msTick(SystemCoreClock); LL_SYSTICK_EnableIT();
3.配置外設直接寫入寄存器進行配置。例如,配置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.中斷處理如果使用中斷,配置和實現中斷處理函數。例如,配置USART中斷:
// 配置USART中斷 NVIC_SetPriority(USART1_IRQn, 0); NVIC_EnableIRQ(USART1_IRQn);
5. 主循環
在主循環中進行任務處理。例如,使用USART進行通信:
while (1) { // 發送數據 while (!LL_USART_IsActiveFlag_TXE(USART1)) {} LL_USART_TransmitData8(USART1, data_to_send);
// 等待接收數據 while (!LL_USART_IsActiveFlag_RXNE(USART1)) {} received_data = LL_USART_ReceiveData8(USART1); }
使用LL庫進行開發相對于使用寄存器級別的開發提供了更高的抽象層次,但仍然直接操作硬件寄存器。這使得LL庫的使用更加直觀,同時保持了相對較高的性能。
總的來說,新手推薦學習HAL,因為簡單,網上資料也多,等對HAL有一定的基礎之后,再學習LL庫,LL庫是直接操作寄存器的,代碼比較精簡,運行效率比較高,也是一種趨勢。寄存器現在完全不推薦,因為ST官方都放棄了。
-
微控制器
+關注
關注
48文章
7489瀏覽量
151051 -
寄存器
+關注
關注
31文章
5317瀏覽量
120010 -
代碼
+關注
關注
30文章
4748瀏覽量
68356
發布評論請先 登錄
相關推薦
評論