STM32应用过程中遇到的问题

实现功能:

1、自动流水灯:在LED1~LED4上实现自动流水灯,流水间隔时间为200ms/bit,然后通过按键KEY1改变流水灯的速度,每次按键间隔时间增加200ms:当间隔时间增加到1s后(蜂鸣器报警),再次按键间隔时间恢复为初始值200ms。//注:按键同通过中断实现

2、手动流水灯功能:通过按键KEY1控制流水灯一位,每次按键流水灯移动一位,可循环实现。//(1)、在新的程序中实现,不涵盖上题功能。(2)按键通过中断实现

3、综合流水灯:1)通过按键KEY2实现自动流水灯和手动流水灯两种模式的切换。初始模式为自动流水灯模式。当处于自动流水灯模式时,KEY1用于改变流水灯速度,如1题所述。当处于手动流水灯模式时,KEY1用于控制流水灯移位,如2提所述。//注:所有按键用中断实现,延时采用定时器中断实现,操作稳定,可循环实现,对按键抖动和按键时间具有鲁棒性。

对于功能1的实现,我书写的中断内容为:

/*	@函数名称 :中断服务子程序0
@函数功能 :响应中断0的子程序
@输入参数 :无
@返回值 :无
@注意 :中断中不要放延时过长的程序,也不要写死循环
*/
void EXTI0_IRQHandler(void)
{
delay_ms(20); //消抖 ——请不要在中断消抖,删掉这句
if(EXTI_GetFlagStatus(EXTI_Line0)==SET) //标志位是否使能
{
if(time_flag==5) //200*5=1s
{
time_flag=0;
}
else if(time_flag<5)
time_flag=time_flag+1;
}
EXTI_ClearITPendingBit(EXTI_Line0);
}

然后功能实现程序如下图所示:

/*	@函数名称:void LED_Base_200ms(u16 t)
@函数功能:以200ms为基准时间进行延时
@输入参数:t延时基准
@返回值 :无
*/
void LED_Base_200ms(void)
{
// u16 temp; //延时基准时间
// temp=200*(time_flag+1);
// u8 i=1;
// for(;i<=4;i++)
// {
// LED_ON(i);
// delay_ms(temp);
// LED_OFF(i);
// delay_ms(temp);
// }
u8 i;
switch(time_flag+1)
{
case 1 : {
for(i=1;i<=4;i++)
{
LED_ON(i);
delay_ms(200);
LED_OFF(i);
delay_ms(200);
} };
break; case 2 : {
for(i=1;i<=4;i++)
{
LED_ON(i);
delay_ms(400);
LED_OFF(i);
delay_ms(400);
} };
break;
case 3 : {
for(i=1;i<=4;i++)
{
LED_ON(i);
delay_ms(600);
LED_OFF(i);
delay_ms(600);
} };
break;
case 4 : {
for(i=1;i<=4;i++)
{
LED_ON(i);
delay_ms(800);
LED_OFF(i);
delay_ms(800);
} };
break;
default:{
for(i=1;i<=4;i++)
{
LED_ON(i);
delay_ms(1000);
LED_OFF(i);
delay_ms(1000);
Beep_Two_DiDi();
} } }
}

解决问题来了,问题出在延时函数中,其实在中断中最好不要用延时函数,用延时函数容易导致程序跑飞。在本次历程中,进入中断的delay_ms(20);延时还是滴答时钟的延时,虽然精确,但是精确的实验现象无法出来也不行啊,所以解决方案是去掉延时程序,或者换成普通的的循环,最好不用循环。通过本例也说明了在中断可不能乱用延时啊,能不用延时就不用延时。一个小小的破程序,调了我一天,可真是太难受。

对于题目一的实现代码如下所示,每按一次,时间标志位加一,当大于等于5时候清零,主要最好不要包含任何延时,简单的修改标志位就行:

