3.滴答定时器1ms中断

前言:

        之前是用stm32cube建立工程,也没体会到臃肿,然而现在使用寄存器开发,真正感觉快太多了,整个工程特别清爽~一共也没几个文件,几乎只需要启动文件(.s那个汇编文件),还有正点原子给的时钟、串口初始化文件就差不多够了,编译速度简直不要太快~

         想起之前做一些单片机小项目经常要用到的就是滴答定时器,1ms中断一次,可以用来计时计数,指示程序运行状态之类的,很好用,但是正点原子的delay相关的函数就是用这个来实现的,占用了滴答定时器,所以我就想着用寄存器编程来达到1ms中断一次,实现中断服务程序备用这样一个目的。下面是原理和代码:

我一般的编程习惯是1.写出思路2.填充要配置的寄存器到思路里3.写代码

原理代码:

对滴答定时器的编程要看网络资料或者官方资料,下面是官方资料说的

在《STM32F3与F4系列Cortex M4内核编程手册.pdf》的234页,有这样一个章节

翻译过来就是滴答定时器的编程步骤是:

1.写重装载值2.清除当前的计数值 3.设置控制和状态寄存器

寄存器就不看手册的太费劲了,正点原子开发指南有给。一共四个寄存器,有一个没用的没放出来。

下面是结合寄存器的编程步骤:

1.写重装载值

由于我时钟的主频是168M,所以要1ms中断一次,这个重装值= 1ms / (1/168M)= 168M/1000

这个计算算是比较常见的应该不用解释,所以是:

SysTick->LOAD = 168000-1

2.清除当前的计数值

SysTick->VAL   = 0;  

3.设置控制和状态寄存器

配置不分频(bit2置1),配置计数到0产生异常请求(bit1置1),使能滴答定时器(bit0置0)

SysTick->CTRL = (1<<2|1<<1|1<<0)

其实上述配置,内核头文件有相关函数:SysTick_Config

只需要调用

SysTick_Config(168000);//参数是重装值值,配置1ms中断一次

即可完成上面的所有操作,我估计内核外设应该厂家都写好了。

滴答定时器部分写完,还有中断相关的呢,无非就是两个步骤:

1.设置NVIC分组方式2.设置滴答定时器中断优先级3.找到对应的中断函数名实现出来

分别如下:

NVIC_SetPriorityGrouping(2);

NVIC_EnableIRQ(SysTick_IRQn);

设置中断优先级这个部分,SysTick_Config里已经实现了,当然再写一次也无妨。

下面这个是滴答定时器中断服务函数,好像没有什么标志位需要清除的,直接用,实测ok

void SysTick_Handler(void)

{

//中断逻辑

}

效果如下:

还是挺准的

完整代码如下:

u16 myconut;
//systick中断服务函数
void SysTick_Handler(void)
{	
    myconut++;
    if(myconut>=1000){
        myconut=0;
        printf("hello\r\n");
    }

}

int main(void)
{ 
	u8 t=0;
	Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
	delay_init(168);		//初始化延时函数
    
    NVIC_SetPriorityGrouping(2);
    SysTick_Config(168000);//1ms中断一次
    NVIC_EnableIRQ(SysTick_IRQn);
    
	uart_init(84,115200);	//串口初始化为115200
	while(1)
	{

	}
}
    

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值