STM32学习之路-SysTick的应用(时间延迟)

开发板:奋斗V5

好~ 菜B要来搞实验了..

前面已经说了SysTick的工作原理什么的了,这里就不说了.. 先来做第一个实验:

盗自奋斗的样例,嘿嘿, 用SysTick产生1ms的基准时间,产生中断,每秒闪烁一次(LED1 V6)

(1)外围时钟初始化(系统时钟初始化这里就不写了,上次说了)

(2)LED初始化

(3)SysTick配置

(4)中断优先级

(5)中断处理函数

(6)延迟函数

OK,上代码:

(1)外围时钟初始化

void RCC_Config(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
						   RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
						   RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF |
						   RCC_APB2Periph_GPIOG, ENABLE);

}

(2)LED时钟初始化

void LED_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

(3)SysTick_Config配置

if (SysTick_Config(72000)) //SysTick_Config: return 0->success 1->failure
{
<span style="white-space:pre">	</span>while(1);
}	

好吧.. 这里看看这个库函数的内容吧

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */

  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  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 */
}

能够看到, 这家伙是有返回值的, 成功的话就返回0 , 所以为什么上面要设置一个if(),原因就是为了检測是不是SysTick的配置是不是成功了, 假设没成功,就返回1, 就进入while(1)了, 当然你也能够不要用推断,仅仅只是你可能在错误发生的时候你没法察觉到而已.或者你还能够在设置下,假设错误发生了,还有一盏灯就一直亮也行..

还有就是你给的初始计数值不要大于0xFF FF FF, 大于这家伙就会错误发生了,为什么? LOAD寄存器仅仅有24位.你比它还大,它怎么受得了..哈哈

好,这里还能够看到,NVIC_setPriority(SysTick_IRQn, (1<<_NVIC_PRIO_BITS)-1) 这里就是设置SysTick中断优先级的地方了,详细设置了哪个优先级,回去看看前面

关于优先级的文章吧..

(5)中断处理函数

在system32f10x_it.c中

并在该文件前面加上SysTickTimeCont_Delay()的定义:extern void SysTickTimeCont_Delay(); 由于我们在main.c文件中面还要用它

void SysTick_Handler(void)
{
  SysTickTimeCount_Delay();
}

(6)延迟函数

void Delay(u32 times)
{
	SysTickTimeCount = times;

	while (SysTickTimeCount != 0)
		;
}

void SysTickTimeCount_Delay(void)
{
	if (SysTickTimeCount != 0)
		SysTickTimeCount--;
}

这两个加起来才干算是延迟的了..

主函数

int main(void)
{
	RCC_Config();
	LED_Config();

	if (SysTick_Config(72000)) //SysTick_Config: return 0->success 1->failure
	{
		while(1);
	}	

	while(1)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_5);
		Delay(500);
		GPIO_ResetBits(GPIOB, GPIO_Pin_5);
		Delay(500);
	}
}

以下看图:

非常明显,美工没在家,哈哈哈... 1ms * (500+500) = 1s 这样就是实现了1s中闪烁一次了..

时间: 2024-11-08 22:07:43

STM32学习之路-SysTick的应用(时间延迟)的相关文章

STM32学习之路-不得不说的SysTick时钟

SysTick时钟,俗称"嘀嗒定时器",这家伙能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms 那么,它是怎么准确的产生1ms的呢.. 先来看看这家伙在时钟树的哪里吧 是它,是它,就是它,红色框里的东东,可以看到,它是由HCLK/8得到的,也就是:72MHz/8=9MHz 我们还能在STM32手册上找到这么一句话:系统嘀嗒校准值固定位9000,当系统嘀嗒时钟设为9MHz,产生1ms时间基准. 让我们来看看9000是怎么来的,这里要看下SysTick寄

STM32学习之路-LCD(2)&lt;LCD初始化&gt;

这些天一直在研究LCD的初始化函数,因为不过是用IO口模拟时序还是用FSMC来驱动LCD,都必须要弄好LCD的初始化 其实LCD的初始化就是跟着LCD IC的datasheet来写寄存器,大部分都使用上面的默认值,网上有很多修改的例子,这里就不 放出来了.但是我想写下一些比较重要的东西. 这是从网上下载来的一个文件的前半部分: 当然,别的型号的IC也是有这些东西的,不过可能有些地址不同而已. R0,这个命令有两个功能,如果对它写,则最低位为OSC,用于开启和关闭振荡器.而如果对它读操作, 则返回