/*	@函数名称 :中断服务子程序0
@函数功能 :响应中断0的子程序
@输入参数 :无
@返回值 :无
@注意 :中断中不要放延时过长的程序,也不要写死循环
*/
void EXTI0_IRQHandler(void)
{
if(EXTI_GetFlagStatus(EXTI_Line0)==SET) //标志位是否使能
{
if(time_flag==5) //200*5=1s
{
time_flag=0;
}
else
time_flag++; }
EXTI_ClearITPendingBit(EXTI_Line0);
}

注意:time_flag是全局变量,并且在h文件中用“extern”修饰,便可在外部调用了

然后实现函数如下:

/*	@函数名称:void LED_Base_200ms(u16 t)
@函数功能:以200ms为基准时间进行延时
@输入参数:time延时基准
@返回值 :无
*/
void LED_Base_200ms(u16 time)
{
u16 temp_time=(time+1)*200;
u8 i=1;
for(;i<=4;i++)
{
LED_ON(i);
delay_ms(temp_time);
LED_OFF(i);
delay_ms(temp_time);
}
}

然后在主函数中调用LED_Base_200ms即可

	LED_Base_200ms(time_flag);

对于功能二实现,还是上面的那个中断程序,但是考虑到,由于用按键触发中断,因此还是会存在一定的抖动,我们就使用非滴答时钟写的延时程序消抖,就普通用循环来消抖,注意最好不用滴答时钟写的延时程序,具体原因由于学的不精,不能解释,如果有大佬可以解释一下,感激不尽。

