初学systick 滴答配置----两种方式

systick 滴答配置有两种方式:中断方式与查询方式。

*中断方式与查询方式的区别是:中断方式CPU可以同时干几件事,CPU没用专门等着计数,CPU可以干其他事情 ,时间到进行中断。。。为查询方式是CPU干耗着专门干这一件事,干不了其他事情。

//以下是core_m3.h中的SysTick_Config函数
/**

  • @brief Initialize and start the SysTick counter and its interrupt.
  • @param ticks number of ticks between two interrupts
  • @return 1 = failed, 0 = successful
  • Initialise the system tick timer and its interrupt and start the
  • system tick timer / counter in free running mode to generate
  • periodical interrupts.
    ///__INLINE在这里把函数指定为内联函数,而且关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前是不起任何作用的。
    在C语言中频繁使用函数对内存开销很大。使用内联函数可以减少对内存的消耗。使得程序运行更加稳定,避免程序出错。

    static __INLINE uint32_t SysTick_Config(uint32_t ticks)
    {
    //以下是判断,systick是一个24位倒计时定时器。所以ticks要小于2^24.如果大于则表示错误。返回1.
    if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /
    Reload value impossible */

SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register 重装载值寄存器LOAD*
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts /
SysTick->VAL = 0; /
Load the SysTick Counter Value /
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /
Enable SysTick IRQ and SysTick Timer /
return (0); /
Function successful */
}

//以下是msic.c中的SysTick_CLKSourceConfig函数。对时钟频率进行配置的。AHB 或者AHB/8
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
//以下是中断配置代码。

#include “stm32f10x.h”

// 函数声明
void RCC_Configuration(void);
void GPIO_Configuration(void);
void SYSTICK_Configuration(void);

int main(void)
{
RCC_Configuration(); //RCC初始化
GPIO_Configuration(); //GPIO配置

SYSTICK_Configuration();			//systick初始化配置
while (1);
return 0;

}

void RCC_Configuration(void)
{
//因为起始代码中已经调用了SystemInit函数将时钟主频设置为72M了。所以我们在这里RCC直接使用就OK了。
//systick是属于CPU部分的(ARM搞的),时钟时钟是打开的,不必要再去打开了。
//这里打开自己需要(这里使用普中科技的ARM3.0开发板进行LED灯的闪烁实验)的GPIO即可。

/* Enable Key Button GPIO Port, GPIO_LED and AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

}

//GPIO的配置。常规操作。
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// PB14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽模式
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);
}

void SYSTICK_Configuration(void)
{
// 配置1s钟
//ticks = 72000000/8 * 1 = 90000000

SysTick_Config(9000000); // <16777216
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}

//stm32f10x_it.c中SysTick_Handler函数中扔LED取反即可。
void SysTick_Handler(void)
{

GPIO_WriteBit(GPIOB, GPIO_Pin_14, !(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14)));

// 按理说需要清中断,但是systick不需要,他是自动清除的。

}

//这样看是不是很简单喔。中断方式就是在配置RCC 、GPIO、还用就是systick (SysTick_Config(ticks); // <16777216
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);这两个函数的调用)就搞定啦

//《《《《《《《《————————查询方式——————————》》》》》》》
//RCC、GPIO的配置基本一样,不用动。
#include “stm32f10x.h”

// 函数声明
void RCC_Configuration(void);
void GPIO_Configuration(void);
void delay_ms(unsigned int ms);

#define DELAY 40

int main(void)
{
RCC_Configuration(); //系统时钟配置
GPIO_Configuration(); //GPIO配置

while (1)
{
	GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);		// 灯亮
	delay_ms(DELAY);
	GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_RESET);	// 灯灭
	delay_ms(DELAY);	
}

return 0;

}

void RCC_Configuration(void)
{
//因为起始代码中已经调用了SystemInit函数将时钟主频设置为72M了。所以我们在这里RCC直接使用就OK了。
//systick是属于CPU部分的(ARM搞的),时钟时钟是打开的,不必要再去打开了。
//这里打开自己需要(这里使用普中科技的ARM3.0开发板进行LED灯的闪烁实验)的GPIO即可。

/* Enable Key Button GPIO Port, GPIO_LED and AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// PB8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_WriteBit(GPIOB, GPIO_Pin_14, Bit_SET);
}

//利用systick计数器帮我们实现 ms级别的延时
//要注意两点:1主频72M 2 ms<1864

void delay_ms(unsigned int ms)
{
unsigned int tmp = 0;

******// 首先进行systick的时钟设置,再就是给一个正确的ticks
// 下边就是使能systick.  while()循环等待时间到******

SysTick->LOAD = ms * 9000; 	// 72MHzÖ÷Ƶ£¬9MHz systickʱÖÓ
SysTick->VAL = 0;
SysTick->CTRL = 0x01;		// 使能systick,禁止中断,时钟频率AHB/8
do
{
	tmp = SysTick->CTRL;	
}while (!(tmp & (1<<16)));

// 跳出while循环说明定时时间到了。接下来就是关闭定时器
SysTick->VAL = 0;
SysTick->CTRL = 0x00;

}

*## 查询方式与中断方式很像。RCC GPIO的配置。不一样的地方就是:systick配置上。也是关键的地方。查询方式直接是对寄存器的操作。而没有使用库函数。对寄存器配置,一直检查 SysTick->CTRL是否变1.



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值