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

发布时间:2024-07-02  

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>