STM32智能小车------红外避障+NVIC

目录


一、NVIC

1.中断优先级

中断优先级:中断优先级分为抢占优先级和响应优先级;我们配置一个中断的抢占优先级和响应优先级来设置中断的优先级。
抢占优先级:在一个中断正在发生时,另外一个抢占优先级比它高的中断也发生了,那么抢占优先级高的那个中断就可以打断抢占优先级低的那个中断。
响应优先级:如果两个中断的同时发生,他们的抢占优先级相同,但一个的响应优先级高于另外一个,那么响应优先级高的那个中断就先发生。

2.中断优先级分组

我们通过调用函数或者直接操作寄存器来实现中断优先级的分组:
其中第二列是我们可以设置的中断优先级的范围,第三列是我们可以设置的响应优先级的范围。
在固件库中,我们通过调用下面这个函数来确定中断优先级分组:

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);

在这里插入图片描述
这个图片在文件夹 stm32f10x_exti.c 中的 misc.h这个文件夹可以找到;

二、外部中断的一般配置过程

1.初始化GPIO
2.开启IO口复用时钟
3.设置IO口与中断线的映射关系
4.初始化线上中断(EXTI),设置触发条件
5.配置中断分组(NVIC),并使能中断
6.编写中断服务函数
7.清除中断标志位

1.GPIO_Init()

我这里使用的是红外避障模块,IO口:PB4

void HongWai_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能GPIOB端口时钟
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;				
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; 		 //下拉输入
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 //速度为50MHz
 GPIO_Init(GPIOB, &GPIO_InitStructure);	 //根据参数初始化GPIOB.4
}

要注意的点就是:因为红外避障模块遇到障碍物的时候会输出一个高电平,所以配置GPIO的模式的时候要配置成下拉输入。

2.void EXTIX_Init(void)编写

void EXTIX_Init(void)
{
	//1.GPIO初始化
	HongWai_Init();
	EXTI_InitTypeDef EXTI_InitStructre;
	NVIC_InitTypeDef NVIC_InitStructre;
	//2.开启IO口复用时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	//3.设置IO口与中断线的映射关系
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);
	//4.初始化线上中断(EXTI),设置触发条件
	EXTI_InitStructre.EXTI_Line = EXTI_Line4;//配置中断线,和IO口有关
	EXTI_InitStructre.EXTI_LineCmd = ENABLE;//使能
	EXTI_InitStructre.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
	EXTI_InitStructre.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发
	EXTI_Init(&EXTI_InitStructre);
	//5.配置中断分组(NVIC),并使能中断
	NVIC_InitStructre.NVIC_IRQChannel = EXTI4_IRQn;
	NVIC_InitStructre.NVIC_IRQChannelCmd = ENABLE;//使能
	NVIC_InitStructre.NVIC_IRQChannelPreemptionPriority = 2;//中断优先级配置
	NVIC_InitStructre.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&NVIC_InitStructre);
}

关键代码讲解:

//设置IO口与中断线的映射关系
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);

因为我使用的是PB4,所以参数就是GPIO_PortSourceGPIOBGPIO_PinSource4

//4.初始化线上中断(EXTI),设置触发条件
	EXTI_InitStructre.EXTI_Line = EXTI_Line4;//配置中断线,和IO口有关
	EXTI_InitStructre.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发

因为我用的IO是PB4所以中断线就是EXTI_Line4;
EXTI_Trigger_Rising上升沿触发:当IO的电平由低转到高的时候会触发中断。

//5.配置中断分组(NVIC),并使能中断
	NVIC_InitStructre.NVIC_IRQChannel = EXTI4_IRQn;

如果io口为1-4:这个参数就是:EXTI1_IRQn ,EXTI2_IRQn,EXTI3_IRQn ,EXTI4_IRQn
如果io为5-9:这个参数就是:EXTI9_5_IRQn
io为10到15:io口为:EXTI15_10_IRQn

3.void EXTI4_IRQHandler()中断触发函数

这个函数名称不可改,和你使用的IO口有关,和上面的NVIC_InitStructre.NVIC_IRQChannel配置是一样的
在这里插入图片描述
因为我用的是pb4,所以我编写的中断服务函数就是EXTI4_IRQHandler()

void EXTI4_IRQHandler()
{
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4))
	{
		LED0 = !LED0;
	}
	EXTI_ClearITPendingBit(EXTI_Line4);
}

我配置的触发方式是上升沿触发,所以进入到中断函数之后是高电平,所以我读取PB4的电平,如果为高电平就执行操作,中间的就可以自己写了。
一定不要忘了:EXTI_ClearITPendingBit(EXTI_Line4);

总结

奉上视频:

你见过会说话的小车吗

最后能达到的效果就是当红外模块检测到障碍物时触发中断,可以在中断服务函数中改为让小车拐弯,这样就实现了一个避障功能。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1.时钟源 外部时钟 2.GPIO (实验:点亮LED灯,获取引脚的电平高低,将对应引脚置高置低)。 3.PWM-脉宽调制 主要是调节占空比(在小车中用来实现小车的加减速)。 4.TIMX定时器 5.红外遥控 主要运用了EXTI(外部中断/事件控制器),系统延时(系统滴答定时器SysTick)。 6.超声波避障 了解了超声波工作的原理,主要运用了TIM2定时器(用来定时测距),GPIO口。 7.红外探测 通过对障碍物和光的感应来返回电平的状态,从而达到避障和巡线效果。 8.测速码盘 (通过检测码盘上的凹槽数来获取脉冲数,通过计算公式得到小车当前速度) TIM3定时器(定时测速)。 9.PID算法 为了使小车的速度更快的达到目标值,获取更稳定的速度。 10.系统的使用 我们在小车内加入系统,对小车的数据获取,状态实现任务化,使小车内的运作更加有序。我们主要使用μC/OS-II系统内核来实现系统。在实现过程中,我们了解了系统的任务调度以及任务运行和处理器之间的关系(多任务同时运行)。 μC/OS-II内核中的任务控制块,任务状态,以及多任务和任务的优先级类似操作系统中的进程操作。 11.任务间的通信 主要用到信号量(主要就是PV操作 P操作:占用资源。V操作:释放资源);邮箱(邮箱可以使一个任务或者中断服务子程序向另一个任务发送指针型的变量,通常该指针指向包含了“消息”特定的数据结构)。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小光学嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值