0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

寄存器开发,HAL开发和LL开发的区别和参考代码

撞上电子 2023-11-17 08:00 次阅读

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

    文章

    6812

    浏览量

    147659
  • 寄存器
    +关注

    关注

    30

    文章

    5036

    浏览量

    117763
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66809
收藏 人收藏

    评论

    相关推荐

    stm32f401使用hall库HAL_DMA_Init中DMA_SxCR寄存器的配置无效怎么解决?

    adc+dma采样,代码是通过cubemx生成的,调试时发现adc通过dma采集到的数据不对,通过单步仿真发现在HAL_DMA_Init函数中配置dma的CR寄存器没有生效,但是在dma初始化完成后再对cr
    发表于 03-15 06:16

    STM32库函数与寄存器开发区别

    直接操作寄存器,运行效率高。
    的头像 发表于 10-31 16:04 1886次阅读
    STM32库函数与<b class='flag-5'>寄存器</b><b class='flag-5'>开发区别</b>

    STM32的HALLL库到底能不能混合使用呢?

    STM32的HALLL库到底能不能混合使用呢? STM32的HAL(Hardware Abstraction Layer)和LL(Low Level)库是ST公司为快速
    的头像 发表于 10-26 17:42 984次阅读

    新唐开发平台:进阶使用者的七大诀窍(3)使用System Viewer检查寄存器状态

    新唐开发平台:进阶使用者的七大诀窍(3)使用System Viewer检查寄存器状态
    的头像 发表于 08-09 11:39 495次阅读
    新唐<b class='flag-5'>开发</b>平台:进阶使用者的七大诀窍(3)使用System Viewer检查<b class='flag-5'>寄存器</b>状态

    新唐开发平台:进阶使用者的七大诀窍(7)使用PinView来检查寄存器状态

    新唐开发平台:进阶使用者的七大诀窍(7)使用PinView来检查寄存器状态
    的头像 发表于 08-09 11:35 294次阅读
    新唐<b class='flag-5'>开发</b>平台:进阶使用者的七大诀窍(7)使用PinView来检查<b class='flag-5'>寄存器</b>状态

    STM32 HAL库的功能和使用方法 STM32 HAL库和标准库的区别

    和可维护性,从而节省开发成本和时间。STM32 HAL库是STM32系列芯片的HAL库,由ST公司提供和维护。下面将介绍STM32 HAL库的功能、使用方法以及与标准库的
    发表于 08-08 18:21 2283次阅读

    stm32f401使用hall库HAL_DMA_Init中DMA_SxCR寄存器的配置无效怎么处理

    adc+dma采样,代码是通过cubemx生成的,调试时发现adc通过dma采集到的数据不对,通过单步仿真发现在HAL_DMA_Init函数中配置dma的CR寄存器没有生效,但是在dma初始化完成后再对cr
    发表于 08-05 07:36

    基于DWC2的USB驱动开发-发送相关的寄存器DMA寄存器详解

    本文转自公众号,欢迎关注 基于DWC2的USB驱动开发-发送相关的寄存器DMA寄存器详解 (qq.com) 前言 如下寄存器DIEPxxx,对应IN端点,和发送数据相关,这一篇先介绍和
    的头像 发表于 07-16 16:42 888次阅读
    基于DWC2的USB驱动<b class='flag-5'>开发</b>-发送相关的<b class='flag-5'>寄存器</b>DMA<b class='flag-5'>寄存器</b>详解

    STM32的HAL库与标准库的区别

    新手在入门 STM32 的时候,一般大多数都会选用标准库和 HAL 库,而极少部分人会通过直接配置寄存器进行开发。 对于刚入门的朋友,可能没法直观了解这些不同开发发方式之间的
    的头像 发表于 06-22 11:43 2769次阅读
    STM32的<b class='flag-5'>HAL</b>库与标准库的<b class='flag-5'>区别</b>

    STM32标准库、HAL库和LL库介绍

    我们在进行STM32开发的时候,使用寄存器进行开发的终究是少数,大多数人还是习惯用库函数进行开发。到目前为止,有标准外设库、HAL库、
    发表于 06-21 15:13 8051次阅读
    STM32标准库、<b class='flag-5'>HAL</b>库和<b class='flag-5'>LL</b>库介绍

    单片机的寄存器编程与位运算

    这次一起来学习一下单片机开发时必备技术——位运算和寄存器编程。
    发表于 06-21 11:11 1053次阅读
    单片机的<b class='flag-5'>寄存器</b>编程与位运算

    基于DWC2的USB驱动开发-0x0D PHY寄存器读写代码编写与测试

    我们前面重点介绍了ULPI接口和PHY的寄存器,这一篇来进行PHY寄存器读写的代码编写与测试。从这一篇开始就正真进入了驱动编写的过程了。
    的头像 发表于 06-06 13:03 1246次阅读
    基于DWC2的USB驱动<b class='flag-5'>开发</b>-0x0D PHY<b class='flag-5'>寄存器</b>读写<b class='flag-5'>代码</b>编写与测试

    基于STM32F407寄存器开发点灯

    寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码寄存器,需用
    的头像 发表于 05-19 15:08 1092次阅读
    基于STM32F407<b class='flag-5'>寄存器</b><b class='flag-5'>开发</b>点灯

    我玩Arduino,但我使用寄存器开发

    。ArduinoIDE提供了一个非常简洁、易于使用的开发环境,使编写和上传代码变得简单。它提供了一套简化的函数库和API,使开发者可以轻松地与ATmega328P的硬件进行交互,无需深入了解底层的
    的头像 发表于 05-19 09:27 1498次阅读
    我玩Arduino,但我使用<b class='flag-5'>寄存器</b><b class='flag-5'>开发</b>

    基于DWC2的USB驱动开发-0x05 DWC2 USB2.0 IP 寄存器介绍

    本文对控制器的寄存器有了一个整体上的概览,先了解个大概,了解寄存器的组织结构,大致了解一下常用的寄存器。后面编程时再一个个对照每一个寄存器的描述去编写
    的头像 发表于 05-16 12:50 2048次阅读
    基于DWC2的USB驱动<b class='flag-5'>开发</b>-0x05 DWC2 USB2.0 IP <b class='flag-5'>寄存器</b>介绍