关于STM32的延时问题

最近一直在搞一辆智能小车,用STM32单片机驱动,往上面加了很多外设,外型如下:

今天下午打算在LCD显示一个温度,却发现怎么都显示不了,也找不出原因,还好我们公司的郑工帮我看出了问题,让我顺利改过来成功的显示在LCD上,毕竟比我先进公司的工程师还是要有经验一些。o(︶︿︶)o 唉,就是定时计数器少加了一个0,于是延时慢了10倍,导致温度传感器时序没有配置正确,找了一个下午。就这个问题我做下总结,在STM32中,延时的方法有两种,一种是普通延时法,用循环实现,另外一种就是嘀嗒定时器的实现方法,我们来看下网上一些大神还有野火开发板自带的杰作:

1、轮询的准确延时:

传进去1就表示1us

void Delay_us(__IO u32 nTime)
{
	u16 i = 0 ;
	while(nTime--){
		i = 10 ;
		while(i--);
	}
}

2、嘀嗒定时器的精准延时法:

#include "bsp_SysTick.h"

static __IO u32 TimingDelay;

/**
  * @brief  启动系统滴答定时器 SysTick
  * @param  无
  * @retval 无
  */
void SysTick_Init(void)
{
	/* SystemFrequency / 1000    1ms中断一次
	 * SystemFrequency / 100000	 10us中断一次
	 * SystemFrequency / 1000000 1us中断一次
	 */
//	if (SysTick_Config(SystemFrequency / 100000))	// ST3.0.0库版本
	if (SysTick_Config(SystemCoreClock / 1000000))	// ST3.5.0库版本
	{
		/* Capture error */
		while (1);
	} 

  //NVIC_SetPriority (SysTick_IRQn, 0);

		// 关闭滴答定时器
	SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}

/**
  * @brief   us延时程序,10us为一个单位
  * @param
  *		@arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
  * @retval  无
  */
void Delay_10us(__IO u32 nTime)
{
	TimingDelay = nTime;	

	// 使能滴答定时器
	SysTick->CTRL |=  SysTick_CTRL_ENABLE_Msk;

	while(TimingDelay != 0);
}

/**
  * @brief  获取节拍程序
  * @param  无
  * @retval 无
  * @attention  在 SysTick 中断函数 SysTick_Handler()调用
  */
void TimingDelay_Decrement(void)
{
	if (TimingDelay != 0x00)
	{
		TimingDelay--;
	}
}
中断哪里要记得配置:嘀嗒定时器其实就是用了这个中断的服务函数来实现的,每几us或者nms来达到精准的延时
/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
	TimingDelay_Decrement();
}

由于温度控制器的时序和红外的时序不同,故我在红外的时序上用了嘀嗒定时器来操作延时计数,在温度控制器上用了普通的延时方法,这样才能让我的小车的LCD上可以显示实时温度,有点小激动,今天晚上特别特别要感谢郑工,是他帮我找出了少写了一个0的bug,万分感谢,今晚学到东西了!

接下来,我将会在小车上添加摄像头,测距模块,循迹模块,RFID模块,重力传感器模块等等,励志把它打造起来,也算是我作为一名合格的工程师的一个业余项目,加油!

时间: 2024-11-10 07:11:33

关于STM32的延时问题的相关文章

stm32之keil开发环境搭建

只要按照下面的一步步来,绝对能从0开始建立一个STM32工程.不仅包括工程建立过程,还有Jlink设置方法.本文使用芯片为STM32F103CB. 1 下载stm32F10x的官方库 http://www.st.com/web/en/catalog/tools/PF257890   2 新建工程 工程名设为stm32_demo,选择芯片型号为STM32F103B,如图, 因为下载的stm32库中有启动代码,所以这里选择"否",不拷贝启动代码. 在工程文件下,新建Startup .Hea

STM32中GPIO的8种工作模式

一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.形象点解释:推挽,就是有推有拉,任何时候IO口的电平都是确定的,不需要外接上拉或者下拉电阻.         推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小.效率高.输出既可以向负载灌电流,也可以从负载抽取电流.推拉式

