STM32学习手记⑤-SysTick精确延时

发布者:科技独行者最新更新时间:2015-07-27 来源: 51hei关键字:STM32  学习手记  精确延时 手机看文章 扫描二维码
随时随地手机看文章
/***********************************************************

例程名称:SysTick实验

硬件连接:指示灯连接  PE0

功能描述:每秒PEO翻转一次
*/


#include "stm32f10x_lib.h"


extern vu32 TimingDelay;     //在本文件引用stm32f10x_it.c定义的精确计时变量


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

* 函数名称    :void RCC_Configuration()

* 功能描述    : 复位和时钟控制 配置

* 参数        :  无

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无

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

void RCC_Configuration()

{

ErrorStatus HSEStartUpStatus;     //定义外部高速晶振启动状态枚举变量

RCC_DeInit();     //复位RCC外部寄存器到默认值

RCC_HSEConfig(RCC_HSE_ON);     //打开外部高速晶振

HSEStartUpStatus=RCC_WaitForHSEStartUp();     //等待外部高速时钟准备好


if(HSEStartUpStatus==SUCCESS){ //外部高速时钟已经准备好


FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法,位置:RCC初始化子函数里面,时钟起振之后

FLASH_SetLatency(FLASH_Latency_2); //FLASH时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。


RCC_HCLKConfig(RCC_SYSCLK_Div1);       //配置AHB(HCLK)==系统时钟/1

RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(高速)(PCLK2)==系统时钟/1 

RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(低速)(PCLK1)==系统时钟/2

//注:AHB主要负责外部存储器时钟。APB2负责AD,I/O,高级TIM,串口1。APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM。



RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL时钟==(外部高速晶体时钟/1)* 9 ==72MHz

RCC_PLLCmd(ENABLE); //使能PLL时钟

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL时钟就绪

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟==PLL时钟

while(RCC_GetSYSCLKSource()!=0x08); //等待系统时钟源的启动

}

    

//------------------------以下为开启外设时钟的操作-----------------------//

//   RCC_AHBPeriphClockCmd (ABP2设备1 | ABP2设备2 , ENABLE); //启动AHB设备

//   RCC_APB2PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //启动ABP2设备

//   RCC_APB1PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //启动ABP1设备


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO  , ENABLE);   //给 GPIOE和重映射提供时钟,注意:一定要设置RCC_APB2Periph_AFIO

} 


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

* 函数名称    : NVIC_Configuration(void)

* 功能描述    : NVIC(嵌套中断控制器)配置

* 参数        :  无

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无
[page]
******************************************************************************************/ 

void NVIC_Configuration( )

{

//NVIC_InitTypeDef NVIC_InitStructure;                           //定义一个中断结构体


//NVIC_InitStructure.NVIC_IRQChannel = 中断通道名; //开中断,中断名称见函数库

//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级

//NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;         //响应优先级

//NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //启动此通道的中断

//NVIC_Init(&NVIC_InitStructure);                                     //中断初始化


#ifdef  VECT_TAB_RAM                            //如果C/C++ CompilerPreprocessorDefined symbols中的定义了VECT_TAB_RAM 

     NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);   //则在RAM调试

   #else                                           //如果没有定义VECT_TAB_RAM, 则定义VECT_TAB_FLASH

     NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //则在Flash里调试,设置中断向量表的起始地址为0x08000000

   #endif 



//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);    //抢占式优先级别设置为无抢占优先级

//注:一共16个优先级,分为抢占式和响应式。两种优先级所占的数量由此代码确定,NVIC_PriorityGroup_x可以是0、1、2、3、4,

//分别代表抢占优先级有1、2、4、8、16个和响应优先级有16、8、4、2、1个。规定两种优先级的数量后,所有的中断级别必须在其中选择,

//抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。


NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 1, 0); //中断等级设置,一般设置的高一些会少受其他影响




} 


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

* 函数名称    :GPIO_Configuration()

* 功能描述    : GPIO配置

* 参数        :  无

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无

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

void GPIO_Configuration()

