移植正点原子的FreeRTOS操作系统到我们自己的工程,发现的一个注意事项;
看下面代码,带FreeRTOS的外部中断服务函数,实现按键消抖,不能用delay_ms()或者和vTaskDelay(),会导致系统奔溃;
原因是delay_ms()其实就是对 FreeRTOS 中的延时函数 vTaskDelay()的简单封装,所以在使用 delay_ms()的时候就会导致任务切换,即不会导致这个外部中断延时阻塞,而切换到其他任务,导致外部中断出错;
这里我们可以使用delay_xms(),其不会引起任务调度,是真的延时;(仅针对外部中断函数,因为我发现在按键扫描函数里面,可以使用delay_ms();)
//提供框架---对应PA0---》PG0
void EXTI0_IRQHandler(void)
{
// delay_ms(10);//消抖
delay_xms(10); //消抖
if(KEY9==0)
{
SEGGER_RTT_printf(0,"按键IN9输入 \n");
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
}
号外:
(1)delay_ms()和vTaskDelay()一样使用,delay_ms()其实就是对 FreeRTOS 中的延时函数 vTaskDelay()的简单封装 但vTaskDelay()程序更简洁,ms级延时更精准;
为了编程方便,delay_ms()一般使用在外设模块初始化时候的ms级延时,例如RS485、LCD、以太网模块等,实测没有问题;
(2)注意NVIC_IRQChannelPreemptionPriority优先级配置,正点原子例程的优先级0~4不会被FreeRTOS禁止,一般用于定时器;优先级5~15受FreeRTOS控制,一般用于外部中断、USART等;
(3)注意区分中断优先级和任务优先级,任务优先级数字越低表示任务的优先级越低, 0 的优先级最低, configMAX_PRIORITIES-1 的优先级最高。空闲任务的优先级最低,为 0。
(4)任务函数一般不允许跳出循环,如果一定要跳出循环的话在跳出循环以后一定要调用函数 vTaskDelete(NULL)删除此任务!
关键字:STM32 FreeRTOS 外部中断 服务函数
引用地址:
STM32 FreeRTOS 外部中断服务函数注意事项
推荐阅读最新更新时间:2024-03-16 16:21
STM32 单片机之 串口重映射
大家好,从今天开始.本人将自己在工作中遇到的问题 和学习体会跟大家一起分享并探讨.下面跟大家说一下STM32单片机的端口重映射,因为是以自己为实例.这里是以USART1的重映射为例.. 因为我要一个TFT_LCD屏的主控板,考虑到FSMC 我选用了STM32F103VCT6 型号的CPU,一不小心串口接到USART1上了.因为在调程序时才发现错了,没得办法,只能通过端口重映射来解决.但是以前没用过端口重映射,只闻其名,未用其身,所以..呵呵 ...只能从头去看了. STM32上有很多I/O口,也有很多的内置外设想I2C,ADC,ISP,USART等,为了节省引出管脚,这些内置外设基本上是与I/O
[单片机]
STM32的三种串口通信协议介绍
STM32串口硬件电路 开发板串口硬件电路 STM32串口编程 1、整体流程 ① 开启GPIO时钟和USARTX时钟 ② 配置TX和RX引脚 ③ 初始化USART控制器 2、细节实现 ① 开启GPIO时钟和USARTX时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); ② 配置TX和RX引脚 /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO
[单片机]
stm32 USART_IT_IDLE
请注意IDLE中断是只检测到空闲帧时产生的中断。 而空闲帧的定义是:被视为完全由 1"组成的一个完整的数据帧,后面跟着包含?数据的下一帧的开始位。 关键是后面半句话,要求有下一帧的开始位,而你的情况恰巧没有下一帧的开始位(传输已经结束),当然不会有中断了。 举例: 如果连续发送一串字符串 123 会发生空闲中断吗? 不会,因为没有下一帧的开始位。 如果进了空闲中断不手动清零,会一直进入空闲中断。 所以用这个IDLEIE来结束DMA方式的接收,是合适的。唯一一个不合适的地方是:如果你发送一个字符串后,将DMA设置好接收传输方式,然后:对方没响应,你一个字符也收不到,这时候,IDLEIE是不会来的,必须有个总超时检测来结束DM
[单片机]
STM32片上Flash内存映射、页面大小、寄存器映射
摘要: 本文以STM32F103RBT6为例介绍了片上Flash(Embedded Flash)若干问题,包括Flash大小(内存映射)、块大小、页面大小、寄存器。这些知识,有利于写Flash驱动。 一、怎么看Flash大小 1.1 通过型号 型号会印在MCU表面,可以通过观察获得,我的是STM32F103RBT6(以下分析基于这个型号),对照下图的STM32产品命名,可知STM32F103RBT6的Flash是128KB。 () 图1 Ordering information scheme 1.2 通过数据手册(内存映射) 也可以通过数据手册得到Flash大小,首先根据型号从官网下得对应的数据手册D
[单片机]
STM32学习笔记 — 之GPIO端口篇
最近刚开始学习STM32,所以从最基本的GPIO开始学起;首先看看STM32的datasheet上对GPIO口的简单介绍: 每个GPI/O 端口有两个32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32 位置位/复位寄存器(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)和一个32 位锁定寄存器(GPIOx_LCKR)。 GPIO 端口的每个位可以由软件分别配置成多种模式。每个I/O 端口位可以自由编程,然而I/0 端口寄存器必须按32 位字被访问(不允许半字或字节访问)。GPIOx_BSRR 和GPIOx_BRR 寄存器
[单片机]
关于stm32单片机低功耗的实现和唤醒
最近做的项目中要求低功耗,在单片机完成了手头上的工作之后,就进入低功耗模式,项目的需求是单片机进入低功耗模式的时候系统时钟从HSE切到HSI,但是在未进入低功耗模式之前引脚是什么状态,进入低功耗模式之后也不应该改变。可以通过RTC定时唤醒,或者接收到串口数据就唤醒,处理完数据后再进入stop模式。查询了一些资料之后,发现stop模式最符合项目需求。下面讲述一下什么是低功耗: 一、stm32支持三种低功耗模式,可以在低功耗,短启动,多种唤醒模式下寻找平衡。 1、SleepMode睡眠模式,只有CPU停止运行,所有的外设处于工作状态并且可以在发生中断/事件时唤醒CPU。 2、StopMode停机模式,保持SRAM和寄存器内容不丢失,达
[单片机]
STM32 IAP 应用编程几个要点
我们常看到ISP、ICP、IAP等缩写词组,它们的主要作用就是对程序代码进行更新(编程)。 下面将介绍关于编程的基础知识,以及结合STM32官方提供的Demo讲述一下关于编程的内容。 1关于ISP、ICP、IAP 1.ISP ISP:In System Programing,在系统编程。 比如:使用STC-ISP对STC芯片编程,利用Flash loader对STM32编程等。 支持ISP的芯片一般在芯片内部固化了一段(用ISP升级的)boot程序。 2.ICP In Circuit Programing,在电路编程。 ICSP:In-Circuit Serial Programming,在电路串行编程。如:对EEPROM编程
[单片机]
基于STM32控制的声音导引系统
摘要:设计了一个基于STM32控制的声音导引系统。该系统由1个可移动声源S和3个声音接收器A、B、C构成。由一片从控STM32单片机控制无线发送模块,实现声音导引信号的发送。主控单片机根据无线接收模块所接收到的信息来判断可移动声源运动的启停。 关键词:无线收发模块;STM32单片机;声音导引;移动声源 引言 声音导引系统,主要是靠声音来完成对机器的智能控制,既方便又快捷。尤其是环境比较恶劣、不适合人类停留的地方,可以依靠声音来控制机器的正常运行。声音导引系统也是智能化控制的一个方面,对未来的智能化发展有较大的促进作用,对未来智能机器人的研究也大有帮助。 1 系统总体方案 如图1所示,声音导引系统由1个可移动声源S,声音
[单片机]