国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器

這篇具有很好參考價值的文章主要介紹了【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。


前言

在嵌入式系統(tǒng)開發(fā)中,HAL(Hardware Abstraction Layer)庫是一個重要的概念,它提供了一個抽象層,使開發(fā)者可以更容易地編寫可移植的代碼,而不必擔心底層硬件的細節(jié)。STM32CubeMX是一款由STMicroelectronics提供的工具,用于生成STM32微控制器的初始化代碼,其中包括了HAL庫的使用。

HAL庫的本質(zhì)與HAL庫源碼分析
HAL庫的本質(zhì)是一個由供應商提供的軟件庫,旨在提供一系列抽象接口,用于訪問底層硬件資源,如GPIO、USART、I2C等。這些接口隱藏了底層硬件的細節(jié),使得開發(fā)者能夠以統(tǒng)一的方式進行開發(fā),而不必擔心不同型號或者不同系列的微控制器的差異。

HAL庫的源碼分析可以揭示其內(nèi)部的工作原理和實現(xiàn)細節(jié)。通過分析源碼,我們可以了解到每個函數(shù)的具體功能、調(diào)用關系以及與底層硬件交互的細節(jié)。HAL庫通常包括了對不同硬件模塊的驅(qū)動程序,這些驅(qū)動程序是與特定型號的微控制器兼容的。


一、HAL庫的本質(zhì)

1.1 HAL庫的本質(zhì)是操作寄存器

其實點燈就是操作下面的output data register
【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器,從0帶你學會如何像人類一樣寫STM32程序,stm32,嵌入式硬件,單片機,c語言,mcu,點燈

比如我們之前點燈寫的HAL_GPIO_WritePin()他的源碼如下:

void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if (PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;
  }
}

他去設置某個寄存器等于某個值,這叫是HAL庫的本質(zhì)

1.2 自己實現(xiàn)HAL_GPIO_WritePin

寄存器

CPU可以發(fā)出地址,然后訪問比如Flash、RAM、GPIOC
我們可以通過訪問某一個地址區(qū)間去訪問Flash
訪問其他地址訪問GPIOC等等等等

我們可以訪問ram,寫入val,讀出仍是val
我們可以訪問flash,使用讀出指令,不能直接寫

在GPIOC里面有很多的寄存器,但我們不能像操作ram和flash一樣,這些寄存器的功能各有不同
比如說以我這個F103ZE為例子:
【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器,從0帶你學會如何像人類一樣寫STM32程序,stm32,嵌入式硬件,單片機,c語言,mcu,點燈
比如Port configuration配置寄存器,一個低位,一個高位
比如輸入寄存器:Port input data,通過讀他,可以得到引腳的狀態(tài)/數(shù)據(jù)
比如輸出寄存器:Port output data,我們可以通過寫這個寄存器,讓這個引腳輸出高低電平
還有一些其他的

通過寄存器的操作點燈

我們可以在芯片手冊中找到GPIOC的基地址,在看GPIOC的輸出寄存器偏移地址可以得出,要訪問輸出寄存器就要訪問0x400110C這個地址的寄存器

【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器,從0帶你學會如何像人類一樣寫STM32程序,stm32,嵌入式硬件,單片機,c語言,mcu,點燈
比如說,舉個例子:我們可以通過一個C語言的指針指向這個要操作的寄存器
然后把里面的值給改變了是不是就操作了寄存器的值
他的每一個寄存器的大小都是2bytes

首先我們使用指針指向寄存器的位子

unsigned int *p;
p	= (unsigned int*)0x40010C0C;

接下來我們需要操作第十三個寄存器,即可點亮我們的燈
比如我們可以這樣設置他為1:

unsigned int val = *p;
val = val | (1<<5);
*p = val;

我們可以這樣設置他為0:

val = *p;
val = val & ~(1<<5);
*p = val;

這樣我們就通過寄存器輸出高低電平了

要注意的是,比如你要操作GPIOC里面的13,你就要移13,像下面這樣,其他的也是一樣
要操作哪個引腳就偏移他的引腳名稱,我這里的燈是PB5,所以就把他的地址里面的值偏移5即可
【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器,從0帶你學會如何像人類一樣寫STM32程序,stm32,嵌入式硬件,單片機,c語言,mcu,點燈

