STM32_Systick学习及例程改写

涉及的参考来自:野火的《【野火®】零死角玩转STM32—F103霸道》、野火例程

1.systick进中断不用清标志的,这个好奇怪,难道是因为它是内核外设?

 

2.第二个不同之处是它的优先级的奇怪,其优先级没有主和子优先级之说,并且STM32只保留了其高4bit有效,也就是其优先级可设范围为0~15;

直接调用NVIC_SetPriority实现

NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */

         但是虽然它没有主和子优先级之说,但是碰到其他外设时,怎么比较?还是按照优先级分组的配置来比较,也就是按照优先级分组的比例来拆分,进行比较。

 

3. 不管开不开其中断,其计数器值一旦递减为0,计数标志就置1,有中断进中断,无中断也没啥事,继续重载计数。

4.systick优先级设的时候是和那个NVIC的优先级分组没关系,不受NVIC怎么分组的影响,而且systick不分主和子优先级的。但是比较的时候是按NVIC的分组值比的,比的时候将其值按分组值进行拆分再比。

5.计数-1的问题,可以这么理解,比如你设置n,那么它进一次中断时n,接下来就是,n-1,n-2,……,0,实际运行了n+1,所以要-1.这样理解就行了。为啥不用递增理解?因为这个计数器是递减计数器,虽然可以用递增来理解但它没有说明它内部是+1操作的,所以我觉得如果举递增的理解方式会有误导,虽然道理一样。

6.野火例程的改写

         针对其第二个在程序中检测计数器标志的延时,我是看它还是开中断,而且每次都要重新配置,我就闲累,于是改写成不开中断,配置一次,之后只是开计数器关计数器。

    RCC_ClocksTypeDef  RccClocks;
    uint32_t SystemClockFrequency = 0, u32Cnt = 0;

    RCC_GetClocksFreq(&RccClocks);

    SystemClockFrequency = RccClocks.HCLK_Frequency;
    u32Cnt = SystemClockFrequency/1000;
    
    if ((u32Cnt - 1) > SysTick_LOAD_RELOAD_Msk)    /* Reload value impossible */
    { 
        /* Capture error */ 
        while (1);
    }
    else
    {
        SysTick->LOAD  = u32Cnt  - 1;                                  /* set reload register */
        NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
        SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
        SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk;                                               
        SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk); /* Disable SysTick IRQ and SysTick Timer */
    }

    u16 i;
    
	for(;;)
	{

		LED1( ON ); 
        // 配置 counter 计数器的值
        SysTick->VAL   = 0;
        SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; /* Enable SysTick Timer,But diable SysTick IRQ*/
        for(i=0;i<1000;i++)
        {
            // 当计数器的值减小到0的时候,CRTL寄存器的位16会置1
            // 当置1时,读取该位会清0
            while( !((SysTick->CTRL)&(1<<16)) );
        }
        // 关闭SysTick定时器
        SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;

//		SysTick_Delay_Ms( 1000 );
		LED1( OFF );
	  
		LED2( ON );
        // 配置 counter 计数器的值
        SysTick->VAL   = 0;
        SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; /* Enable SysTick Timer,But diable SysTick IRQ*/
        for(i=0;i<1000;i++)
        {
            // 当计数器的值减小到0的时候,CRTL寄存器的位16会置1
            // 当置1时,读取该位会清0
            while( !((SysTick->CTRL)&(1<<16)) );
        }
        // 关闭SysTick定时器
        // 配置 counter 计数器的值
        SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
//		SysTick_Delay_Ms( 1000 );
		LED2( OFF );
	
		LED3( ON );
        // 配置 counter 计数器的值
        SysTick->VAL   = 0;
        SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; /* Enable SysTick Timer,But diable SysTick IRQ*/
        for(i=0;i<1000;i++)
        {
            // 当计数器的值减小到0的时候,CRTL寄存器的位16会置1
            // 当置1时,读取该位会清0
            while( !((SysTick->CTRL)&(1<<16)) );
        }
        // 关闭SysTick定时器
        SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
//		SysTick_Delay_Ms( 1000 );
		LED3( OFF );
	} 

 

STM32最小系统硬件组成详解 0组成: 电源 复位 时钟 调试接口 启动 1、电源 : 一般3.3V LDO供电 加多个0.01uf去耦电容 2、复位:有三种复位方式:上电复位、手动复位、程序自动复位 通常低电平复位:(51单片机高电平复位,电容电阻位置调换) 上电复位,在上电瞬间,电容充电,RESET出现短暂的低电平,该低电平持续时间由电阻和电容共同决定,计算方式如下:t = 1.1RC(固定计算公式) 1.1*10K*0.1uF=1.1ms 需求的复位信号持续时间约在1ms左右。 手动复位:按键按下时,RESET和地导通,从而产生一个低电平,实现复位。 3、时钟 : 晶振+起振电容 +(反馈电阻MΩ级) 如使用内部时钟: 对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 2)对于少于100脚的产品,有2种接法: i)OSC_IN和OSC_OUT分别通过10K电阻接地。此方法可提高EMC性。 32.768KHZ: 可选择只接高速外部时钟8MHZ或 既多接一个32.768MHZ的外部低速时钟。 32.768KHZ时钟作用: 用于精准计时电路 万年历 通常会选择32.768KHz的晶振,原因在于32768=2^15,而嵌入式芯片分频设置寄存器通常是2的次幂的形式,这样经过15次分频后,就很容易的1HZ的频率。实现精准定时。用于精准计时电路 万年历 晶振:一般选择8MHZ 方便倍频 有源:更稳定 成本更高 需要接电源供电 不需要外围电路 3脚单线输出 无源:精度基本够 方便灵活 便宜 最大区别:是否需要单独供电 无源晶振需要外接起振电容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值