Systick中变量不能自增的问题

今年刚毕业,经验和能力都有限,STM32我倒是可以用,但是自己觉得吧,也只是皮毛而已,未来我倒是有些规划,但是个人比较抑郁,时时奔溃,我觉得这样不好。

一、背景

公司大部分开发用的是STM32,但是也有新唐的M0芯片和赛元的芯片。

有一个公司的程序,用的是新唐的M0芯片,本来呢是可以用的,现在出问题了,问题就定位在标题——Systick中的变量不能自增,导致这个变量在别处调用时出错,进而卡死。

二、最终解决

解决了就很简单,在定义变量前加上关键字"volatile"。

三、关于volatile

volatile是一个类型修饰符,意为“不稳定的”,也就是提醒编译器,这个变量是不稳定的,可能会在你不知道的时候就变了,所以你每次要实实在在去调用,不能自作主张优化取之前的值。

关于volatile我找到一篇文章,链接:C语言中volatile关键字的使用

其中,在常见使用的地方有以下3处,我的问题就在第一个上,这个是Bug是可能出现也可能不出现的,因为我以前在用的时候都没有遇到过,不过以后,都要加了。

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;

四、关于Systick的使用

Systick是一个24位硬件递减定时器,可自动重装载。

所以当初始化的时候配置好自动重装载值,比如0.1ms,在之后的程序中每0.1ms就可以进入Systick的中断。
下面是M0518SDAE的配置,系统时钟是50MHz。

    //Systick定时器初始化,100us
    /* Unlock protected registers */    
    SYS_UnlockReg();     
    /* Init System, peripheral clock and multi-function I/O */    
    SYS_Init();	    
    /* Tick  clock  滴答时钟初始化, 100us*/	    
    SysTick_Config(50*100);
    /* Lock protected registers */    
    SYS_LockReg();
volatile uint16_t check_time = 0;

//中断函数
void SysTick_Handler(void)
{
    check_time++;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值