{

GPIO_InitTypeDef GPIO_InitStructure;      //定义GPIO初始化结构体 


 

//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_标号 |PIO_Pin_标号 ; //管脚位置定义,标号可以是NONE、ALL、0至15。

//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//输出速度2MHz

//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入模式

//GPIO_Init(GPIOC, &GPIO_InitStructure); //C组GPIO初始化

 


// 将PE0设为推挽输出

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOE, &GPIO_InitStructure);

}


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

* 函数名称    : SysTick_Configuration( )

* 功能描述    : 配置SysTick 定时器 1ms中断1次

* 参数        :  无

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无
[page]
************************************************************/

void SysTick_Configuration( )

{

 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);     //选择HCLK/8时钟作为SysTick时钟,9MHz

 SysTick_SetReload(9000);   //计数9000次为1ms

 SysTick_ITConfig(ENABLE);   //打开中断

}


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

* 函数名称    :Delay

* 功能描述    : 精确延时函数

* 参数        :  nTime

* 返回值      :  无

* 全局变量    :  TimingDelay

* 全局静态变量:  无

* 局部静态变量:  无

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

void Delay(u32 nTime) 

{

SysTick_CounterCmd(SysTick_Counter_Enable);        //打开SysTick计数器

TimingDelay = nTime;

while(TimingDelay != 0);

SysTick_CounterCmd(SysTick_Counter_Disable);     //关闭计数器

SysTick_CounterCmd(SysTick_Counter_Clear);    //清空计数器

} 



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

* 函数名称    :main()

* 功能描述    : 主函数

* 参数        :  无

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无

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

int main()

{

RCC_Configuration();

GPIO_Configuration();

NVIC_Configuration( );

SysTick_Configuration( );

    //EXTI_Configuration( );


while(1){

GPIO_SetBits(GPIOE,GPIO_Pin_0);

Delay(1000);

GPIO_ResetBits(GPIOE,GPIO_Pin_0);

Delay(1000);

} 

}




//中断函数在 stm32f10x_it.c 里面

void SysTickHandler(void)

{

TimingDelay--;       

}
关键字:STM32  学习手记  精确延时 引用地址:STM32学习手记⑤-SysTick精确延时

上一篇:s3c44b0存储器初始化简介
下一篇:STM32学习手记④-TIM3上溢出定时

推荐阅读最新更新时间:2024-03-16 14:26

