智林开发板Z32R Systick实现 流水灯

2024-02-18 06:32

本文主要是介绍智林开发板Z32R Systick实现 流水灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

采用新库的方式,实现systick中断。参照网上源程序。

工程下载:http://download.csdn.net/detail/sunnf/6012099

 

全部代码

/*****************************************************************************  STM32单片机SysTick系统滴答定时器实验程序********************************************************************************/
#ifndef      _SYSTICK_H
 #define    _SYSTICK_H
 #include   "stm32f10x_it.h"     
 #define    LED (1<<5)

 #define    SYSTICK_CSR   (*((volatile unsigned long *) 0xE000E010)) //控制寄存器
 #define    SYSTICK_LOAD  (*((volatile unsigned long *) 0xE000E014)) //重载寄存器
 #define    SYSTICK_VAL   (*((volatile unsigned long *) 0xE000E018)) //当前值寄存器
 #define    SYSTICK_CALRB (*((volatile unsigned long *) 0xE000E01C)) //校准值寄存器
 unsigned long SysTick_Delay;                               //全局变量//配置寄存器
 void Delay_10us(unsigned long Countlinef);
 void SysTick_InitStructReadCmd(void);
 
  void SysTick_InitStructReadCmd(void)
  {
   SYSTICK_VAL = 0;                        //当前值寄存器清零
   SYSTICK_LOAD = SystemCoreClock / 1000000;           //重要部分就在这里  系统72000000 / 100000
   SYSTICK_CSR |= 0x06;                       //先关闭SysTick使能用的时候在打?
  }

  //延时函数
  void Delay_10us(unsigned long Countlinef)
  {
   SYSTICK_CSR |= 0x07;                              //启动SysTick使能
   SysTick_Delay = Countlinef;                           //把延时变量赋值SysTick_Delay全局变量
   while(SysTick_Delay != 0);                           //判断延时时间是否到
   SYSTICK_CSR |= 0x06;                              //时间到关闭 SysTick使能用的时候在打开
  }
 /*----------------------------------------------------------*\
   |  Delay                                                   |
   |  延时 Inserts a delay time.                              |
   |  nCount: 延时时间                                        |
   |  nCount: specifies the delay time length.                |
  \*----------------------------------------------------------*/
  void Delay(vu32 nCount) {
    for(; nCount != 0; nCount--);
      }
  // /*----------------------------------------------------------*\
  //  | MIAN ENTRY                                               |
  // \*----------------------------------------------------------*/
  int main (void) {
    GPIO_InitTypeDef GPIO_InitStruct;                    //固件库自带GPIO结构体

    SystemInit();  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);     //打开GPIOB外设时钟
   
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_5;       //配置GPIOB引脚0和5 0脚是嗽叭
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;        //配置输出速率50MHZ
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;         //配置为推挽式输出
    GPIO_Init(GPIOB, &GPIO_InitStruct);              //指定初始化GPIO寄存器
    SysTick_InitStructReadCmd();
    for(;;)
    {
      //GPIOB->ODR |=LED;                                     // switch on LED 方式1
      GPIO_SetBits(GPIOB, GPIO_Pin_5);                        //方式2
      Delay_10us(500000)  ;                                 //实现0.5S延时
      //GPIOB->ODR &= ~LED;                                   // switch off LED 方式1
      GPIO_ResetBits(GPIOB, GPIO_Pin_5);                      //方式2
      Delay_10us(500000)  ;                                 //实现0.5S延时
     
    }
  }
  //中断原来在stm32f10x_it.c文件中。
    void SysTick_Handler(void)
  {
    SYSTICK_VAL = 0;                                       //当前值寄存器清零
    if(SysTick_Delay != 0x00)                                //判断延时SysTick_Delay 是否等于0
    {
      SysTick_Delay--;                                   //减到0结束
    }
}
//====================================END=============================================//
//  /*   好了我们开始讲解程序1us是怎么实现的,我们使用时钟源为APB时钟,APB系统频率陪配置为72MHZ    
//      SYSTICK_LOAD = SystemCoreClock / 1000000;
//      SysTick重载初值重要的地方就在这里
//      1:SystemCoreClock 这个是什么意思,跟踪库函数找到如下:  
//      #ifdef SYSCLK_FREQ_HSE        uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;
//      #elif defined SYSCLK_FREQ_24MHz        uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;           
//      #elif defined SYSCLK_FREQ_36MHz        uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;             
//      #elif defined SYSCLK_FREQ_48MHz        uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;             
//      #elif defined SYSCLK_FREQ_56MHz        uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;              
//      #elif defined SYSCLK_FREQ_72MHz        uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;              
//      #else /*!< HSI Selected as System Clock source */
//      //     uint32_t SystemCoreClock         = HSI_VALUE;     
//      /*这里不难看出,我们初始化SystemInit();
//      是系统已经把SystemCoreClock配置成72M下面就不难理解了,              
//      先看一下计算公式:T = TICKS * (1/f);              
//      T : 为要计时的总时间。              
//      TICKS :为SYSTICK_LOAD 的输入参数。  
//      (1/f)为使用时钟源的时钟周期,f为时钟源的时钟频率   使用时钟源为AHB时钟, 频率被配置72M;  
//      把SYSTICK_LOAD重载寄存器赋值为 SystemCoreClock / 1000000;
//      呵呵呵大家   发现了什么,就是72000000 / 1000000 = 72;
//      大家都应该知道了72个时钟周期   中断一次,大家接着看(1/f)是时钟周期的时间?
//      ?/72M = 0.13888888888888888888888888888889;  
//      1us诞生了,0.13888888888888888888888888888889*72 = 1?
//      ?us哈哈哈大家明白了吧。 
//      //野火资料出问题的地方 ticks=SystemFrequency / 10 000 =720,相当于:72000000 / 10000 ;
//      这里少了一个0  结果等于 = 7200 不等于720看资料看的纠结哈哈哈。
//      这个程序折磨我1个星期,没有吃好睡好,搞明白后我就马上做上笔记那给大家分享。   
//      */
#endif

这篇关于智林开发板Z32R Systick实现 流水灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/720327

相关文章

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合