当前位置:数据分析 > stm32调用外部变量(stm32调用外部bin的函数)

stm32调用外部变量(stm32调用外部bin的函数)

  • 发布:2023-10-10 05:17

stm32调用外部变量(stm32调用外部bin的函数)

stm32库函数编程,stm32f10x_it.c中的中断服务函数调用其他文件中的函数,为什么也能编译通过?

stm32f10x_it.c 调用其他文件中函数的中点中断服务函数可以编译,但会出现警告。最好添加相关的头文件。
使用其他文件中的全局变量时,一定要添加外部变量声明extern,如:
在AAA.c中声明unsigned char a=0;
如果要在BBB.c中调用这个变量,还必须声明extern unsigned char a;

stm32汇编文件如何引用外部结构

E#Define USART1 (USART_TYPEDEF *) usart1_base

#Define USART1 (USART_TYPDEF *) 0x4001 3800
0x4001 3800 是一个指向 USART_TYPEDEFFF 的结构体,现在这个指针被赋予了命名为 USART1。
至于这个0x4001 3800是怎么来的,请参见RM0008参考手册文档第51页TABLE3第7行。问题

我在stm32的c工程下添加了一个汇编文件。这个汇编文件如何访问外部全局结构变量

stm32添加外部代码的过程

直接复制粘贴第一个新建的项目,然后重命名
在此插入图片描述
2.在项目中新建一个WokePace文件,用于放置其他模块文件
在此插入图片描述
3。去其他项目,直接把你想要的模块复制到这个文件夹中。每个模块都有一个main.c和main.h。你也可以自己写。模块化代码有助于保持代码简洁。可移植性。
在此处插入图像描述
4。打开项目,按照提示添加头文件路径
在此处插入图片描述
5。根据提示添加.C文件。
在此处插入图片描述
6。打开模块的.C文件,将以下两句话复制粘贴到main.c中
在此处插入图片说明
7.将其放在以下位置,在while循环中编写代码并编译。
在此处插入图片描述
8。编译无误后,烧写代码。根据以下提示选择下载器。下面使用ST-Link下载器。选择后,点击设置——
在此插入图片描述
9。单元中显示以下“ST-LINK/V2”,并且端口选择为 SW 模式。
在此处插入图片说明
10。打开Utilities并执行以下操作。最后,点击Stttings
在此处插入图片描述
11。点击Sttings,会出现如下界面,勾选Reset and Run,每次烧录都会重新启动并重置。设置完成后就可以烧写代码了。
在此插入图片描述

stm32中如何使用变量控制函数

首先是问题描述:硬件单片机型号,STM32F103VET6,IDE:keil 5。我想通过它实现的一个功能是通过两个按钮控制RGB灯的闪烁开始和停止。这两个按钮是通过外部中断的上升沿来检测的。粘贴第一个代码。Smile
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) !=重置)
{
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 = 启用;
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。请记住,编程是一门平衡的艺术。没有一个程序是完美的。节省空间、速度快、易扩展、易维护、低耦合和强大功能是不可能同时具备的。如果你想提高程序的可维护性,就必须在性能(空间和速度)方面做出一些牺牲。至于如何平衡,就看项目的具体要求了。

stm32外部中断如何调用main函数变量

使用快捷键 ALT+T。根据网络信息查询,stm32外部中断使用快捷键ALT+T调用主函数变量,或者处理函数封装在启动文件中,可以打开直接复制调用。

以上就是小编对stm32调用外部变量(stm32调用外部bin的函数)问题及相关问题的解答。我希望它对你有用!

相关文章

最新资讯