0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SysTick方式实现LED流水灯效果。

电子工程师 来源:lq 2019-02-11 15:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

SysTick_Init()函数

SysTick_Init 函数代码如下:

/*************************************************************************

* 函 数 名 : SysTick_Init

* 函数功能 : SysTick 初始化,SYSTICK 的时钟固定为 AHB 时钟的 1/8

* 输 入 : SYSCLK:系统时钟频率

* 输 出 : 无

**************************************************************************/

void SysTick_Init(u8 SYSCLK)

{

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

fac_us=SYSCLK/8; //SYSCLK的8分频 保存1us所需的计数次数

fac_ms=(u16)fac_us*1000; //每个 ms 需要的 systick 时钟数

}

SysTick_Init 函数形参 SYSCLK 表示的系统时钟大小,默认配置我们使用的系统时钟是 72M,所以调用这个函数时,形参值即为 72。函数内部调用了一个库函数 SysTick_CLKSourceConfig,此函数用来对 SysTick 定时器时钟的选择,我们使用的SysTick定时器时钟是系统时钟的8 频 ,所以参数是SysTick_CLKSource_HCLK_Div8。如果使用系统时钟作为 SysTick 定时器时钟,那么参数即为 SysTick_CLKSource_HCLK。这个函数在 misc.c 库文件内,如何查找我们前面介绍过方法。

下面的两条语句是用来求取SysTick定时器在1us时间内和1ms时间内的计数次数。

delay_us()函数

delay_us 函数代码如下:

/**********************************************************************

* 函 数 名 : delay_us

* 函数功能 : us 延时,

* 输 入 : nus:要延时的 us 数

注 意 :nus 的 值 , 不 要 大 于 798915us( 最 大 值 即

2^24/fac_us@fac_us=21)

* 输 出 : 无

**********************************************************************/

void delay_us(u32 nus)

{

u32 temp;

SysTick->LOAD=nus*fac_us; //时间加载

SysTick->VAL=0x00; //清空计数器

SysTick->CTRL|=0x01 ; //开始倒数

do

{

temp=SysTick->CTRL;

}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达

SysTick->CTRL&=~0x01; //关闭计数器

SysTick->VAL =0X00; //清空计数器

}

①将需要延时多少 us 的计数值加载到 SysTick 的 LOAD 寄存器中,fac_us值是延时 1us 所需的计数值。

②清空当前计数值寄存器 VAL。

③打开 SysTick 定时器,定时器开始向下递减计数。

④CTRL 寄存器的第 16 位是 SysTick 递减到 0 的标志位,如果递减到 0,此为置 1,通过读取该位来判断延时是否完成,从而退出 while 循环。

⑤关闭 SysTick 定时器。

⑥清空当前计数值寄存器 VAL。

delay_ms()函数

delay_ms 函数代码如下:

/*************************************************************

* 函 数 名 : delay_ms

* 函数功能 : ms 延时,

* 输 入 : nms:要延时的 ms 数

注意:nms 的值,SysTick->LOAD 为 24 位寄存器,

不要大于 0xffffff*8*1000/SYSCLK

对 72M 条件下,nms<=1864ms

* 输 出 : 无

**************************************************************/

void delay_ms(u16 nms)

{

u32 temp;

SysTick->LOAD=(u32)nms*fac_ms; // 时 间 加 载

(SysTick->LOAD 为 24bit)

SysTick->VAL =0x00; //清空计数器

SysTick->CTRL|=0x01 ; //开始倒数

do

{

temp=SysTick->CTRL;

}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达

SysTick->CTRL&=~0x01; //关闭计数器

SysTick->VAL =0X00; //清空计数器

}

此函数功能与 delay_us 基本一样,只不过这里是延时 ms。要注意的是,SysTick 定 时 器 是 24 位 的 , 其 计 数 最 大 值 为 0xffffff , 时 间 为nms<=0xffffff*8*1000/SYSCLK,SYSCLK 是系统时钟为 72M,所以最大延时为1864ms。如果需要延时大于 1.864S,可以调用多个 delay_ms 函数即可。

主函数

在 main.c 文件中前面引入了工程中所需的头文件,可以打开工程查看,这里我们主要看下 main 函数,代码如下:

/**************************************************************

* 函 数 名 : main

* 函数功能 : 主函数

* 输 入 : 无

* 输 出 : 无

***************************************************************/

int main()

{

SysTick_Init(72);

LED_Init();

while(1)

{

led1=0;

led2=1;

delay_ms(500); //精确延时 500ms

led1=1;

led2=0;

delay_ms(500); //精确延时 500ms

}

}

主函数实现的功能比较简单,首先对 SysTick 定时器进行初始化配置,选择系统时钟 8 分频作为 SysTick 的时钟,然后初始化 LED,这个初始化过程前面已经介绍过,大家也可以进入这个函数内查看。最后进入 while 循环语句,对 PC0和 PC1 管脚进行位操作,里面也调用了 delay_ms 延时函数,这时候的延时是非常精确的。

将工程程序编译下载到开发板内, 可以看到 LED 模块的 2 个指示灯实现了流水灯效果。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    244

    文章

    24789

    浏览量

    693634
  • 流水灯
    +关注

    关注

    21

    文章

    436

    浏览量

    62292
  • Systick
    +关注

    关注

    0

    文章

    67

    浏览量

    14045

