关于STM32断言功能的使用
- 格式:pdf
- 大小:62.67 KB
- 文档页数:2
STM32库函数断⾔机制宏定义assert_param(expr)和assert_fail。
⾸先我们先了解⼀下,什么是断⾔?断⾔都有什么特点? 断⾔就是我们⼈为定义的⼀个宏,⽤于判断⼀些输⼊参数的布尔表达式是否为预设的值的范围内,如果是就为真,否则就为假。
断⾔就是⽤于检查⼀些函数的输⼊参数的合法性。
⼀般默认情况下,断⾔的功能是关闭的,在debug调试模式下,将断⾔功能打开;在release发布模式下,将断⾔功能关闭,断⾔打开的话,会在⼀定程度上影响函数的执⾏效率。
使⽤断⾔,可以创建更加稳定,不易出错的代码。
如果在单元测试过程中,使⽤断⾔,将会⾮常⽅便。
使⽤断⾔得区别于代码错误,代码错误编译就会不通过,但是断⾔有问题,代码编译是OK的。
断⾔检查的就是在代码执⾏过程中,⼀些输⼊参数的合法性是否为真。
断⾔就是在debug模式下,代码运⾏过程中,对函数中输⼊的参数进⾏检查。
如果输⼊的参数违规,将进⾏某些操作,输出⼀些信息提醒,或者控制代码进⼊⼀个死循环使得代码⽆法继续执⾏下去。
在release版本,是不⽤断⾔功能的。
下⾯我们⽤STM32F407ZGT6的⼯程来解释断⾔的⽤法。
我们使⽤的是STM32的固件库版本是3.5,使⽤的编译环境是keil MDKV5.24A,断⾔检测出异常的⽂件名和⾏号会通过串⼝输出,并将终⽌代码执⾏进⼊⼀个死循环。
如下的代码摘⾃⽂件“stm32f4xx_conf.h”1/* #define USE_FULL_ASSERT 1 */23/* Exported macro ------------------------------------------------------------*/4 #ifdef USE_FULL_ASSERT56/**7 * @brief The assert_param macro is used for function's parameters check.8 * @param expr: If expr is false, it calls assert_failed function9 * which reports the name of the source file and the source10 * line number of the call that failed.11 * If expr is true, it returns no value.12 * @retval None13*/14#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))15/* Exported functions ------------------------------------------------------- */16void assert_failed(uint8_t* file, uint32_t line);17#else18#define assert_param(expr) ((void)0)19#endif /* USE_FULL_ASSERT */第1⾏代码,默认情况下断⾔是关闭的,已经把“#define USE_FULL_ASSERT 1 ”注释掉,说明USE_FULL_ASSERT未被定义。
STM32库中的Assert断言的作用以及使用方法作者:strongerHuang微信公众号:strongerHuang看到交流群的小伙伴在讨论STM32标准库中Assert断言语句,感觉还是有很多小伙伴都不清楚什么是Assert,今天就再来分享一下关于Assert的内容。
1写在前面有经验的工程师都知道,随着软件版本的迭代,或者需求不断变更,我们的代码就会变得越来越“臃肿”。
在编码的过程中,如果没有注重一些细节,你的代码就可能存在许多隐藏的Bug。
那么,我们如何找出这些隐藏的Bug呢?今天就说其中的一点:Assert断言。
2关于Assert断言什么是Assert断言?编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。
断言表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。
可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言,而在部署时禁用断言。
同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。
---来自百度百科这里的概念,可能不好理解,简单举一个例子来说明吧。
有这么一个数组和函数:••••••int Array[5] = {0xA1, 0xB2, 0xC3, 0xD4, 0xE5};int Fun(char i){ return Array[i];}如果我们函数中不加Assert断言语句,你觉得直接调用会这个函数会有风险吗?假如这么调用:•••int a;a = Fun(8);很明显,就这么调用,会出错,且我们不容易发现错误在哪里。
但是,假如添加有Assert断言语句,错误就能一下找出来。
3Assert断言实际应用其实,Assert断言在很多标准的代码中,基本都有。
我们还是拿STM32的代码来说明吧。
不管是STM32标准外设库、还是HAL、LL库源代码里面都有Assert断言机制。
不知道大家有没有注意过assert_param函数?1.拿STM32最常见的GPIO初始化函数为例A.标准外设库GPIO初始化:B.HAL库GPIO初始化:相信大家都看到过STM32库中的参数断言语句,他的作用就是用于检查函数传入参数是否正确。
STM32中断过程详解对于 STM32 讲(还是以Timer2例),外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢)、输入捕获、输出匹配、DMA 申请等。
所有TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的、不同的、中断申请呢?1.因为cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单独的和总的控制该中断通道。
它们包括有:中断优先级控制字:PRI_n(前面有提到过)中断允许设置位:在 ISER 寄存器中中断允许清除位:在 ICER 寄存器中中断悬挂 Pending(排队等待)位置位:在 ISPR 寄存器中(类似于置中断通道标志位)中断悬挂 Pending(排队等待)位清除:在 ICPR 寄存器中(用于清除中断通道标志位)正在被服务(活动)的中断(Active)标志位:在 IABR 寄存器中,(只读,可以知道当前内核正在处理哪个中断通道)2.作为外围设备 TIME2 本身也包括更具体的,管理自己不同中断的中断控制器(位),它们主要是自身各个不同类型中断的允许控制位,和各自相应的中断标志位(STM32 的手册中有详细的说明)。
理解上面两点之后,我们可以全程、全面和综合的来了解 TIME2 的中断过程,以及如何控制的。
①初始化过程首先要设置寄存器 AIRC 中 PRIGROUP 的值,规定系统中的抢先优先级和子优先级的个数(在 4 个 bits 中占用的位数);设置 TIME2 本身的寄存器,允许相应的中断,如允许 UIE(TIME2_DIER 的第[0]位)。
stm32error_handler处理技巧在使用STM32进行开发时,可能会遇到各种错误。
当出现错误时,通常需要使用错误处理器(error handler)来处理这些错误。
错误处理器是一个特殊的函数,用于捕获和处理发生的错误。
在STM32上,错误处理器的实现可以有多种方式。
下面是一些错误处理的技巧,可以帮助您更好地处理STM32上的错误。
1. 使用断言(assertion):断言是一种在代码中插入的检查,用于验证程序的逻辑和状态是否正确。
可以使用它来检查指针是否为空、变量是否处于预期范围内等。
当断言失败时,可以在错误处理器中打印错误信息或执行其他相关操作。
2. 使用错误码(error code):为不同类型的错误定义错误码,可以方便地识别错误类型。
当发生错误时,错误处理器可以根据错误码执行相应的操作,例如打印错误信息、返回错误码等。
3. 使用异常处理:异常是一种在程序运行时发生的错误,可以用于捕获并处理异常情况。
对于STM32,可以使用CMSIS库提供的异常处理函数,例如HardFault_Handler(、BusFault_Handler(等。
当发生异常时,可以在异常处理器中执行一些操作,例如打印异常信息、保存堆栈信息等。
4. 使用断点(breakpoint):在调试过程中,可以使用断点来暂停代码的执行,以便检查变量的值和程序的状态。
在错误处理器中设置断点可以方便地跟踪错误发生的位置和上下文信息。
5.记录错误信息:在错误处理器中,可以通过打印日志信息或将错误信息保存到外部存储器等方式记录错误信息。
这有助于分析错误发生的原因和调试错误的源头。
6.打印调试信息:在错误处理器中,可以使用串口或其他通信方式将调试信息输出到终端或其他设备。
这可以让开发者更方便地了解错误发生的原因和上下文信息。
7.使用硬件故障检测:一些STM32芯片提供了硬件故障检测功能,可以检测和处理硬件故障,例如电源异常、时钟失频等。
STM32中断优先级与相关使用概念在STM32中,中断是一种特殊的程序执行方式,可以在系统中其中一事件发生时启动一个中断服务程序执行特定任务。
中断优先级是指在多个中断同时到达时,系统根据中断优先级决定哪一个中断先被响应。
在STM32中,中断优先级的设置非常重要,可以通过设置中断优先级来确保系统顺利运行。
在STM32中,每个中断都有自己的优先级,具体的中断优先级位数取决于具体的芯片型号。
一般来说,中断优先级可以分为主优先级和次优先级两部分。
主优先级用来决定不同中断之间的相对执行顺序,次优先级用来确定相同优先级的中断响应顺序。
在STM32中,中断优先级是通过NVIC(Nested Vectored Interrupt Controller)寄存器来设置的。
NVIC寄存器包括NVIC_IPR0-NVIC_IPR7等寄存器,用来设置各个中断通道的优先级。
在设置中断优先级时,要根据具体的中断要求和系统的实际情况进行设置,以确保系统的稳定性和性能。
设置中断优先级时,通常遵循以下几个原则:1.主优先级高的中断优先级高于次优先级高的中断。
即主优先级相同的情况下,主优先级高的中断先被响应。
2.同一个主优先级下,次优先级高的中断先被响应。
3.多级中断时,根据中断嵌套的层级关系来设置不同优先级。
4.保留一定的中断处理时间,避免因优先级设置不当导致一些低优先级的中断得不到响应。
5.不同的中断优先级设置要根据具体的系统实际需求进行调整,避免出现死锁和优先级反转等问题。
在实际应用中,中断优先级的设置要根据具体的系统需求和硬件环境进行合理调整。
在STM32中,中断优先级的设置可以通过CubeMX工具或直接在代码中修改来实现。
在CubeMX中,可以通过配置器界面来设置中断优先级,也可以通过用户手册来了解每个中断源的优先级设置规则。
总的来说,中断优先级的设置是STM32系统中非常重要的一环,合理的中断优先级设置可以提高系统的实时性和稳定性。
STM32中断的详细介绍及使用流程STM32是一款常用的32位微控制器系列,由STMicroelectronics (ST)研发,广泛应用于各种嵌入式系统中。
中断是STM32中非常重要的特性之一,本文将详细介绍中断的概念、分类、优点以及使用流程。
一、中断的概念中断是一种机制,允许外部硬件设备打断正常的程序运行,并立即执行一个称为中断服务例程(ISR)的特定函数。
中断通常由外部硬件引发,例如定时器溢出、外部触发事件等。
一旦中断发生,控制器将暂停当前正在执行的任务,转而执行ISR,当ISR执行完毕后,控制权将返回到原来的任务。
二、中断的分类1.外部中断:STM32的GPIO引脚可以配置为外部中断触发。
当配置为外部中断模式时,如果引脚上的输入信号满足特定条件(上升沿、下降沿等),将会触发一个外部中断,并执行ISR。
2.内部中断:STM32具有许多内置的模块,例如定时器、UART等,这些模块常常产生中断信号。
例如,定时器溢出中断可以用于周期性任务的处理。
三、中断的优点1.实时性:中断能够立即响应外部事件,极大提高了系统的实时性。
2.节约CPU资源:中断是一种事件驱动的方式,只有在需要处理的时候才会触发中断,节约了CPU资源。
3.模块化设计:通过使用中断,可以将复杂的任务分解为更小的块,实现模块化的设计。
四、中断的使用流程使用中断的流程通常包括以下几个步骤:1.初始化中断:配置相关的中断源和中断服务例程。
在STM32中,中断使用时需要开启并配置相关的寄存器。
2.注册中断服务例程:编写中断服务例程的函数,这是中断发生时将要执行的函数。
在STM32中,可以使用标准库提供的函数来注册中断服务例程。
3.启用中断:开启中断并配置相应的优先级,以确定中断发生时的处理顺序。
在STM32中,可以设置中断控制器的中断使能位和优先级。
下面以STM32CubeIDE为例,展示一个外部中断的使用流程:1. 打开STM32CubeIDE,创建一个新的工程,并选择相应的芯片型号。
stm32f4串口中断写法今天咱们来聊一聊stm32f4的串口中断写法呀。
想象一下,stm32f4就像是一个超级智能的小机器人,它可以做很多很多有趣的事情呢。
串口就像是这个小机器人的嘴巴和耳朵,它可以通过这个“嘴巴和耳朵”和其他的设备聊天哦。
而中断呢,就像是这个小机器人突然听到了很重要的事情,然后马上放下手里正在做的其他小事情,先去处理这个重要的事情。
那怎么让这个小机器人学会在串口有事情发生的时候马上做出反应呢?这就需要我们来写一写串口中断的程序啦。
比如说,我们可以把这个过程想象成在学校里。
你正在教室里安安静静地做数学作业呢,这就好比stm32f4在做其他的正常任务。
突然,老师叫你的名字,这就像是串口有了新的消息,也就是发生了中断。
你就得停下手里的数学作业,先去听老师说话,这就是中断处理。
我们先得让这个小机器人知道串口在哪里呀。
就像你在学校里要先知道老师的办公室在哪里一样。
我们要在程序里告诉stm32f4哪个是串口,就像告诉它这是和外面交流的通道。
然后呢,我们要设置这个串口的一些基本的东西。
比如说,就像你要和朋友写信,你得先确定用什么信纸,字写多大。
对于串口来说,我们要确定它的波特率,这就像是写信的时候字的大小和疏密程度呢。
如果波特率设置错了,就好像你朋友看你的信的时候,字要么太大太稀疏,要么太小太密集,根本看不清楚你写的啥。
接着,我们要让这个小机器人知道怎么去处理串口的中断。
这就好比你要告诉自己,当老师在课堂上叫你的名字的时候,你要站起来,有礼貌地听老师讲话。
在程序里,我们要写好当串口有新消息来了,这个小机器人要做什么。
比如说,它可能是把收到的消息显示在一个小屏幕上,就像你把老师说的重要事情记在小本子上一样。
我给你们举个具体的小例子吧。
假如我们要让stm32f4接收从电脑发过来的数字,然后把这个数字加1再发回电脑。
我们先设置好串口,让它能正常接收和发送消息。
当电脑发过来一个数字,比如说3,这时候串口就像一个小邮递员一样把这个消息送到了stm32f4这个小机器人那里。
stm32中断原理STM32中断原理STM32是一款广泛应用于嵌入式系统的微控制器,它具有高性能、低功耗、易于开发等优点。
在STM32中,中断是一种重要的机制,它可以使系统在执行某些任务时,及时响应外部事件,提高系统的实时性和可靠性。
本文将介绍STM32中断的原理和应用。
1. 中断的概念中断是指在程序执行过程中,由硬件或软件发出的一种信号,用于通知CPU停止当前任务,转而执行另一个任务。
中断可以分为硬件中断和软件中断两种类型。
硬件中断是由外部设备发出的信号,如按键、定时器、串口等,而软件中断是由程序内部发出的信号,如系统调用、异常等。
2. STM32中断的分类STM32中断可以分为两种类型:内部中断和外部中断。
内部中断是由CPU内部的某个模块发出的信号,如时钟中断、DMA中断等;而外部中断是由外部设备发出的信号,如按键中断、定时器中断、串口中断等。
3. STM32中断的实现STM32中断的实现需要以下几个步骤:(1)配置中断向量表中断向量表是一个存储中断处理函数地址的表格,当中断发生时,CPU会根据中断号在中断向量表中查找对应的中断处理函数地址,并跳转到该函数执行。
在STM32中,中断向量表存储在内存的0地址处,可以通过修改向量表中的地址来实现中断处理函数的替换。
(2)使能中断在STM32中,使能中断需要设置相应的中断控制寄存器。
例如,要使能外部中断,需要设置GPIO的中断控制寄存器,使其能够检测到外部信号,并触发中断。
(3)编写中断处理函数中断处理函数是用于处理中断事件的函数,它需要根据中断类型和中断源进行相应的处理。
在编写中断处理函数时,需要注意以下几点:① 中断处理函数需要使用特殊的函数声明方式,以告诉编译器这是一个中断处理函数。
② 中断处理函数需要尽可能地短小精悍,避免在中断处理函数中执行过多的操作,以免影响系统的实时性和可靠性。
③ 中断处理函数需要及时清除中断标志位,以便下一次中断能够正常触发。