关于STM32断言功能的使用

合集下载

STM32库函数断言机制宏定义assert_param(expr)和assert_fail。。。

STM32库函数断言机制宏定义assert_param(expr)和assert_fail。。。

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断言的作用以及使用方法

STM32库中的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中断
Disp_Buffer[2] ++;
if(Disp_Buffer[2] <= 24)
Disp_Buffer[3] = 0;
Disp_Buffer[4]++;
}
}
}
}
STM32定时器中断的实现方法
STM32------中断
Cortex内核具有强大的异常响应系统,它把能够
打断当前代码执行流程的事件分为异常
(exception)和中断(interrupt),并把它们用一个
表管理起来,编号为0~15的称为内核异常,而
16以上的则称为外部中断(外,相对内核而言),
这个表就称为中断向量表。开始响应一个中断后,
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
Disp_Buffer[0] ++;
if(Disp_Buffer[0] <= 60)
{
Disp_Buffer[1] = 0;
响应优先级
抢占优先级
抢占: 当一个异常发生时,硬件会自动比较
该异常的优先级是否比当前的异常优先级
更高。如果发现来了更高优先级的异常,
处理器就会中断当前的程序,服务新来的
异常。抢占打断其他中断的属性,即因为
具有这个属性,会出现嵌套中断(在执行
中断服务函数A的过程中被中断B打断,先
执行完中断服务B再继续执行中断服务A)
响应优先级分别为0~7。
第2组:2位用来配置抢占优先级,2位用来配置
响应优先级。即2^2=4种抢占优先级,2^2=4

STM32中断过程详解

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处理技巧

stm32error_handler处理技巧

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中,中断优先级的设置非常重要,可以通过设置中断优先级来确保系统顺利运行。

在STM32中,每个中断都有自己的优先级,具体的中断优先级位数取决于具体的芯片型号。

一般来说,中断优先级可以分为主优先级和次优先级两部分。

主优先级用来决定不同中断之间的相对执行顺序,次优先级用来确定相同优先级的中断响应顺序。

在STM32中,中断优先级是通过NVIC(Nested Vectored Interrupt Controller)寄存器来设置的。

NVIC寄存器包括NVIC_IPR0-NVIC_IPR7等寄存器,用来设置各个中断通道的优先级。

在设置中断优先级时,要根据具体的中断要求和系统的实际情况进行设置,以确保系统的稳定性和性能。

设置中断优先级时,通常遵循以下几个原则:1.主优先级高的中断优先级高于次优先级高的中断。

即主优先级相同的情况下,主优先级高的中断先被响应。

2.同一个主优先级下,次优先级高的中断先被响应。

3.多级中断时,根据中断嵌套的层级关系来设置不同优先级。

4.保留一定的中断处理时间,避免因优先级设置不当导致一些低优先级的中断得不到响应。

5.不同的中断优先级设置要根据具体的系统实际需求进行调整,避免出现死锁和优先级反转等问题。

在实际应用中,中断优先级的设置要根据具体的系统需求和硬件环境进行合理调整。

在STM32中,中断优先级的设置可以通过CubeMX工具或直接在代码中修改来实现。

在CubeMX中,可以通过配置器界面来设置中断优先级,也可以通过用户手册来了解每个中断源的优先级设置规则。

总的来说,中断优先级的设置是STM32系统中非常重要的一环,合理的中断优先级设置可以提高系统的实时性和稳定性。

STM32中断的详细介绍及使用流程

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在做其他的正常任务。

突然,老师叫你的名字,这就像是串口有了新的消息,也就是发生了中断。

你就得停下手里的数学作业,先去听老师说话,这就是中断处理。

我们先得让这个小机器人知道串口在哪里呀。

就像你在学校里要先知道老师的办公室在哪里一样。

我们要在程序里告诉stm32f4哪个是串口,就像告诉它这是和外面交流的通道。

然后呢,我们要设置这个串口的一些基本的东西。

比如说,就像你要和朋友写信,你得先确定用什么信纸,字写多大。

对于串口来说,我们要确定它的波特率,这就像是写信的时候字的大小和疏密程度呢。

如果波特率设置错了,就好像你朋友看你的信的时候,字要么太大太稀疏,要么太小太密集,根本看不清楚你写的啥。

接着,我们要让这个小机器人知道怎么去处理串口的中断。

这就好比你要告诉自己,当老师在课堂上叫你的名字的时候,你要站起来,有礼貌地听老师讲话。

在程序里,我们要写好当串口有新消息来了,这个小机器人要做什么。

比如说,它可能是把收到的消息显示在一个小屏幕上,就像你把老师说的重要事情记在小本子上一样。

我给你们举个具体的小例子吧。

假如我们要让stm32f4接收从电脑发过来的数字,然后把这个数字加1再发回电脑。

我们先设置好串口,让它能正常接收和发送消息。

当电脑发过来一个数字,比如说3,这时候串口就像一个小邮递员一样把这个消息送到了stm32f4这个小机器人那里。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

* Input
: - file: pointer to the source file name
*
- line: assert_param error line source number
* Output
: None
* Return
: None
*********************************************************************
***********
* Functin : Reports the name of the source file and the source line
number
*
where the assert_param error has occurred.
**********/
void assert_failed(u8* file, u32 line)
{
/* User can add his own implementation to report the file name and
line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file,
关于 STM32 断言功能的使用 Apr 11 2014
环境: Keil uVision4.10 + STM32F10x_StdPeriph_Lib_V3.5.0
1:新增宏定义 #define DEBUG 1
2:打开头文件 stm32f10x_conf.h 中,第 56 行的宏定义开关 #define USE_FULL_ASSERT 1
3:使用微库,并重定向 printf 函数: /* * 函数名:fputc * 描述 :重定向 c 库函数 printf 到 USART1 * 输入 :无 * 输出 :无 * 调用 :由 printf 调用 */ int fputc(int ch, FILE *f) {
/* 将 Printf 内容发往串口 */ USART_SendData(USART1, (unsigned char) ch); while ( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); return(ch); } 重定向以后就可以使用 printf 函数了;
line) */
printf("Wrong parameters value: file %s on line %d\r\n", file, line);
/* Infinite loop */
while (1)
{
}
}
#endif
6:此时,在程序下载到 STM32 后,如果某个库函数的结构体成员赋值超出理论 范围,就能准确的通过串口提示出对应位置了; 断言仅适用于调试阶段,上线 后要禁止;
5:自己定义下面两个函数: void debug(void) {
printf("This Program is running in Debug Mode;"); }
#ifdef DEBUG
/********************************************************************
7:在程序投入实际应用时禁止断言功能: 关闭头文件 stm32f10x_conf.h 中,第 56 行的宏定义开关 #define USE_FULL_ASSERT 1 还有 将 #define DEBUG 1 注释掉即可;
4:在初始化串口后,加点延时; 增加宏定义开关 和 提示当前程序的编译时间 USART1_Config(); Delay_us(500);//500*10 us 5ms #ifdef DEBUG
debug(); #endif printf("\r\n This Program is Builded at ("__DATE__ " - " __TIME__ ") \r\n \r\n");
相关文档
最新文档