STM32的基本概念及中断应用
1、基本概念 ARMCoetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。 4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,
[单片机]
STM32的复位与电源管理
复位功能是一个非常重要的功能,大到PC,小到单片机,每一台计算机系统都有。在我小时候,去网吧的时候,但凡是电脑出现任何一点小问题,网管的第一回答一定是重启。重启和复位就是同一个意思。 发展到现在PC已经很稳定了,复位按钮慢慢的淡出我们的视野,但是在主板上我们依然可以找到复位电路的存在。单片机上的复位功能也有着类似的变化,在我们学单片机那个年代,需要在单片机的外部一个复位电路,从专用引脚上接一个电阻和电容组成的复位电路。 如果没有这个电路,单片机就没法工作。现在的新款单片机都把复位功能内置到单片机中。如果是开发项目要手动复位,我们可以在复位引脚上接一个按键用来手动复位。 复位 复位功能的作用是让RAM 中的数据清空,让所
[单片机]
STM32串口通信(usart)
在开始学写STM32串口通信的代码实现前,首先先了解一下两块芯片之间通信的分类,按照数据传输方式可以分为 并行通信:数据各个位同时传输,速度快,占用引脚资源多 串行通信:数据按位传输,速度较慢,占用引脚资源少 按照数据传送的方向,可以分为 单工:只支持数据在一个方向上传输 半双工:允许数据在两个方向上传输,但在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信。 全双工:允许数据同时在两个方向上传输,因此全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 串口通信就是一种串行全双工通信方式,而串行通信又可分为 同步通信:带时钟同步信号传输(如SPI , II
[单片机]
STM32有关SPI实现DMA程序应用小记
特别针对SPI-DMA的发送和接收做了一次对比实验, 实验发现:当STM作为主设备向其它设备传送SPI数据时,DMA传送完成时中断,可进入中断程序,并在此时对SPI返回数据处理。SPI的返回数据在DMA-SPI-RX缓存中。 值得注意的是:返回数据的处理必须是DMA-SPI-TX传输完成中断后执行,不能在DMA-SPI-RX传输完成中断后执行,否则会出错。 以上是STM作为SPI主设备时的一些发现,当时就是在返回处理数据在DMA-SPI-RX完成中断后处理发生了问题。
[单片机]
ucosii在stm32上的移植详解2
在详解1中主要讲了移植需要用到的CM3内核知识,本文讲一讲ucosii的原理和代码组成。ucosii最经典的学习资料莫过于邵贝贝老师的 嵌入式实时操作系统uc/os-ii(第2版) ,我想这本书对学ucosii已经足够了,因为他把ucosii V2.55代码都讲了一遍。移植前应该好好看看此书。 下面说说我对ucosii的理解。应该说ucosii这个内核还是比较简单的,基本可以分为任务调度,任务同步和内存管理三个部分。 任务调度 ucosii为保证实时性,给每个任务分配一个不同的优先级。当发生任务切换时,总是切换到就绪的最高优先级任务。有2种情况会发生任务切换。 1.任务等待资源就绪或自我延时; 2.退出中断;
[单片机]
ST推出闪存容量高达512KB的STM32F3微控制器
中国,2015年2月9日 意法半导体 (STMicroelectronics,简称ST;纽约证券交易所代码:STM) 的STM32F3系列微控制器再添新产品,满足市场对高性能、创新功能和价格实惠的需求。新微控制器的片上存储容量增至512KB闪存 (Flash) 以及80KB静态随机存取记忆体 (SRAM),并集成丰富的外设接口,其中包括电机高转速控制器及片外 (off-chip) 存储器接口。 STM32F3系列是意法半导体ARM Cortex -M4微控制器产品组合的入门级产品。经过市场检验的M4处理器内核可支持DSP指令,内置浮点单元 (FPU),运行频率高达72MHz,若再搭配意法半导体独有
[单片机]
ST推出闪存容量高达512KB的STM32F3微控制器
STM32学习笔记】USART波特率 vs SPI速率
上一篇学习笔记介绍了USART硬件流控,相信大家理解了为什么要做流控,硬件流控与软件流控的区别,以及硬件流控如何处理。 本篇文章将与大家探讨USART波特率 vs SPI速率。这里提出一个问题,为什么USART的波特率是内核时钟的1/8或者1/16,而SPI最快的频率可以是内核时钟的1/2。 请大家带着这个问题来阅读本文。 串口和SPI内部时钟 在回答上面问题之前,需要先了解STM32内部时钟的概念,尤其是串口和SPI的内部时钟。 STM32里包含有系统时钟、AHB时钟和APB时钟。APB时钟来源于AHB,AHB时钟来源于系统时钟。 从上图中可以看出,时钟就像流水一样,从时钟源汇聚到系统时钟上,再从系统时
[单片机]
Event Recoder调试组件在stm32上的使用
本文目标:Event_Recoder调试组件在stm32上的使用 按照本文的描述,应该可以在你所处的硬件上跑通代码。 先决条件:装有编译和集成的开发环境,比如:Keil uVision5。 板子硬件要求:无,属于调试功能。 起源 因为做产品开发,设计东西有时候考虑得多,mcu的并没有多余的串口供使用调试,在调试一些初期进行验证时,必要的调试的打印信息是需要的。 Event Recoder调试组件简介 嵌入式的Event_Recoder调试组件是一种可以在MDK开发环境下使用的高级调试工具,它可以记录软件运行的一些标志信息,并以图形化的形式显示出来。它可以帮助你了解和分析内部操作,支持Keil RTX操作系统调试以及MDK自带的
[单片机]
Event Recoder调试组件在<font color='red'>stm32</font>上的使用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved