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官方都放弃了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 微控制器
    +关注

    关注

    49

    文章

    8910

    浏览量

    166045
  • 寄存器
    +关注

    关注

    31

    文章

    5625

    浏览量

    130664
  • 代码
    +关注

    关注

    30

    文章

    4983

    浏览量

    74554
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RK3562 单板机嵌入式 eMMC 健康监测开发指南:数据采集与状态分析

    本文为创龙科技RK3562 单板机 eMMC 健康管理开发指南,围绕 emmc_get_info 案例,详解 eMMC 的 EXT_CSD 寄存器查询、多品牌寿命评估(擦写次数、坏块、寿命消耗
    的头像 发表于 03-31 15:07 240次阅读
    RK3562 单板机嵌入式 eMMC 健康监测<b class='flag-5'>开发</b>指南:数据采集与状态分析

    74HC595 8位移位寄存器:设计与应用全解析

    74HC595 8位移位寄存器:设计与应用全解析 在电子工程师的工具箱中,移位寄存器是一个非常实用的组件。今天,我们就来深入了解一下SG Micro Corp的74HC595 8位串行输入/串行输出
    的头像 发表于 03-16 10:35 580次阅读

    《机智云Gokit3开发篇》4 RGB灯的介绍与驱动移植(HAL库)

    的色彩控制能力。本文聚焦Gokit3开发板(MCU模式,主控STM32F103C8T6),以HAL库为开发基础,从P9813驱动芯片的工作原理入手,系统讲解RGB灯的
    的头像 发表于 01-28 19:11 5432次阅读
    《机智云Gokit3<b class='flag-5'>开发</b>篇》4 RGB灯的介绍与驱动移植(<b class='flag-5'>HAL</b>库)

    从“能用”到“懂原理”:ARMv8寄存器架构深度拆解

    做嵌入式或芯片开发的同学,大概率都有过这样的困惑: 写汇编时知道X0-X30是通用寄存器,调用函数时按规矩用X0-X7传参,但为什么是这8个?剩下的寄存器又该怎么划分职责?调试异常时,盯着SPSR
    的头像 发表于 01-10 07:10 474次阅读
    从“能用”到“懂原理”:ARMv8<b class='flag-5'>寄存器</b>架构深度拆解

    机智云Gokit3开发篇 — 搭建Gokit3工程(HAL库版)

    微控制,支持多种开发环境,使学习与开发变得更加便捷。本文将带您从零基础开始,逐步搭建Gokit3的HAL库工程,并通过简单的点灯实验,让您感受开发
    的头像 发表于 01-08 19:14 734次阅读
    机智云Gokit3<b class='flag-5'>开发</b>篇 — 搭建Gokit3工程(<b class='flag-5'>HAL</b>库版)

    CW32L011开发支持

    的工程创建,开发者可以方便地配置芯片型号、时钟频率等参数。其内置的调试能够实时监控程序的运行状态,查看寄存器、变量的值,帮助开发者快速定位和解决问题。 IAR Embedded Wo
    发表于 11-17 06:30

    嵌入式系统必懂的 20 个寄存器

    嵌入式开发看起来很复杂,但很多操作其实都离不开寄存器寄存器就是MCU内部的存储单元,它们控制着处理和外设的行为。熟悉这些寄存器,你就能更
    的头像 发表于 11-14 10:28 1473次阅读
    嵌入式系统必懂的 20 个<b class='flag-5'>寄存器</b>

    主流低代码开发平台有哪些:加速数字化转型的核心力量

    在数字化转型浪潮席卷各行各业的当下,企业对快速开发、灵活迭代应用程序的需求日益迫切。低代码开发平台凭借其可视化编程、模块化组件和简化开发流程的特点,成为解决传统
    的头像 发表于 11-03 16:53 742次阅读

    代码开发平台推荐:2025国内低代码开发平台排名TOP10

    代码开发平台排行榜 在企业数字化转型的浪潮中,低代码开发平台正逐渐成为企业实现高效开发和快速迭代的重要工具。随着技术的不断进步和市场需求的
    的头像 发表于 10-28 10:22 1037次阅读

    【六岳微LY-F335开发板试用体验】软件开发环境及调试下载

    和Register窗口查看寄存器和内存单元的值可能没有改变。可以尝试刷新窗口,如果任然得不到更新,可以用代码判断相应的值。 6.3遇到一些奇奇怪怪的问题,请重启CCS软件 在JTAG有连接,开发板上电,硬件配置文件
    发表于 09-26 15:55

    ‌SN74HCT595 8位移位寄存器技术解析与应用指南

    Texas Instruments SN74HCT595/SN74HCT595-Q1 8位移位寄存器包含8位串进并出移位寄存器,向8位D类存储寄存器馈送信号。存储寄存器具有并行 3 状
    的头像 发表于 09-19 14:31 1335次阅读
    ‌SN74HCT595 8位移位<b class='flag-5'>寄存器</b>技术解析与应用指南

    怎么用LL命令读取SPI?

    用cubemx构建工程,MDK开发,这个项目采用AD4020 20位2MSPS外置ADC,ADC转换速率高达0.5us,而STM32H5用HALHAL_SPI_Receive(&
    发表于 09-09 08:17

    Perforce JRebel 简介:即时加载代码变更,加速Java应用开发

    Perforce JRebel 专为Java开发提速而生!支持跳过构建与重新部署,实时加载代码变更,支持100+框架,无缝集成主流IDE与应用服务
    的头像 发表于 08-14 14:35 1053次阅读
    Perforce JRebel 简介:即时加载<b class='flag-5'>代码</b>变更,加速Java应用<b class='flag-5'>开发</b>

    HarmonyOS 代码工坊的指尖开发,让 APP 开发所见即所得

    沙盘被直接搬入了移动设备本身。眼尖的开发者应该已经发现,最近华为应用市场“应用尝鲜”专区里,上架了一款名为“HarmonyOS 代码工坊”的新应用,下载量持续攀升。 开发者只需要下载“HarmonyOS
    的头像 发表于 06-24 12:08 995次阅读
    HarmonyOS <b class='flag-5'>代码</b>工坊的指尖<b class='flag-5'>开发</b>,让 APP <b class='flag-5'>开发</b>所见即所得

    使用寄存器点亮LED灯

    学习本章时,配合以上芯片手册中的“19. I/O Ports”章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。本章内容涉及到较多寄存器方面的深入内容,对于初学者而言这些内容丰富也较难理解,但非常有必要细读研究、夯实基础。
    的头像 发表于 05-28 17:37 1596次阅读
    使用<b class='flag-5'>寄存器</b>点亮LED灯