精华内容
下载资源
问答
  • stm32中断函数改变全局变量

    千次阅读 2017-02-22 11:39:00
     当检测到有按键按下时,实现PA.0led闪亮,函数肯定不能在中断服务程序里写,就想着在进入中断函数后改变变量biaozhi的值(0变成1),然后main中while循环一直检测biaozhi的值若为1,则调用函数;  这里只说下...
    先描述下问题:
           当检测到有按键按下时,实现PA.0led闪亮,函数肯定不能在中断服务程序里写,就想着在进入中断函数后改变变量biaozhi的值(0变成1),然后main中while循环一直检测biaozhi的值若为1,则调用函数;
          这里只说下关键的问题:
              在main.c文件中声明:u8 biaozhi=0;
          然后在stm32f10x_it.c文件中 再写一行:volatile u8 biaozhi;
          这样两个文件就可以同用变量biaozhi 了 !
    欢迎留言交流 !
            

    展开全文
  • STM32中断中读写全局变量

    千次阅读 2016-08-08 14:50:57
    STM32中断中读写全局变量 根据中断的频率和调用变量的频率,选择是否加锁。 如果读、写全局变量的操作是原子操作,可以不加锁,否则需要加锁视具体情况而定

    STM32中断中读写全局变量


    根据中断的频率和调用变量的频率,选择是否加锁。


    如果读、写全局变量的操作是原子操作,可以不加锁,否则需要加锁视具体情况而定



    展开全文
  • STM32中,关于中断函数调用全局变量的问题

    万次阅读 多人点赞 2018-02-18 19:41:02
    首先是问题的描述:硬件单片机型号,STM32F103VET6,IDE:keil 5。想通过它实现的一个功能是,通过两个按键控制一个RGB灯的闪烁开始和停止。两个按键通过外部中断上升沿检测,贴一下最开始的代码。 void KEY1_...

    本人菜鸟小白一枚,第一次记录自己在学习中遇到的问题,也当是与各位交流交流。

    首先是问题的描述:硬件单片机型号,STM32F103VET6,IDE:keil 5。想通过它实现的一个功能是,通过两个按键控制一个RGB灯的闪烁开始和停止。两个按键通过外部中断上升沿检测,贴一下最开始的代码。微笑

      void KEY1_IRQHandler(void)
    {
      //确保是否产生了EXTI Line中断
        if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET)
        {        
            run_flag=0x01;
            EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     
        }  
    }

    void KEY2_IRQHandler(void)
    {
      //确保是否产生了EXTI Line中断
        if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET)
        {
            run_flag=0;
            EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     
        }  
    }

    定义了一个全局变量run_flag,当有按键按下的时候对run_flag分别赋予不同的值,当然有人会说这是何必多此一举直接调用中断标志不就行了,这也是一个解决的办法。但是解决问题的方式有很多种,尝试用不同的方法解决问题这本身就是一件很有意思的事情。本身从逻辑上来讲没有问题,但是实际烧录程序到单片机之后,出现的情况是按键不起作用,准确来讲是有一个按键不起作用。我一开始怀疑是中断没有起作用,仔细检查了一下,发现并没错误,在中断函数中调用LED()开led函数又是没有问题的,最后我将问题定位到了run_flag上。这个变量在多个函数中都会用到,所以定义了一个全局变量,经过查找资料,找到这样一条表述:“中断中使用的全局变量,在其他函数内要使用时一定要进入临界区(也就是关闭中断)。如果是使用操作系统的话,则在所有使用到与其他任务共享的全局变量的地方都要进临界区”。

    为此增加了如下一段代码

    EXTI_InitTypeDef EXTI_InitStructure;
      EXTI_InitStructure.EXTI_LineCmd = DISABLE;
      EXTI_Init(&EXTI_InitStructure);
        run_flag1=run_flag;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);

    在读取run_flag的时候,先关毕中断,之后再开中断。下载之后成功解决了这个问题。

    总结如下(转载)很有用:

    1、尽量用局部变量替代全局变量。如果用局部变量能实现功能,最好用局部变量。
    2、在函数仅仅只是要用到某个全局变量,而无需改动时,就将全局变量通过形参传递进来,变成局部变量使用。并在定义时使用const。这是避免全局变量在函数中被意外的改动。如在判断语句中将'=='误写成'='。这时首先因为在函数内的是局部变量所以即使出错也不会影响全局变量和其他函数或模块。其次因为定义的是const类型,当发生意外改动时,编译器会发出错误信息或警报,这也就是让你的程序自动纠错。这种情况应发生在对模块内的全局变量的调用,而对于其他模块的全局变量应通过模块接口调用。
    3、中断中使用的全局变量,在其他函数内要使用时一定要进入临界区(也就是关闭中断)。如果是使用操作系统的话,则在所有使用到与其他任务共享的全局变量的地方都要进临界区。
    4、对于仅在某个函数内使用的全局变量就用静态局部变量替代。
    5、应尽量避免直接操作或调用其他模块的变量。需要调用或修改其他模块的变量时,可以通过那个模块提供的操作接口函数进行操作。比如某个模块有一个全局的计数值Count,则可以提供函数接口:GetCount()、SetCount()或ReloadCount()。这样一来,其他模块要调用Count时就通过这些指定的函数接口。这样可以降低模块间的耦合程度。另外如果嫌接口用函数实现过于复杂或是影响速度,则可以用带参数的宏定义实现。如:
    #define GetCount()  (Count)
    #define SetCount(num) (Count=(num))
    #define ReloadCount() (Count=0)
    这样,使用时与函数调用一样,但没有函数调用时的开销。另外,功能变化是可以将宏定义改成函数,而无需改动调用语句。
    6、每个模块内的全局变量应该用静态全局变量,一来其他模块无法直接调用这些变量;二来命名空间不会重叠,在实现一个模块时无需考虑某个全局变量的名称是否已被其他模块使用。如在模块A中定义静态变量 static unsigned char Count;在B模块中,仍可以定义静态变量 static unsigned char Count;这两个Count不会相互影响,但是如果定义的是全局变量则不然。
    7、模块间的耦合性就是指当修改其中某个模块时会影起其他模块运行结果发生不可预料的变化。如果模块间是通过直接调用对方内部的全局变量来实现交互,则两个模块间的耦合性将会变得复杂而且难以控制。而模块间的交互通过一个统一的接口函数来实现,使得模块都无需知道对方模块内部的具体实现(这也就是面向对象里面的封装)。当某个模块内的实现发生改写或升级时,只要确保模块接口不变即可。这就大大降低两模块间的耦合。在规划设计模块时就应认真考虑好模块的接口,以及与其他模块的调用关系。所以要记住编程原则:针对接口编程,而不是针对实
    现。
    8、函数的功能要单一,也就是高内聚性。如果某个函数需要调用很多个全局变量,则说明函数的内聚性不够高,可以考虑将函数拆分成几个功能更单一的函数。
    9、要记住编程是一种平衡的艺术。没有程序可以做到十全十美,省空间、速度快、易扩展、易维护、低耦合、功能强大这些是不可能同时兼得的。如要提高程序的可维护性,就必须在性能方面(空间和速度)做出一点牺牲。至于如何平衡,就要看项目的具体要求了。
    这是很有用的,有很多东西也许理解不是很深刻,待更。

    展开全文
  • 在自己的产品测试中 子机正常模式下运行毫无问题 都正常 ...lcd花屏 肯定是全局变量自己变化了的 是内存泄露或者覆盖问题 串口接收死机 并非子机死机 ,而是串口接收不到数据了。 实验中 接收不到数...

    在自己的产品测试中 子机正常模式下运行毫无问题 都正常

    但是远程主机端 一直发送数据 ,就会导致产品lcd花屏 串口死机

    而且显示lcd花屏 串口后面才死机的的 两者死机间隔时间有长有短 不必深究,通过其他没有接在总线上的子机对比来看 是串口惹的货。

    lcd花屏 肯定是全局变量自己变化了的 是内存泄露或者覆盖问题

    串口接收死机 并非子机死机 ,而是串口接收不到数据了。

    实验中 接收不到数据的现象可以分为下面原因

    1 这里的接收不到数据我们不能单一的理解为串口中断死掉了 这是不可能的(通常情况下)

    2 我们接收中断被发射中断阻挡了即 发送中断 一直在发数据(之前是死循环等待发送完成 而呈现中有看门狗 所以这种情况也很小 不过现在我还是加上超时处理了)

    3 接收中断中接收的 管道形式的buf 一直接收超出了管道值 那么管道没有清空的同时 管道没有继续接收了 算是溢出了吧 同时造成了内存泄露(非常有可能)

    当前修改了修改了接收中断中数据进行初步过滤来处理每时每刻总线上的无用数据。

    当前修改了这个的方面测函数 程序正在测试中 耐心等待吧

    测试了 发现lcd不花屏了 但是某一时刻 还是出现了 “ 串口死掉 ”的现象

    然后我在程序中 估计仍然是接收问题 程序设计中管道接收满了 就不接收了 。即当子机数据只进不出的现象出现时 一段时间后管道就装满了 这之后 就造成了接收的数据丢掉了。当前的措施是管道移动 就是丢掉头上的数据 尾巴上放入新的数据 这样就的现象就是老的数据 你不来取 我就扔掉了。后面的新的数据 依次接入 当前思路是这样的 不知道行不行 待测试中

     

     

    展开全文
  • 1、在a.c文件中定义了char类型静态变量s_chA[8],在b.c文件中定义了int类型静态变量s_intB; 2、定义函数int GpioGet(unsigned int id, unsigned int*value); 3、在任务taskA中,通过GpioGet函数循环查询对应的...
  • debug跟进去看不出什么逻辑错误,但发现函数内局部变量声明之后,全局变量的值被清零,后来查看局部变量地址已经超出栈的范围,于是确定是栈溢出。如果不稍微了解一下堆栈,在开发过程中可能碰到各种奇怪的错误。....
  • 二、STM32的USART串口通信程序实例三、C语言程序里全局变量、局部变量、堆、栈等概念,在ubuntu系统中编程,输出信息进行验证四、stm32的堆、栈、全局变量的分配地址 一、基于寄存器与基于固件库的stm32 LED流水灯...
  • stm32中断优先级分组

    千次阅读 2016-12-27 08:29:06
    STM32中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3)中的优先级概念 STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要...
  • 1,意思是APB2接高速设备2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用3、HSE Osc(High Speed External Oscillator)高速外部晶振...
  • stm32的架构图可以看到,挂载在APB2上的外设有GPIO、EXTI、AFIO GPIO的所有引脚默认是与输入输出寄存器相连映射的 AFIO算是一个不是外设的外设,因为它主要是用来将引脚重映射到其它外设寄存器的,但是对它操作也...
  • 1,意思是APB2接高速设备2、Stm32f10x.h相当于reg52.h(里面有基本的位操作定义),另一个为stm32f10x_conf.h专门控制外围器件的配置,也就是开关头文件的作用3、HSE Osc(High Speed External Oscillator)高速外部晶振...
  • STM32-中断系统 内容概要: STM32中断系统概述 外部中断控制器EXTI 按键中断实例 串口中断实例 STM32中断系统概述: 内容概要: 中断的基本概念 嵌套向量控制器NVIC 中断及异常向量表 中断优先级 中断的...
  • 单片机中断函数中的全局变量问题

    千次阅读 2019-06-26 15:42:55
    然后呢,我不想在中断函数里写太多代码,便只在中断函数里放了一个全局变量,按下按钮进入中断改变该变量的值,然后在主程序中判断该值,来执行接下来的程序,部分程序代码如下: void main...
  • STM32中断(优先级,开关总中断

    千次阅读 2014-04-29 21:48:34
    STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。 二:优先级判断  ...
  • 中断函数和子函数中临时用的变量要加volatil,全局变量不要加volatil。 const ; 只读变量 const变量的值在程序运行期间不能改变,不能再赋值。这种变量称为常变量(constant variable)或是只读变量(read-only-...
  • STM32F767+STM32CubeMX I2C通信读写EEPROM数据(采用轮询、DMA、中断三种方式) 摘要-前言 作为一名STM32的初学者,在学习过程中会遇到很多问题,解决过程中会看到很多博主发过的文章,每次都是零零总总的学习各个大...
  • stm32学习--串口中断

    2020-06-04 01:05:01
    显然不是纯粹为了钻研,有被毕设逼迫的成分,本来选择51,但是感觉51资源不太够用,而且51的逼格不够,答辩的话stm32感觉逼格高一些,但是也增加了风险,我对51的资源,寄存器,开发流程都相当熟悉,但是32的话仅仅...
  • stm32的定时器在中断里重新改变初值

    千次阅读 2017-03-16 11:41:00
    但是在应用里面经常需要这个定时器能够扮演很多时间长度的角色,在中断或者打开定时器前 加入对arr重新赋值,就可以定时不同的长度 TIM3->ARR= arr; //重新赋初值,改变定时长度 转载于:...
  • 全局变量的值自动改变的解决办法

    千次阅读 2019-04-12 14:33:52
    在写stm32代码时,定义了一个全局变量i,但是在串口中断赋值一次之后,进行显示i,结果发现i的值发生了变化,具体为什么这样我不是很清楚,也许是定义的变量被优化了,也许是其他原因。 解决办法是:在定义变量的...
  • 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,...
  • 能否利用函数和变量的绝对定位,实现程序的模块化更新。也就是说,如果我要改变某个函数,只需要更新flash里面一个局部,也许只需要更新几百个字节,而无须重新下载整个上百K的程序。经过查找资料和反复实验,终于...
  • 最近发现了 DWT 的比较器(就是 debug 的时候实现 watchpoint 功能的模块)是可以由软件控制并触发 Debug Monitor 异常的,由此可以实现“当某个变量/内存地址被改写的时候触发一个中断”这样的功能。
  • ucos移植到stm32上的中断小小改进

    千次阅读 2013-01-23 14:13:33
    uCosII移植到stm32上的文章和demo已经很多了,细节上建议大家可以看官方的移植文档(当然是E文的)。网上流传的各种移植版本基本都是基于官方的移植版本做了小改进。这些改进基本都限制在更适合自己的项目或自己的...
  • stm32

    2019-09-09 10:54:03
    基础外设 中断 SCB->VTOR = FLASH_BASE | 0x10000;... 打开关闭全局中断 唯一ID static uint32_t idAddr[]={ 0x1FFFF7AC,/*STM32F0唯一ID起始地址*/ 0x1FFFF7E8,/*STM32F1唯一ID起始地址...
  • STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。 二:优先级判断    ...
  • STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。 二:优先级判断  ...
  • 在使用环接收串口数据时,在中断中向环区写入数据,在主程序中从环区读出数据。(测试芯片为雅特丽AT32F413) ...全局变量ringbuff1.length内存原始数据为1,此时程序运行到while中的U1ReadOneFrameData;函数中,处...
  • STM32的系统滴答定时器的中断问题

    千次阅读 2018-05-07 21:32:33
    查看程序一直在读取系统滴答定时器的全局变量计时值。而程序对此查询该值也没有发生变化。于是进入汇编调试,结果一样没有改变。很是纳闷! 于是干脆停下来,认真思考了起来:怎么会滴答定时器不工作?然道是我的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,234
精华内容 493
关键字:

stm32中断改变全局变量