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

过程概览:

Gpio(外部中断信号)-->AFIO(设置映射关系)-->EXTI(设置如何触发和是否打开)-->NVIC(管理优先级)

F1拥有20根中断线

分别有gpio ,pvd,rtoc,usb otg fs…

常用中断寄存器

中断屏蔽寄存器

EXTI_IMR

请求挂起寄存器

EXTI_PR

上升沿触发寄存器

EXTI_RTSR

下降沿触发寄存器

EXTI_FTSR

1,上升沿触发选择寄存器(EXTI_RTSR)

寄存器大小为32位,其中0~18可用,其余保留(19位为互联型产品专用)

2,下降沿触发

中断屏蔽和挂起

EXTI中断线0~15如何分配到gpio端口?

使用AFIO——EXTICR的1~4

(需要开启AFIO的时钟:__HAL_RCC_AFIO_CLK_ENABLE();)

使用方法:

Eg:exti0只能对应0号端口AFIO只决定端口分类比如P"a",p"b"

0000

A

0001

B

0010

C

0011

D

0100

E

0101

F

0110

g

AFIO_EXTICR一共有四组:AFIO_EXTICR1,AFIO_EXTICR2,AFIO_EXTICR3,AFIO_EXTICR4

分别对应exti0~3,exti4~7………

exti应用传统配置步骤

HAL库配置过程

1,使能gpio时钟

_HAL_RCC_GPIOx_CLK-ENABLE

2,GPIO/AFIO/EXTI

HAL_GPIO_Init

3,中断分组

HAL_NVIC_SetPriorityGrouping

4,中断优先级

HAL_NVIC_SetPriority

5,中断使能

HAL_NVIC_EnableIRQ

6,中断服务函数

EXTIx_IRQHandler

HAL_GPIO_Init内容设置

例程代码:

void EXTI_Init(void)

{

    GPIO_InitTypeDef GPIO_Initure;

   

    __HAL_RCC_GPIOA_CLK_ENABLE();               //开启GPIOA时钟                      STEP1

    __HAL_RCC_GPIOE_CLK_ENABLE();               //开启GPIOE时钟

   

    GPIO_Initure.Pin=GPIO_PIN_0;                //PA0

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

    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 STEP4

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

   

    //中断线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

//中断服务函数

void EXTI0_IRQHandler(void)//STEP6

{

    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);                //调用中断处理公用函数

}

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)     //调用公用函数之后,定义此回调函数进行用户代码的编写

{

  /*用户代码位置*/  ;

}

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
针对STM32G4HAL库串口空闲中断接收不定长数据的问题,可以按照以下步骤进行解决: 1. 开启串口空闲中断,即在初始化串口时,将USART_CR1_REG中的USART_CR1_IDLEIE位设置为1。 2. 在串口空闲中断中,通过读取USART_ISR_REG寄存器中的位USART_ISR_RXNE和USART_ISR_IDLE来判断是接收到数据还是空闲中断。 3. 如果是接收到数据,则读取USART_RDR_REG寄存器中的数据,并将其存储到缓冲区中。 4. 如果是空闲中断,则通过计算接收到的数据长度来确定数据的长度,并将其存储到缓冲区中。 5. 在数据长度达到预定长度时,可以通过回调函数或者其他方式来通知数据接收已经完成。 下面是一个示例代码: ```c uint8_t rx_buffer[100]; uint8_t rx_counter = 0; uint8_t rx_length = 0; uint8_t rx_flag = 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USARTx) { if(rx_flag == 0) { //接收到数据 if((__HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE) != RESET) && (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) == RESET)) { rx_buffer[rx_counter++] = (uint8_t)(huart->Instance->RDR & 0x00FF); } //空闲中断 else if(__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET) { rx_length = rx_counter; rx_counter = 0; rx_flag = 1; } } } } ``` 在上面的代码中,当接收到数据时,将数据存储到缓冲区中,并将计数器rx_counter加1。当空闲中断发生时,计算接收到的数据长度,并将其存储到rx_length中。在接收完成后,将rx_flag设置为1,表示数据接收已经完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值