STM32学习之路-外部中断(2)

OK,继续上篇的内容. 配置好外部中断源以后, 就得使能外部中断线了. 为了方便看再借下这个图: 对外部中断的使能其实就是配置上面这些寄存器.即使能哪EXIT线,选择上面模式,是中断还是事件,选择下降沿还是上升沿. 具体怎么写寄存器这就不研究了, = = 太麻烦了.. 直接用STM32的库就行了,来看看它的代码吧 这是EXTI结构体的初始化函数, void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) { EXTI_InitStruct->

STM32学习之路-按键中断测试(外部中断)

终于有时间再来学习STM32了~ 这几天都在忙着该死的考试.直接进入正题 开发板:奋斗V5 这个按键中断测试的要求是:按键2(K2)按下,LED2(V7)亮, 再一次按下就灭,循环.. 好,先看看按键和LED的原理图 好吧~ 虽然图截得不是很好看,但是能看到K2接的是PC2, LED2接的是PD6 ok,剩下的就是配置工作了.. 先来理一理思路: (1)初始化系统时钟 (2)初始化外部时钟(你所用到的东西) (3)配置LED (4)配置中断优先级 (5)配置外部中断线 (6)中断处理函数 恩,差

STM32学习之路-外部中断(1)

今天起得比较晚,又浪费了点时间,真可耻.. 下午又为校赛出了俩题,至此,校赛的四道题目已经完毕.又检查了一番,没有错误,就等待着明天的汇总了~. AC自动机的题目今天就刷了三道,还是没有完成之前的目标.现在vj也进不去了,想通宵,都不给机会~~ 只能等明天再刷完了,拖延不是一个好习惯. ----------------------------------------------------------------------------------------------------------

STM32学习之路-中断优先级&lt;NIVC(2)&gt;

优先级的问题可以分为以下情况: 抢占优先级和响应优先级 (1)抢占优先级高的可以打断抢占优先级低的,形成嵌套. (2)抢占优先级相同时,看响应优先级.如果两个中断前后发生的话,后来的中断不能打断前一个中断 只能等,如果两个中断同时发生的话,则响应优先级高的先响应. (3)抢占级别和响应级别都一样时,按照中断的地址来响应,地址低的先响应 这样就解决了优先级的问题. 哪个级别高呢?  0>1>2>...... STM32共有5组分别是0-4组,还是借那个图 可以看到第4组所有的位都用来设置抢

STM32学习之路-LCD驱动(1)&lt;基础知识&gt;

[1]以下关于 JVM 的叙述,哪些项正确? A.JVM 运行于操作系统之上,它依赖于操作系统 B.JVM 运行于操作系统之上,它与操作系统无关 C.JVM 支持 Java 程序运行,它能够直接运行 Java 字节码文件 D.JVM 支持 Java 程序运行,它能够直接运行 Java 源代码文件 扩展名为.java的是源代码文件(文本文件):开发时编写代码的文件 扩展名为.class的是字节码文件(二进制):系统运行时执行的文件 [2]下列选项中正确的表达式是: A.byte b = 128; 

STM32学习之路-LCD(3)&lt;显示图片&gt;

祝大家端午和六一快乐!原本今天是想休息休息的,但是实在无奈没什么事干.所以就来学习学习LCD显示图片的函数 函数是照搬奋斗的例子,算是些笔记吧.不过奋斗的例子注释的不是很详细.今天去看了正点原子的论坛,唉..瞬间感觉正点原子做得真的很好 能把所有的资料都开源,并且论坛上大多问题都耐心的解答了.这实在是非常非常好的售后服务了!!自己也偷偷的去下了写资料来看看,(*^__^*) 嘻嘻-- 好,进入主题: 开发板:奋斗V5 LCD:3寸 400X240 直接上代码吧 void lcd_DrawPict

STM32学习之路-点亮LED

STM32学习笔记—点亮led灯 STM32的I/O口有很多的功能,所以称为GPIO(GENERAL PURPOSE) 其中GPIO又分为A,B,C,D,E,F,G不同的组,每个组端口又分为0~15,共16个不同的引脚,不同的芯片引脚数量也不同,所用的学习板为STM32F103RBT6; I/O口的八种模式: 输入浮空:                  模拟输入: 输入上拉:                  输入下拉: 开漏输出:                  推挽输出: 推挽式复用功能