stm32若干技巧

发布者:幸福如愿最新更新时间:2024-10-17 来源: cnblogs关键字:stm32  中断调用 手机看文章 扫描二维码
随时随地手机看文章

技巧1:关于串口接收
    对于串口数据帧到检测,对于串口接收有判定帧头、尾 FIFO缓存等方式,推荐采用超时判断来确定一帧数据接收完成,尤其对于处理GPS,3G模块数据效,比判断帧头、尾效果好的多。参考网友模式
//检测超时函数 供定时器中断调用-1ms一次
// t为超时时间
__inline void Chk_TimeOut(u8 t)

{

if(!uartRMsg.rcOK && (uartRMsg.rcIndex>=8) && (++uartRMsg.rcS >=t) ) //超时之后,开始重新解码

uartRMsg.rcOK = true;

}
//接收函数, 供USART中断调用

__inline void Recieve_MSG(char ch)

{

uartRMsg.rcS = 0;    //如果接收到数据,则清除超市检测计数,

if(!uartRMsg.rcOK)

{

uartRMsg.Buf.buf[uartRMsg.rcIndex ++] = ch;     //赋值

if(uartRMsg.rcIndex>=8 && uartRMsg.Buf.msg.cmd!=16)//其他条件成立的时候也可进入解码程序<此程序为Modbus应用,可改为接收到结束符等>

uartRMsg.rcOK = true;

}

}

//供主函数调用
void MSGTransfer(void)
{
     if(!uartRMsg.rcOK) return;

        //......数据解析部分
}
技巧2  关于systick
    系统滴答用作精确定时,网上的代码如下:
    SysTick_SetReload(delay_fac_us * Nus);          /* 时间加载 */
    SysTick_CounterCmd(SysTick_Counter_Clear);  /* 清空计数器 */
    SysTick_CounterCmd(SysTick_Counter_Enable);  /* 开始倒数 */  
    do
    {
        Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);
    }while (Status != SET);       /* 等待时间到达 */
    SysTick_CounterCmd(SysTick_Counter_Disable);    /* 关闭计数器 */
 SysTick_CounterCmd(SysTick_Counter_Clear);     /* 清空计数器 */  
该函数存在很大的局限性,即不可重入。所以在中断中不能使用。不可重入的原因主要有两个:
1 滴答计数器在重入返回时被关闭,导致计数停止。
2 即便在此函数的do{}while()中不停开启计数器,重入返回时,可能计数器已溢出到下一个周期。
对于以上不足,实际上可以直接采用systick的系统滴答来实现精确延时即可,即永不关闭系统滴答,开机后始终计数。
具体实现函数:
3 关于systick用于超时检测
在应用中经常出现要检测超时的场景,此时采用jiffies get_systick 非常方便,而应当注意的是溢出的情况,即在超时比较时,注意jiffies回绕问题,可以参考linux内核中的#define time_after(a,b)  的写法。
技巧3 关于屏幕数据刷新。
    有时我们在GUI编程过程中需要多个不同频率的刷新某些数据,此时我们即可采用仅仅使用一个硬件定时器systick即可实现多个软件定时,实现多个软件定时事件,在中断处理函数中轮询这几个定时事件的定时标志,完成对相应事件处理的回调。
4 关于延时函数
void delay_1us(u32 Nus)

    unsigned long j;


    while (Nus--) {
        j = 0;
        while (j--);
    }
}

以上函数在STM32内编译时,会偶尔出现延时时间不一致的情况。大概相差0.8倍的延时时差,因此对于延时精确的代码,不宜使用。推荐采用定时器延时。


关键字:stm32  中断调用 引用地址:stm32若干技巧

上一篇:STM32入门-时钟篇
下一篇:stm32 mmc卡扫描指定文件夹下的所有文件 串口输出(文件名长度有限制)

推荐阅读最新更新时间:2024-11-08 12:33

STM32-SPI之OLED
OLED作为一种新型的显示设备,由于其优秀的性能,并且随着产量的提高价格也在不断的下降。受到了现在很多显示设备产品的青睐。高清晰,高对比的都使人们对它的使用越来越多了。对于OLED它的驱动方式有很多种,SPI、IIC、8080并口等方式,不同的方式有不同的优点。本篇文章采用的STM32自身的SPI总线的控制方式,还可以通过软件的方式来模拟SPI,难度都不大。 首先来看一下关于STM32的SPI的寄存器和函数,至于什么是SPI就没有必要解释了。 由于STM32的固件库手册版本的原因 我用的手册可能没有全部包括SPI的函数,详细的可以看英文原版的手册。 SPI的引脚映射关系 SPI的GPIO模式的设置 至于OLED大家可以参
[单片机]
stm32看门狗复位技巧编辑
一、看门狗复位的应用技巧包括三个方面: 1:判断是否需要使用。如果要使用看门狗的话,需要做一些寄存器的配置,在程序区的某些地方也要加入喂狗指令来防止看门狗复位,有一定的工作量,所以用与不用需要考虑一下。能不使用看门狗的场合,要求是系统即使死机也问题不大,等待人过来断电复位即可的情况。但是这种情况已经很少了,所以绝大多数情况下看门狗都要加上。比如有温控功能的电热水器,假如电加热已经启动,但是系统死机了,温控失效,电加热也不会关闭,这时水温就会一直升高,直到水被蒸干,然后电加热损坏或引发火灾,或者人被开水烫伤。这时有看门狗复位,系统就会恢复正常,检测到温度够了,就会关闭电加热的。 2、保证看门狗工作正常。看门狗除了进行寄存器配置之外,
[单片机]
<font color='red'>stm32</font>看门狗复位技巧编辑
STM32-仿真调试时的SystemInit陷阱
STM32-仿真调试时的SystemInit陷阱 我在开始STM32的仿真调试时,遇到一个问题,就是调试时程序一直停在SystemInit()中的等待晶振中,怎么也出不来。 SystemInit()前面部分的代码,都能走过,就是在执行到最后一个函数时出问题了。 最后一个函数是:SetSysClock(); 执行到下面这个循环之后,出不来了: /* Wait till HSE is ready and if Time out is reached exit */ do { HSEStatus = RCC- CR & RCC_CR_HSERDY; StartUpCounter++; } while((HS
[单片机]
STM32-仿真调试时的SystemInit陷阱
9G-STM32 LwIP测试过程简介
一,准备STM32 LwIP软件包 1,在http://www.st.com/mcu/devicedocs-STM32F107RC-110.html 下载lwIP TCP/IP stack demonstration for STM32F107xx connectivity line microcontrollers软件包 an3102.zip http://www.st.com/stonline/products/support/micro/files/an3102.zip 2,在http://www.st.com/mcu/devicedocs-STM32F107RC-110.html 下载lwIP TCP
[单片机]
STM32缩写解释
STM32缩写解释 1.1 缩写 Table 1. 本文档所有缩写定义 缩写 外设/单元 ADC 模数转换器 BKP 备份寄存器 CAN 控制器局域网模块 DMA 直接内存存取控制器 EXTI 外部中断事件控制器 FLASH 闪存存储器 GPIO 通用输入输出 I2C 内部集成电路 IWDG 独立看门狗 NVIC 嵌套中断向量列表控制器 PWR 电源/功耗控制 RCC 复位与时钟控制器 RTC 实时时钟 SPI 串行外设接口 SysTick 系统嘀嗒定时器 TIM 通用定时器 TIM1 高级控制定时器 USART 通用同步异步接收发射端 WWDG 窗口看门狗
[单片机]
STM32—驱动DHT11数字温湿度传感器
DHT11模块简介 DHT11数字温湿度传感器,用来测量环境的温度和湿度,而且传输的数据是数字信号,这与DS18B20传输的模拟采集的数据不一样,相比DS18B20而言DHT11的数据采集的处理更加精确,而且驱动也更加方便。 DHT11传感器包括一个电阻式测湿元件和一个NTC测温元件,而且传感器中嵌入一个8位单片机。传感元件测量到数据后经过内嵌MCU处理后,能够直接输出处理好的数据。 DHT11与单片机之间采用单总线通信,只需要初始化一个I/O口即可实现温湿度的实时测量。 其相关参数如下: DHT11数据传输 DHT11数据传输是单总线通信方式,即通过一个IO口完成数据的双向输入输出,DHT11每一次向单片机传输数据是
[单片机]
<font color='red'>STM32</font>—驱动DHT11数字温湿度传感器
STM32】7—通用定时器 & 时钟树学习
0 实验预期效果 让LED闪烁(每秒钟内:亮0.5s,再暗0.5s)。 1 相关原理图 2 定时器TIM2与时钟树 2.1 TIM2 简介与特性 关于通用定时器TIM2,查STM32F407中文手册392页可知: ① TIM2 到 TIM5 简介: 通用定时器包含一个16 位或 32 位自动重载计数器,该计数器由可编程预分频器驱动。 它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或生成输出波形(输出比较和 PWM)。 使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制到几毫秒。 这些定时器彼此完全独立,不共享任何资源
[单片机]
【<font color='red'>STM32</font>】7—通用定时器 & 时钟树学习
iar下的stm32启动代码分析
使用的芯片是 STM32F103VET,编译器使用 IAR ARM V5.5 设置头文件查找路径,例如: $PROJ_DIR$.. $PROJ_DIR$......LibrariesCMSISCM3CoreSupport $PROJ_DIR$......LibrariesCMSISCM3DeviceSupportSTSTM32F10x $PROJ_DIR$......LibrariesSTM32F10x_StdPeriph_Driverinc 预定义的symbol 为,HD为high desity 的意思 USE_STDPERIPH_DRIVER STM32F10X_HD 有两个符号是系统默认的,看名字就应该知道什么了
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved