[5-2] 对射式红外传感器计次&旋转编码器计次 江协科技学习笔记(38个知识点)

发布于:2025-05-10 ⋅ 阅读:(21) ⋅ 点赞:(0)

1、

2、

3、这些缩写通常出现在嵌入式系统或微控制器的上下文中,它们各自有不同的功能:

• RCC:Reset and Clock Control(复位和时钟控制)。它负责管理微控制器的时钟系统,包括时钟源的选择、时钟频率的设置以及复位控制等。

• GPIO:General Purpose Input/Output(通用输入输出)。这是微控制器上的一组可编程引脚,可以被配置为输入或输出模式,用于与外部设备进行通信。

• AFIO:Alternate Function Input/Output(备用功能输入输出)。在一些微控制器中,它用于配置引脚的备用功能,例如将引脚用作特定的外设接口,如USART、SPI、I2C等。

• EXTI:External Interrupt/Event Controller(外部中断/事件控制器)。它用于管理外部中断和事件,允许微控制器响应外部信号,如按钮按下或传感器输入。

• NVIC:Nested Vectored Interrupt Controller(嵌套向量中断控制器)。它是一个中断控制器,用于管理微控制器的中断优先级和中断服务例程的调用。

这些组件在微控制器的设计中非常重要,因为它们提供了与外部世界交互的基本机制,以及确保系统能够正确响应各种事件和中断。

4

5

6

7

8

9

10

11

12

13

14在嵌入式系统或软件开发中,"config" 通常指的是配置文件或配置过程。

15

16

17

• ENABLE通常指开启某个功能或外设,使其可以工作。比如,使能一个GPIO端口或启动一个定时器。

• DISABLE则指关闭某个功能或外设,使其停止工作。比如,禁用一个GPIO端口或停止一个定时器。

这两个操作通常涉及到设置或清除特定的寄存器位。

18

• 中断模式:当事件发生时,微控制器会暂停当前工作,去处理这个事件,处理完后再回到原来工作的地方继续。

• 事件模式:当事件发生时,微控制器不会暂停当前工作,而是发送一个信号,让另一个系统部分去处理这个事件。

在STM32微控制器中,中断和事件的优先级处理如下:

• 中断优先级:

• 中断有优先级的概念,可以设置不同的优先级。

• 高优先级的中断可以打断低优先级的中断。

• 优先级可以通过NVIC(嵌套向量中断控制器)进行配置。

• 事件优先级:

• 事件模式本身不涉及优先级的概念,因为它不直接触发中断。

• 事件通常用于触发其他操作,如启动DMA传输,而不涉及中断服务例程。

总结:

• 中断有优先级,可以配置不同优先级来控制中断的处理顺序。

• 事件模式没有优先级,它更多用于触发其他操作,而不是直接处理事件。

19

20

22

23

24

好的,以下是GPIO、AFIO、EXTI和NVIC的中文介绍以及它们的用途:

• GPIO(通用输入输出):

• 是什么:GPIO是微控制器上的一组多功能引脚,可以被配置为输入或输出模式。

• 有什么用:用于与外部设备进行数字信号的交互,如读取按钮状态、控制LED灯等。

• AFIO(备用功能输入输出):

• 是什么:AFIO是STM32微控制器中用于配置引脚备用功能的模块。

• 有什么用:可以将GPIO引脚映射到特定的外设功能,如USART、SPI、I2C等,使得同一个引脚可以用于不同的功能。

• EXTI(外部中断/事件控制器):

• 是什么:EXTI是用于管理外部中断和事件的模块。

• 有什么用:可以检测外部引脚上的信号变化(如上升沿、下降沿),并生成中断或事件信号,触发相应的处理程序。

• NVIC(嵌套向量中断控制器):

• 是什么:NVIC是STM32微控制器中的中断控制器,用于管理中断和异常。

• 有什么用:负责中断的优先级管理、中断使能和禁用,以及在中断发生时进行任务切换,确保高优先级的中断能够及时得到处理。

这些模块共同协作,使得STM32微控制器能够有效地处理外部信号和中断,实现与外部设备的交互和控制。

25

26

27

28

29

30

31

32

33

/**

  * 函    数:旋转编码器初始化

  * 参    数:无

  * 返 回 值:无

  */

void Encoder_Init(void)

{

/*开启时钟*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                //开启GPIOB的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);                //开启AFIO的时钟,外部中断必须开启AFIO的时钟



/*GPIO初始化*/

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);                                                //将PB0和PB1引脚初始化为上拉输入



/*AFIO选择中断引脚*/

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);//将外部中断的0号线映射到GPIOB,即选择PB0为外部中断引脚

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);//将外部中断的1号线映射到GPIOB,即选择PB1为外部中断引脚



/*EXTI初始化*/

EXTI_InitTypeDef EXTI_InitStructure;                                                //定义结构体变量

EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;                //选择配置外部中断的0号线和1号线

EXTI_InitStructure.EXTI_LineCmd = ENABLE;                                        //指定外部中断线使能

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;                        //指定外部中断线为中断模式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;                //指定外部中断线为下降沿触发

EXTI_Init(&EXTI_InitStructure);                                                                //将结构体变量交给EXTI_Init,配置EXTI外设



/*NVIC中断分组*/

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                //配置NVIC为分组2

//即抢占优先级范围:0~3,响应优先级范围:0~3

//此分组配置在整个工程中仅需调用一次

//若有多个中断,可以把此代码放在main函数内,while循环之前

//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置



/*NVIC配置*/

NVIC_InitTypeDef NVIC_InitStructure;                                                //定义结构体变量

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //选择配置NVIC的EXTI0线

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //指定NVIC线路使能

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //指定NVIC线路的抢占优先级为1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //指定NVIC线路的响应优先级为1

NVIC_Init(&NVIC_InitStructure);                                                                //将结构体变量交给NVIC_Init,配置NVIC外设



NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;                        //选择配置NVIC的EXTI1线

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //指定NVIC线路使能

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //指定NVIC线路的抢占优先级为1

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                        //指定NVIC线路的响应优先级为2

NVIC_Init(&NVIC_InitStructure);                                                                //将结构体变量交给NVIC_Init,配置NVIC外设

}



/**

  * 函    数:旋转编码器获取增量值

  * 参    数:无

  * 返 回 值:自上此调用此函数后,旋转编码器的增量值

  */

int16_t Encoder_Get(void)

{

/*使用Temp变量作为中继,目的是返回Encoder_Count后将其清零*/

/*在这里,也可以直接返回Encoder_Count

  但这样就不是获取增量值的操作方法了

  也可以实现功能,只是思路不一样*/

int16_t Temp;

Temp = Encoder_Count;

Encoder_Count = 0;

return Temp;

}

34

35

36

37

38

38


网站公告

今日签到

点亮在社区的每一天
去签到