代碼概況

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
	
	unsigned int *p;
	p	= (unsigned int*)0x40010C0C;

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		unsigned int val = *p;
		val = val | (1<<5);
		*p = val;
		
		HAL_Delay(500);
		
		val = *p;
		val = val & ~(1<<5);
		*p = val;
		
		HAL_Delay(500);
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

Port bit set/reset register寄存器

像我們上面,我們需要把寄存器的內(nèi)容拿出來,然后通過控制某一位的0/1來操作高低電平,這樣稍微有點麻煩,那么我們可以使用下面這個寄存器Port bit set/reset register,他只需要寫入1到某一位就可以輸出高電平/低電平
【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器,從0帶你學會如何像人類一樣寫STM32程序,stm32,嵌入式硬件,單片機,c語言,mcu,點燈
他是一個32位的寄存器

比如BRy
【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器,從0帶你學會如何像人類一樣寫STM32程序,stm32,嵌入式硬件,單片機,c語言,mcu,點燈
他寫入1就把指定的GPIO reset
0就是沒有任何作用

比如BSy
【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器,從0帶你學會如何像人類一樣寫STM32程序,stm32,嵌入式硬件,單片機,c語言,mcu,點燈
他寫入1就是指定GPIO set
0就是沒有任何作用

那么我們就可以把代碼變成這樣:

unsigned int *p;
	p	= (unsigned int*)(0x40010C00 + 0x10);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		unsigned int val = *p;
		*p = (1 << 21);
		
		HAL_Delay(500);
		
		*p = (1 << 5);
		
		HAL_Delay(500);
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

通過寫21位,把他變成reset狀態(tài)
通過寫5位,把他變成set狀態(tài),這樣就實現(xiàn)了閃爍燈


總結

HAL庫作為嵌入式系統(tǒng)開發(fā)中的重要工具,提供了一種方便、快捷的方式來訪問STM32微控制器的硬件資源。通過使用HAL庫,開發(fā)者可以更加專注于應用程序的開發(fā),而不必花費大量時間去編寫底層的驅(qū)動程序。通過深入分析HAL庫的源碼,我們可以更好地理解其內(nèi)部實現(xiàn)細節(jié),從而更好地利用這一工具來開發(fā)高效、可靠的嵌入式應用程序。文章來源地址http://www.zghlxwxcb.cn/news/detail-828585.html