/*	@函数名称 :中断服务子程序0
@函数功能 :响应中断0的子程序
@输入参数 :无
@返回值 :无
@注意 :中断中不要放延时过长的程序,也不要写死循环
*/
void EXTI0_IRQHandler(void)
{
delay_non_ms(10);
if(EXTI_GetFlagStatus(EXTI_Line0)==SET) //标志位是否使能
{
if(time_flag==5) //200*5=1s
{
time_flag=0;
}
else
time_flag++; }
EXTI_ClearITPendingBit(EXTI_Line0);

然后还是通过标志位来调用灯的亮灭,具体函数如下所示

/*	@函数名称:中断标志控制函数
@函数功能:根据中断的标志来执行响应的功能
@输入参数:无
@返回值 :无
*/
void flag_Control(void)
{
switch(time_flag)
{
case 1 : {LED_Close_All(); LED_ON(1);}break;
case 2 : {LED_Close_All(); LED_ON(2);}break;
case 3 : {LED_Close_All(); LED_ON(3);}break;
case 4 : {LED_Close_All(); LED_ON(4);}break;
default: LED_Close_All();
}
}

然后在主函数中调用flag_Cont();即可实现

对于功能3的实现,就更容易了,首先定义一个模式选择器,全局外部变量哦;然后中断函数是这样写的

/*	@函数名称:中断服务子程序2
@函数功能:响应中断2的子程序
@输入参数:无
@返回值 :无
@注意 :中断中不要放延时过长的程序,也不要写死循环
*/
void EXTI2_IRQHandler(void)
{
delay_non_ms(10);
if(EXTI_GetFlagStatus(EXTI_Line2)==SET)
{
if(mode==1)
{
mode=0;
}
else
mode++;
}
EXTI_ClearITPendingBit(EXTI_Line2); }

然后模式选择器函数是这样写的

/*	@函数名称:void Select_Mode(void)
@函数功能:模式选择器
@输入参数:无
@返回值 :无
@注意 :
*/
void Select_Mode(void)
{
switch(mode+1)
{
case 1 : LED_Base_200ms(time_flag);break;
default: flag_Control();
}
}

后面就可在主程序中调用flag_Control();

STM32中断调试中遇到的问题的更多相关文章

  1. stm32中断无电平触发的解决办法

    这几天在用stm32读取FPGA中FIFO里的数据,遇到了不少的问题.其中有个自己觉得比较好玩的问题,就拿出来写写.其实这个问题也比较简单,开始我觉得没必要拿出来写,不过,想想后觉得还是写写吧,就当做 ...

  2. 第16章 STM32中断应用概览

    第16章     STM32中断应用概览 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  3. 第16章 STM32中断应用概览—零死角玩转STM32-F429系列

    第16章     STM32中断应用概览 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  4. STM32中断编程三步曲教你弄会中断设置以及中断优先级设置

    中断作为stm32中必不可少的一个功能,其重要性是不言而喻的因此把中断学习好是根本. 所以今天就来好好啃一下中断配置的知识,俗话说:磨刀不误砍柴工.问题是什么呢?项目中我用到了一个触摸键盘TTP229 ...

  5. STM32中断管理函数

    CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 ...

  6. stm32 中断几个库函数实现过程分析

    感谢原文作者:鱼竿的传说,这篇文章写得不错,转载自 http://www.cnblogs.com/chineseboy/archive/2013/03/14/2956782.html 前题: 闭门造车 ...

  7. STM32中断控制及优先级设置

    M3用8bits而STM32用高四位来表示抢占和子优先级:bit=1表示抢占:bit=0表示非抢占即子优先级:所以共有5中方案分组: 分组 Bit7 Bit6 Bit5 Bit4 说明: 第0组   ...

  8. 【转载】stm32中断学习

    中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加 ...

  9. stm32 中断号和中断处理函数建立关系

    转载:https://www.cnblogs.com/heny-hui/p/7130620.html stm32的中断号根据不同内核和型号,st公司给的官方库中对相应的中断号进行了设置,我们用到哪一个 ...

  10. STM32 中断应用概览

    本章参考资料< STM32F4xx 中文参考手册>第十章-中断和事件.<ARM Cortex™-M4F 技术参考手册> -4.3 章节: NVIC 和 4.4 章节: SCB— ...

随机推荐

  1. Windows10免安装版的Mysql

    文章转载出处https://www.cnblogs.com/winton-nfs/p/11524007.html 免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用 ...

  2. .什么是 SPA 单页面,它的优缺点分别是什么

    SPA( single-page application )即一个web项目就只有一个页面(即一个HTML文件,HTML 内容的变换是利用路由机制实现的. 仅在 Web 页面初始化时加载相应的 HTM ...

  3. springcloud(四) - 服务治理Hystrix

    功能介绍 调用下游服务,下游因为超时.异常等原因报错的时候.hystrix保证不会出现整体异常,避免雪崩.主要策略是服务的熔断.降级   应用场景 降级:异常.超时.熔断等情况发生后,不让客户端等待返 ...

  4. [MySQL高级](一) EXPLAIN用法和结果分析

    转载自: https://blog.csdn.net/why15732625998/article/details/80388236

  5. ARMv7-Protected Memory System Architecture(PMSA)

    PMSA介绍: PMSA基于内存保护单元(MPU),PMSA与基于VMSA的MMU相比提供了更简单的内存保护方案,简化适用于硬件和软件.PMSAv7处理器依赖MPU类型寄存器来识别,请参见MPUIR, ...

  6. scrapy中发送post请求

    1.可以使用`yield scrapy.FormRequest(url,formdata,callback)`方法发送POST请求. 其中构造参数formdata可以是字典,也可以是可迭代的(key, ...

  7. 极米投影仪安装apk的方法

    https://www.touying.com/t-37871-1.html 方法二:使用U盘安装:1.使用电脑下载软件apk,并将软件apk的后缀修改为"apk1": 2.然后将 ...

  8. 从零搭建hadoop集群之安装jdk

    卸载系统自带的OpenJDK以及相关的java文件 1. 查询系统自带的OpenJDK版本信息 [root@hadoop01 ~]# java -version #查询系统自带的OpenJDK版本信息 ...

  9. kafka监控系统kafka eagle安装和使用

    一.kafka eagle介绍 kafka eagle 是一款由国内公司开源的Kafka集群监控系统,可以用来监视kafka集群的broker状态.Topic信息.IO.内存.consumer线程.偏 ...

  10. axios与ajax的优缺点

    axios和ajax的区别是什么?        1.axios是一个基于Promise的HTTP库,而ajax是对原生XHR的封装:         2.ajax技术实现了局部数据的刷新,而axio ...