STM32开发 --- F429寄存器SysTick使用

我就喜欢用寄存器操作 , 敲代码很爽很爽~~!! 工作中为方便查阅 , 把各个外设整理成了表格 .


SYSTICK 主要作用:

  • 大多时候用于做 延时函数, 下面有完整代码~
  • STM系芯片基本都有systick, 因此也常用于为嵌入式系统产生时基;
  • 很简单的, 只有4个寄存器,使用时只要控制前 3个:
    • CTRL __ 控制及状态
    • LOAD__ 重装载数值
    • VAL ____ 当前计数值
    • CALIB — 校准数值 (基本不用)

在这里插入图片描述

完整代码:

#include "Delay.h"    

static float   us=0;      
static  u16     ms=0;

/******************************************************************************
  * Function        Delay_init
  * Description     延时函数 初始化
  * Input           art_1 <u8 HCLK> 系统时钟频率,如180MHz ,则参数为:180     
  **/  
  
void Delay_Init(u8 HCLK)
{
	SysTick->CTRL &= ~(1<<2);            // 至0,值:HCLK/8,
	us = (float)HCLK / 8;               // 180MHz, 1us = 22.5 个脉冲    ,原子例程中,使用u8类型,180/8,无法除尽,使计时不准确,改为float
	ms = ((u32)HCLK * 1000) / 8;         // 180MHz, 1ms = 22500 次脉冲    
    DebugPrint ("Delay   配置完成\n");
}


/******************************************************************************
  * Function        Delay_us
  * Description     微秒延时   ( 1us=22.5次)              
  * Input           art_1 <u32 nus> 180MHz时,参数必须<745'654  ,2^24 / 180'000'000 / 8 / 1000 /1000
**/   

void Delay_us(u32 nus)
{		
    u32 temp;    
    if(nus==0) return;          // nus = 0 , 直接退出    
    SysTick->LOAD = nus * us;    // 写入重装载值 ,延时值
    SysTick->VAL  = 0x00;        // 清0计数器     
    SysTick->CTRL = 1;           // 使能         
    do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达  
    
    SysTick->CTRL = 0x00;        // 停止计数器
    SysTick->VAL  = 0x00;        // 清空计数器		
}


/******************************************************************************
  * Function        Delay_xms
  * Description     毫秒延时 _ 作基础函数被调用---由于SysTick->Val是24位,单次计时最大745毫秒,不方便
  * Input           art_1 <u32 xnms> 参数最大值 < 745 , ,24位最大值 / 180'000'000 / 8 / 1000 
**/ 

void Delay_xms(u16 xnms)
{
    u32 temp;    
    if(xnms==0) return;          // nus = 0 , 直接退出    
    SysTick->LOAD = xnms*ms;      // 时间脉冲值加载, LOAD 为24位
    SysTick->VAL  = 0x00;         // 清空计数器            
    SysTick->CTRL = 0x01;         // 使能,开始    
    do
	{
		temp=SysTick->CTRL;
	}while((temp&0x01)&&!(temp&(1<<16)));	//等待时间到达      
    SysTick->CTRL = 0x00;              // 关闭计数器
    SysTick->VAL  = 0x00;              // 清空计数器		
}


/******************************************************************************
  * Function        Delay_nms
  * Description     毫秒延时
  * Input           art_1 <u16 nms>  0 ~ 65535 
**/ 

void Delay_ms(u16 nms)
{
    uint8_t  repeat = nms / 500;          // 计算次数,每500ms一次,
    uint16_t remain = nms % 500;          // 余下的毫秒数
    while(repeat)
    {
        Delay_xms (500);
        repeat--;
    }
    Delay_xms (remain);			
}

希望使用寄存器的你也喜欢!~~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值