到了這里,關于【STM32 CubeMX】HAL庫的本質(zhì)讀寫寄存器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • STM32 i2c讀寫寄存器地址8位,16位的方法

    STM32 i2c讀寫寄存器地址8位,16位的方法

    一般常用的寄存器地址是8位的,遇到一個寄存器地址為16為的器件??偨Y一下代碼編寫。 寄存器地址16位的為SY103,寄存器地址為8位的為LT7911. 測試代碼 lt7911該位置寄存器參考手冊 sy103該位置寄存器參考手冊 仿真測試 可以看到把值寫入到相對應的寄存器內(nèi),并且讀出。

    2024年01月19日
    瀏覽(31)
  • STM32CubeMX教程10 RTC 實時時鐘 - 周期喚醒、鬧鐘A/B事件和備份寄存器

    開發(fā)板(正點原子stm32f407探索者開發(fā)板V2.4) STM32CubeMX軟件(Version 6.10.0) keil μVision5 IDE(MDK-Arm) ST-LINK/V2驅(qū)動 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX軟件配置STM32F407開發(fā)板 實現(xiàn)RTC周期喚醒、鬧鐘A/B事件功能 ,具體為在周期喚醒時利用串口輸出當前RTC記錄時間,當鬧鐘

    2024年02月03日
    瀏覽(21)
  • 【07】STM32·HAL庫開發(fā)-新建寄存器版本MDK工程 |下載STM32Cube固件包 | 新建MDK工程步驟

    【07】STM32·HAL庫開發(fā)-新建寄存器版本MDK工程 |下載STM32Cube固件包 | 新建MDK工程步驟

    獲取方式一 :ST官網(wǎng)搜索STM32Cube+回車 ??這里以F1系列為例,點擊【STM32CubeF1】 ??點擊【Get Software】即可進行下載,首次下載需要注冊郵箱, 是免費的 。 ?? 這里下載最新的1.8.5版本為例進行后期章節(jié)編寫。 獲取方式二 :正點原子開發(fā)板A盤資料:A 盤→8,STM32 參考資料

    2024年02月11日
    瀏覽(32)
  • 寄存器內(nèi)存讀寫指令(二) —— 多寄存器讀寫 LDM / STM

    寄存器內(nèi)存讀寫指令(二) —— 多寄存器讀寫 LDM / STM

    有的時候,CPU可能會遇到 a++; b++; c++,這個時候為了提升效率,CPU可能會一次將多個寄存器里的變量保存到內(nèi)存中。這個時候之前介紹的 LDR / STR 指令雖然也能實現(xiàn),但只能操作一個寄存器的讀寫。 因此,考慮到這點,下面介紹多個寄存器的讀寫指令 將 多個寄存器 的數(shù)據(jù)寫

    2024年02月07日
    瀏覽(17)
  • 【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向

    【13】STM32·HAL庫-正點原子SYSTEM文件夾 | SysTick工作原理、寄存器介紹 | printf函數(shù)使用、重定向

    ??下面函數(shù)都是以sys_開頭,定義在sys.c中。正點原子函數(shù)現(xiàn)階段命名規(guī)則如果是在led.c中,則以led_開頭。在F7/H7系列中會存在Cache配置函數(shù),I-Cache中存儲指令,D-Cache中存儲數(shù)據(jù)。 ??SysTick,即系統(tǒng)滴答定時器,包含在M3/4/7內(nèi)核里面,核心是一個24位的遞減計數(shù)器( 最大計

    2024年02月15日
    瀏覽(62)
  • stm32的BRR寄存器和BSRR寄存器

    stm32的BRR寄存器和BSRR寄存器

    1、BRR--- ? bit ? RESET(置0)? register?? //高16位無,低16位置1為0,不能寫1 2 、BSRR--- ? bit ? SET(設置1或0) ? ? ? register?? //低16位設置1為0 BSRR:用于低16位的作用是讓指定的IO口置1;而高16位的作用是讓指定的IO口置0。 ?

    2024年02月11日
    瀏覽(30)
  • STM32之寄存器

    STM32之寄存器

    在學習STM32之前有必要了解一下ARM架構,以下相關ARM架構的知識來自百度百科?:? ARM架構,曾稱進階精簡指令集機器(Advanced?RISC?Machine)更早稱作Acorn RISC Machine,是一個32位精簡指令集(RISC)架構。還有基于ARM設計的派生產(chǎn)品,重要產(chǎn)品包括Marvell的XScale架構和德州儀器的

    2024年02月22日
    瀏覽(24)
  • STM32寄存器點亮LED燈

    STM32寄存器點亮LED燈

    ?這個燈是 PB5引腳 看原理圖可以看出 讓GPIOB5輸出低電平 就能點亮 那么我們得讓 打開控制GPIOB5的時鐘 讓GPIOB5?輸出模式 讓GPIOB5低電平 時鐘就相當于一個閥門開關,或者理解成水龍頭,你打開了 才有水出來,也就是你打開才能工作。 看中文參考手冊 系統(tǒng)架構 找到你的GPIO

    2024年02月07日
    瀏覽(35)
  • STM32 入門 —— 寄存器與 GPIO

    STM32 入門 —— 寄存器與 GPIO

    STM32 總線構圖: 什么是寄存器 根據(jù)百度百科介紹,寄存器是中央處理器內(nèi)的組成部分。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數(shù)據(jù)和地址。簡單來說,寄存器就是存放東西的東西,存放的東西是指令、數(shù)據(jù)或地址 存放數(shù)據(jù)的寄存器最容易理解,不同

    2024年02月04日
    瀏覽(29)
  • STM32 寄存器配置筆記——GPIO配置輸出

    STM32 寄存器配置筆記——GPIO配置輸出

    ? ? ? ?本文主要介紹GPIO 作為輸出時的寄存器配置。包括時鐘配置,輸出模式配置。以STM32F10xxx系列為例,配置PA8、PD2端口作為輸出,輸出高/低電平。 ? ? ? ? 1)GPIO外設時鐘 ? ? ? ? ?通過查找STM32F10xxx中文參考手冊得知,GPIO PORT口的時鐘配置在RCC_APB2ENR寄存器的第2~6位,

    2024年01月24日
    瀏覽(44)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包