原文标题:STM32实例-SysTick实现2个LED流水灯效果

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【紫光HiYou开源入门轻量级PCIE开发板PG2L25G】实验例程2-基于紫光FPGA 的键控流水灯实验例程

    控制模块和LED显示模块的设计实现。实验通过按键切换三种LED显示模式(流水灯、交替闪烁、暗灯流水),展示了FPGA模块化设计方法,包括子模
    的头像 发表于 05-20 11:48 3017次阅读
    【紫光HiYou开源入门轻量级PCIE开发板PG2L25G】实验例程2-基于紫光FPGA 的键控<b class='flag-5'>流水灯</b>实验例程

    【紫光HiYou开源入门轻量级PCIE开发板PG2L25G】实验例程1-基于紫光FPGA 的LED 流水灯

    ,包括实验原理、源码设计及硬件管脚分配。实验利用50MHz时钟信号,通过计数器实现0.5秒间隔的LED状态切换,最终实现4颗LED灯按设定顺序循环点亮和熄灭的
    的头像 发表于 05-20 11:07 87次阅读
    【紫光HiYou开源入门轻量级PCIE开发板PG2L25G】实验例程1-基于紫光FPGA 的<b class='flag-5'>LED</b> <b class='flag-5'>流水灯</b>

    使用FPGA控制上千颗RGB LED流水灯

    国内还有一个FPGA技术在特定垂直的领域-LED 显示。今天就从开源项目展开讲讲这个领域中FPGA扮演的角色。
    的头像 发表于 03-25 17:52 1093次阅读

    郎特科技 LED 灯管定制:管径规格如何影响照明效果

    郎特科技LED灯管定制:管径规格如何影响照明效果?在照明领域,LED灯管的管径规格是影响照明效果的关键因素之一。郎特科技提供多种管径规格的LED
    的头像 发表于 02-12 13:08 841次阅读
    郎特科技 <b class='flag-5'>LED</b> 灯管定制:管径规格如何影响照明<b class='flag-5'>效果</b>?

    CW32系统滴答SysTick定时器详解

    _CTRL_TICKINT_Msk| SysTick_CTRL_ENABLE_Msk; 设置SysTick IRQ中断使能,并开启SysTick定时器 4.Systick延时功能
    发表于 01-21 07:20

    使用系统定时器SysTick实现精确延时微秒和毫秒函数

    到 0 时,将从RELOAD 寄存器中自动重装载定时初值,开始新一轮计数。使用内核的SysTick定时器来实现延时,可以不占用系统定时器,由于和MCU外设无关,所以代码的移植,在不同厂家的Cortex-M
    发表于 11-20 07:12

    FZH16 固定花样 6 通道LED流星雨显示效果驱动IC

    是固定花样 6 通道LED流星雨显示效果驱动IC。本产品内部自带振荡器,PWM输出进行灰度 渐变。上电复位后,输出PWM波形,进行 6 通道的LED依次循环控制,实现流星、水滴
    发表于 11-14 09:34

    蜂鸟E203在黑金XC7A200T型FPGA上点亮LED实现流水灯

    一、队伍介绍 本篇介绍的内容是蜂鸟E203在黑金XC7A200T型FPGA上点亮LED实现流水灯。 二、前言 在此之前我们已经将蜂鸟E203在黑金XC7A200T型FPGA开发板上,所以
    发表于 10-31 09:04

    如何使用 M252 PSIO 实现 ARGB2 LED 定时,实现彩虹、剧场追逐彩虹等灯光效果

    使用 M252 PSIO 实现 ARGB2 LED 定时,实现彩虹、剧场追逐彩虹等灯光效果
    发表于 08-20 06:58

    如何使用GPIO模拟ARGB2 LED定时序列,并在M258系列微控制器(MCU)上实现彩虹波ARGB2 LED效果

    使用GPIO模拟ARGB2 LED定时序列,并在M258系列微控制器(MCU)上实现彩虹波ARGB2 LED效果
    发表于 08-20 06:55

    【中科昊芯Core_DSC280025C开发板试用体验】---定时器中断方式LED流水灯

    中科昊芯Core_DSC280025C开发板的单片机是32位单片机,运算速度快,但引脚配置又有点像Arduino,所以假如编写流水灯程序不像51单片机那么简单,可能对于玩转32位单片机的老手来说
    发表于 08-07 22:14

    瑞萨RA MCU众测宝典 SysTick之RA0E1定时器点灯

    嵌入式小百科将和大家一起,基于【RA-Eco-RA0E1-32PIN-V1.0】开发板,一步步实现SysTick定时器点灯,感受时间控制在嵌入式开发中的奇妙作用。 开启宝典 #Systick定时器
    的头像 发表于 08-05 14:50 3734次阅读
    瑞萨RA MCU众测宝典  <b class='flag-5'>SysTick</b>之RA0E1定时器点灯

    【RA-Eco-RA6M4开发板评测】——1.开箱点灯

    8.打开KEIL 9.设置MCU 10.编译,烧录代码 看到LED1,LED2,LED3全亮,满足预期结果 11.修改代码,实现流水灯
    发表于 07-16 13:00

    【沁恒CH585开发板免费试用体验】GPIO 流水灯

    电路图 值得注意的,不同的开发板,LED连接的GPIO一般是不同的,请注意修改。这里将LED0接到PB8,LED1接到PB17。 3 GPIO 流水灯
    发表于 07-04 22:55

    【RA-Eco-RA4M2开发板评测】流水灯练习

    LED的驱动。做一个流水灯效果 参考代码如下: #include \"hal_data.h\" FSP_CPP_HEADER void R_BSP_WarmStart
    发表于 05-29 19:04