有基础快速学习hal库--NVIC

本文介绍了从标准库过渡到STM32F103的HAL库时,如何快速学习和配置中断处理,包括NVIC的工作原理、中断优先级设置、中断使能以及EXTI初始化示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大部分小伙伴应该和我一样是从标准库学起的stm32,在过度到hal库时常常因为网上时常过长或者讲不清楚的教程而止步,(还有真心觉得标准库挺好用的//捂脸)

我打算之后在学习的同时更新一些不那么全面,只抓重点用于让熟悉标准库的同学快速上手的hal库笔记

STM32F103

内核中断

外部中断

中断优先级

10

60

16

相关寄存器

位数

寄存器个数

中断使能寄存器ISER

32

8

中断除能寄存器ICER

32

8

应用程序中断及复位控制寄存器AIRCR

32

1

中断优先级寄存器IPR

8

240

NVIC工作过程

外部中断---进入nvic

aircr控制几位抢占几位响应

抢占优先级高可以打断抢占优先级低的

响应优先级越高越先

数值越小优先级越高

ipr控制中断优先级

然后依据优先级大小发送给cpu

Aircr

Ipr(几位抢占几位响应)

111

0:4

110

1:3

101

2:2

100

3:1

011

4:0

NVIC的使用

1,设置中断分组(aircr)

HAL_NVIC_SetPriorityuGrouping

2,设置中断优先级(iprx)

HAL_NVICSetPriority

3,使能中断(iser)

HAL_NVICEnableIRQ

Tips

例程代码:

void EXTI_Init(void)

{

    GPIO_InitTypeDef GPIO_Initure;

   

    __HAL_RCC_GPIOA_CLK_ENABLE();               //开启GPIOA时钟

    __HAL_RCC_GPIOE_CLK_ENABLE();               //开启GPIOE时钟

   

    GPIO_Initure.Pin=GPIO_PIN_0;                //PA0

    GPIO_Initure.Mode=GPIO_MODE_IT_RISING;      //上升沿触发

    GPIO_Initure.Pull=GPIO_PULLDOWN;

    HAL_GPIO_Init(GPIOA,&GPIO_Initure);

   

    GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;         //PE2,3,4

    GPIO_Initure.Mode=GPIO_MODE_IT_FALLING;     //下降沿触发

    GPIO_Initure.Pull=GPIO_PULLUP;

    HAL_GPIO_Init(GPIOE,&GPIO_Initure);

   

    //中断线0-PA0

    HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);       //抢占优先级为2,子优先级为0

    HAL_NVIC_EnableIRQ(EXTI0_IRQn);             //使能中断线0

   

    //中断线2-PE2

    HAL_NVIC_SetPriority(EXTI2_IRQn,2,1);       //抢占优先级为2,子优先级为1

    HAL_NVIC_EnableIRQ(EXTI2_IRQn);             //使能中断线2

   

    //中断线3-PE3

    HAL_NVIC_SetPriority(EXTI3_IRQn,2,2);       //抢占优先级为2,子优先级为2

    HAL_NVIC_EnableIRQ(EXTI3_IRQn);             //使能中断线2

   

    //中断线4-PE4

    HAL_NVIC_SetPriority(EXTI4_IRQn,2,3);           //抢占优先级为2,子优先级为3

    HAL_NVIC_EnableIRQ(EXTI4_IRQn);                 //使能中断线

}

   使用格式:

   HAL_NVIC_SetPriority(EXTI0_IRQn,2,0);      

   HAL_NVIC_EnableIRQ(EXTI0_IRQn);            

### STM32标准迁移到HAL的入门指南 #### 1. 理解STM32 HAL的特点 STM32 HAL(Hardware Abstraction Layer)是一种硬件抽象层,旨在简化嵌入式系统的开发过程。它通过提供一组统一的API函数隐藏了底层寄存器操作的细节[^2]。这种设计使得开发者无需深入了解具体的硬件寄存器配置方式即可实现对外设的功能控制。 #### 2. 迁移前的准备 在从标准迁移到HAL之前,需要做好以下准备工作: - **熟悉HAL结构**:了解HAL的整体框架以及其提供的主要功能模块。 - **安装必要的工具链**:确保已正确安装支持HAL开发的IDE(如MDK),并确认驱动程序已经适配好设备需求[^1]。 #### 3. 编程模型对比 ##### 标准的方式 标准通常依赖于直接访问外设寄存器来进行初始化和数据处理。例如,在使用串口通信时,可能需要手动设置波特率、字长等多个参数对应的寄存器位。 ##### HAL的方式 相比之下,HAL提供了更高层次的封装。对于同样的串口功能,只需调用`HAL_UART_Init()`函数,并传递一个预定义好的UART句柄结构体实例给该函数即可完成大部分基础配置工作。 以下是基于HAL的一个简单UART初始化示例代码: ```c #include "stm32f4xx_hal.h" UART_HandleTypeDef huart2; void MX_USART2_UART_Init(void) { huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; huart2.Init.Mode = UART_MODE_TX_RX; huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart2.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart2) != HAL_OK) { // Initialization Error while(1); } } ``` 这段代码展示了如何利用HAL中的`HAL_UART_Init()`函数快速配置USART外设的各项属性而无需逐一手动调整各个相关联的寄存器字段值。 #### 4. 实际迁移步骤建议 为了顺利地将项目从标准转换至HAL,可以遵循如下策略: - 对现有源码进行全面审查,识别出哪些部分涉及到了低级寄存器操控逻辑; - 查阅官方文档或者第三方资料寻找相应的替代方案——即找到匹配的新版本API及其正确的输入参数形式; - 测试修改后的每一个环节以验证新旧两套机制间行为一致性; #### 5. 学习资源推荐 除了阅读官方手册之外还可以参考一些在线课程或书籍进一步加深理解有关知识点的应用技巧。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值