打印
[STM32F4]

STM32delay函数应用与说明

[复制链接]
868|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiyaoko2365|  楼主 | 2022-5-31 15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Cortex M4内核编程手册有关时钟系统的内容
p230
SysTick timer (STK)
The processor has a 24-bit system timer, SysTick, that counts down from the reload value to zero, reloads (wraps to) the value in the STK_LOAD register on the next clock edge, then counts down on subsequent clocks.
When the processor is halted for debugging the counter does not decrement.

处理器有一个24位的系统计时器(SysTick),这个定时器从装载值进行递减,知道0为止,在下一个时钟边缘对STK_LOAD中的值进行重载入,然后在后续的时钟中递减计数。
在对处理器进行暂停调试的时候,计数器不会减小。

在arm体系中与时钟有关的寄存器是:STK_CTRL STK_LOAD STK_VAL STK_CALIB是这四个寄存器

在明确了以上内容之后,利用STM32的内部SysTick来实现延时,这样既不占用中断,也不会占用系统定时器。

使用特权

评论回复
沙发
xiyaoko2365|  楼主 | 2022-5-31 15:02 | 只看该作者
定时函数的实现
delay_init 函数
该函数用来初始化2个重要参数:fac_us以及fac_ms;tongshi ba SysTick的时钟源选择位外部时钟,在不加入系统的时候,延时初始化函数的代码如下:
 // 初始化延时函数
//SYSTICK的时钟固定为HCLK时钟的1/8
static  uint8_t  fac_us=0;
void delay_init(uint8_t SYSCLK)
{
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    //SysTick 频率为 HCLK
    fac_us=SYSCLK; //不论是否使用 OS,fac_us 都需要使用
}

使用特权

评论回复
板凳
xiyaoko2365|  楼主 | 2022-5-31 15:02 | 只看该作者
delay_us 函数
这个函数是用来指定us的,其参数nus为延时的微妙数。
//延时 nus
//nus:要延时的 us 数.
//nus:0~190887435(最大值即 2^32/fac_us@fac_us=22.5)
void delay_us(uint32_t nus)
{
     uint32_t ticks;
     uint32_t told,tnow,tcnt=0;
     uint32_t reload=SysTick->LOAD;  //LOAD 的值
     ticks=nus*fac_us; //需要的节拍数
     delay_osschedlock();  //阻止 OS 调度,防止打断 us 延时
     told=SysTick->VAL; //刚进入时的计数器值
     while(1)
     {
          tnow=SysTick->VAL;
          if(tnow!=told)
          {
               if(tnow<told)tcnt+=told-tnow;
               //这里注意一下 SYSTICK 是一个递减的计数器就可以了.
               else tcnt+=reload-tnow+told;
               told=tnow;
               if(tcnt>=ticks)break;  //时间超过/等于要延迟的时间,则退出.
          }
     };
}

使用特权

评论回复
地板
xiyaoko2365|  楼主 | 2022-5-31 15:03 | 只看该作者
进行测试:是正确的!

使用特权

评论回复
5
wanduzi| | 2022-8-10 13:35 | 只看该作者

使用特权

评论回复
6
littlelida| | 2022-8-14 14:45 | 只看该作者
延时有哪几种

使用特权

评论回复
7
skyred| | 2022-8-15 20:11 | 只看该作者
感谢,学习了

使用特权

评论回复
8
Bblythe| | 2022-10-1 10:06 | 只看该作者

small 模式下未指存储类型的变量默认为data型

使用特权

评论回复
9
foxsbig| | 2022-10-2 14:03 | 只看该作者
温故而知新

使用特权

评论回复
10
Uriah| | 2023-1-20 07:07 | 只看该作者

编程器定位插字节

使用特权

评论回复
11
帛灿灿| | 2023-1-20 09:03 | 只看该作者

大部分单片机都带有加密锁定位或者加密字节

使用特权

评论回复
12
Bblythe| | 2023-1-20 10:06 | 只看该作者

利用协议、加密算法或这些算法中的安全漏洞来进行攻击

使用特权

评论回复
13
童雨竹| | 2023-1-20 12:02 | 只看该作者

单片机一般都有内部程序区和数据区

使用特权

评论回复
14
Pulitzer| | 2023-1-20 13:05 | 只看该作者

具存储功能的存储器芯片也能加密

使用特权

评论回复
15
公羊子丹| | 2023-1-20 14:08 | 只看该作者

紫外光复位保护电路是不行的

使用特权

评论回复
16
公羊子丹| | 2023-1-20 15:01 | 只看该作者

CPLD解密,DSP解密都习惯称为单片机解密

使用特权

评论回复
17
Wordsworth| | 2023-1-20 16:04 | 只看该作者

大部分能够读取或者识别Flash上的数据就能够获得Firmware文件

使用特权

评论回复
18
Clyde011| | 2023-1-20 17:07 | 只看该作者

微探针技术都属于侵入型攻击

使用特权

评论回复
19
万图| | 2023-1-20 19:03 | 只看该作者

如果在编程时加密锁定位被使能/锁定,就无法用普通编程器直接读取单片机内的程序

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

403

帖子

0

粉丝