历史上的今天
今天是:2025年02月04日(星期二)
2020年02月04日 | SysTick定时器实现走马灯的功能
2020-02-04 来源:eefocus
SysTick定时器被集成在NVIC中。因此,只要是Cortex-M3内核的单片机,就都有它。这个学习笔记就用SysTIck定时器来实现走马灯的功能。
SysTIck定时器非常简答,只有四个寄存器。这四个寄存器的含义在《Cortex-M3权威指南》那本书中讲的非常的清楚,这里不复述了,下面只讲讲在STM32上SysTIck有什么特殊之处。按照CMSIS标准,用C语言访问这四个寄存器时使用的寄存器名称分别如下:
SysTIck-》CTRL
SysTick-》LOAD
SysTick-》VAL
SysTick-》CALIB
SysTick-》CALIB的值固定为9000,因此,只有当系统嘀嗒时钟设定为9MHz(HCLK/8的最大值),产生1ms时间基准。

STM32提供了2个时钟源:
0:AHB/8
1:Processorclock(AHB)
因此,SysTick-》CTRL=7表示使用处理器时钟作为时钟源,使能SysTick,并且使能SysTick中断。SysTick-》CTRL=3时频率降为原来的1/8。
我的开发板上有四个LED,分别对应的GPIO端口D的PD2、PD3、PD4和PD7。
下面是例子程序,仍然先是直接设置寄存器。
#include“stm32f10x.h”
#defineRCC_GPIO_LEDRCC_APB2Periph_GPIOD
#defineGPIO_LED_PORTGPIOD
#defineGPIO_LED1GPIO_Pin_2
#defineGPIO_LED2GPIO_Pin_3
#defineGPIO_LED3GPIO_Pin_4
#defineGPIO_LED4GPIO_Pin_7
#defineGPIO_LED_ALLGPIO_LED1|GPIO_LED2|GPIO_LED3|GPIO_LED4
voidLED_Spark(void)
{
staticintstate=0;
switch(state)
{
case0:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED1);
state++;
break;
case1:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED2);
state++;
break;
case2:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED3);
state++;
break;
case3:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED4);
state=0;
break;
default:
state=0;
break;
}
}
intmain(void)
{
SystemInit();
RCC-》APB2ENR|=0x00000020;
GPIOD-》CRL=0x24422244;//PD2PD3PD4PD7SettoOutputmode
SysTick-》LOAD=24000000/200;
SysTick-》CTRL=3;
for(;;)
{
}
}
/**
*@briefThisfunctionhandlesSysTickHandler.
*@paramNone
*@retvalNone
*/
voidSysTick_Handler(void)
{
staticintcount=0;
count++;
if(count==100)
{
LED_Spark();
count=0;
}
}
然后是利用STM32 固件函数库提供的函数的例子。
#include“stm32f10x.h”
#defineRCC_GPIO_LEDRCC_APB2Periph_GPIOD
#defineGPIO_LED_PORTGPIOD
#defineGPIO_LED1GPIO_Pin_2
#defineGPIO_LED2GPIO_Pin_3
#defineGPIO_LED3GPIO_Pin_4
#defineGPIO_LED4GPIO_Pin_7
#defineGPIO_LED_ALLGPIO_LED1|GPIO_LED2|GPIO_LED3|GPIO_LED4
voidLED_Spark(void)
{
staticintstate=0;
switch(state)
{
case0:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED1);
state++;
break;
case1:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT,GPIO_LED2);
state++;
break;
case2:
GPIO_SetBits(GPIO_LED_PORT,GPIO_LED_ALL);
GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED3
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 步进电机在控制类系统中使用非常广泛,我设计过步进电机在工业系统中的应用有三次,一次是关于线切割铣床上工件移动的设计,一次是关于超声波小径管无损探伤驱动小径管旋转和探头水平移动的设计,还 ...… 查看全部问答> |
|
当IBM退出PC业务时,很多人不解。因为IBM是伟大的企业,他对企业未来的设想永非平常企业所及。今天,我们已经更深刻地体会到:PC,不是高科技,而是制造业。 IPC脱身PC业,从事IPC业务的很多人习惯称其为“工控”。它的身上,亦具备很多P ...… 查看全部问答> |
|
在VMware上运行VxWorks遭遇"Error loading file! 0xd0003",已经困扰几天了 【环境】PC、XP、Tornado2.2、VMWare、虚拟软驱RamDiskNT、虚拟网卡为AMD的PC-NET,按要求从AMD的网站上下载的最新驱程 【实施】严格按照网上的《嵌入式实时操作系统VxWorks入门》一文搭建; VMware Network Adapter VMnet1和VMwar ...… 查看全部问答> |
|
RealViewMDK一项功能,节约STM32芯片32%的CODE使用量 安装了MDK3.23版本之后,在keilarmoardsembeststm32v100开发板例程中,使用Blinky的例程,该例程含有LCD显示,ADC,USART,GPIO,NVIC等功能,在C/C++选项中使用三级优化-o3选项后编译结果:Code=7764,RO-data=468,RW-data ...… 查看全部问答> |
|
各位前辈:大家好! 请问怎么实现多级菜单。我现在要实现这样一个功能。就是在开机后会进入一个主菜单,然后在主菜单下有四个子菜单,子菜单下还有一级菜单,请问这个一般是怎么实现的呢,还有一个问题用LCD显示屏,怎么刷新这 ...… 查看全部问答> |
|
本人有多套开发板,处于完全闲置状态,还占地方.准备出了一点,换点别的东西玩玩. 特别是两足机器人的配件,如机械,舵机... EASYARM2200开发板(还有几片芯片) ------------------------------------------------------------------------600 ...… 查看全部问答> |
|
基于STM32和STM8的医疗电子方案,PPT格式,简单介绍了基于stm32的电图机(ECG) 、指甲式脉搏血氧仪、多参数监护仪、B超 、胎心仪、注射泵、输液泵、生化分析仪、麻醉呼吸机,基于stm8的血糖仪以及其它医疗产品的设计… 查看全部问答> |