《stm32嵌入式系统开发实战指南》一2.2 主要板载资源

2.2 主要板载资源 本节介绍STM32F107微控制器的主要片内外设,着重介绍10/100M以太网接口.CAN总线接口和RS485总线接口. 2.2.1 10/100M以太网接口 1.功能介绍 STM32F107的以太网模块支持通过以太网收发数据,符合IEEE 802.3-2002标准.STM32F107以太网模块灵活可调,能适应各种不同客户的需求.该模块支持两种标准接口连接到外接的物理层(PHY)模块:IEEE 802.3协议定义的独立于介质的接口(MII)和简化的独立于介质的接口(RMII

STM32——GPIO之从库函数到寄存器的前因后果

例子为单片机的"Hello World"级的流水灯实验--虽然只有一个,其中并不是将完整的代码给出,只是给出关键部分来说明"如何调用ST公司的的库来完成对硬件的控制,以及对库文件代码进行跟踪和分析至寄存器级".所以从第一段代码往下看就可以了,要用到的函数和变量大部分会说明,至于寄存器级的,那就只能翻手册了. GPIO(General Purpose Input/Output) - 通用输入/输出  main.c :此函数为主函数,控制LED,亮1s,灭1s 1234

《STM32库开发实战指南:基于STM32F103(第2版)》——3.4节ISP一键下载原理分析

3.4 ISP一键下载原理分析3.4.1 ISP简介 ISP指电路板上的空白元器件可以编程写入最终用户代码,而不需要从电路板上取下元器件.已经编程的器件也可以用ISP方式擦除或再编程. 使用ISP的时候需要用到自举程序(BootLoader),自举程序存储在STM32器件的内部自举 ROM(系统存储器)中.其主要任务是通过一种可用的串行外设(USART.CAN.USB.I2C等)将应用程序下载到内部Flash存储器中.每种串行接口都定义了相应的通信协议,其中包含兼容的命令集和序列.3.4.2 I

stm32之Systick(系统时钟)

Systick的两大作用: 1.可以产生精确延时: 2.可以提供给操作系统一个单独的心跳(时钟)节拍: 通常实现Delay(N)函数的方法为: for(i=0;i<x;i++) ; 对于STM32系统微处理器来说,执行一条指令只有几十ns(纳秒),进入for循环,要实现N毫秒的x值非常大:而由于系统频率的宽广,很难计算出延时N毫秒的精确值:针对STM32微处理器,需要重新设计一个新的方法去实现该功能,以实现在程序中使用Delay(N): cortex的内核中包含一个SysTick时钟,SysTi

VxWorks嵌入式系统几种常用的延时方法

1 taskDelay     taskDelay(n)使调用该函数的任务延时n个tick(内核时钟周期).该任务在指定的时间内主动放弃CPU,除了taskDelay(0)专用 于任务调度(将CPU交给同一优先级的其他任务)外,任务延时也常用于等待某一外部事件,作为一种定时/延时机制.在没有中断触发时,taskDelay 能很方便地实现,且不影响系统整体性能.例如写数据至EEPROM,EEPROM需要一个内部擦除时间(最大擦除时间为lOms).以下所提及的一个 tick都假设为16.67 ms(

rtmp和rtsp有哪些优化延时的方法

问题描述 rtmp和rtsp有哪些优化延时的方法 rtmp和rtsp有哪些优化延时的方法, 采集数据.编码.传输.解码.显示,每个过程都可以优化,想问下,那个过程优化更明显

freertos-在FreeRTOS下开发软件,想延时1ms里面的延时delay的函数是怎么用?

问题描述 在FreeRTOS下开发软件,想延时1ms里面的延时delay的函数是怎么用? 求高人解答,在FreeRTOS下开发软件,想延时1ms里面的延时delay的函数是怎么用? 解决方案 参考:http://blog.chinaunix.net/uid-20564848-id-72931.html