本文主要是介绍智林开发板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实现 流水灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!