stm32快速学习7——LED闪烁(TIM2查询)

发布者:未来画家最新更新时间:2016-09-26 来源: eefocus关键字:stm32  LED闪烁  TIM2查询 手机看文章 扫描二维码
随时随地手机看文章
#include "stm32f10x_gpio.h"

#include "stm32f10x_rcc.h"

#include "stm32f10x_flash.h"

#include "stm32f10x_tim.h"

#include "misc.h"

void RCC_Configuration(void);

void GPIO_Configuration(void);

void TIM_Configuration(void);

 

int main(void)

{

  RCC_Configuration();

  GPIO_Configuration();

  TIM_Configuration();

  while(1)

  {

  if(TIM_GetFlagStatus (TIM2,TIM_FLAG_Update )!=RESET)

  {

  TIM_ClearFlag (TIM2,TIM_FLAG_Update);

  if( GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)==0)

  GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);

  else

  GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);

  }

  }

}

 

void RCC_Configuration(void)

{

  ErrorStatus HSEStartUpStatus;

  RCC_DeInit();

  RCC_HSEConfig(RCC_HSE_ON);

  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)

  {

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    FLASH_SetLatency(FLASH_Latency_2);

    RCC_HCLKConfig(RCC_SYSCLK_Div1);

    RCC_PCLK2Config(RCC_HCLK_Div1);

    RCC_PCLK1Config(RCC_HCLK_Div2);

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    RCC_PLLCmd(ENABLE);

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

    {

    }

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    while(RCC_GetSYSCLKSource() != 0x08)

    {

    }

  }

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

}

 

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

}

 

void TIM_Configuration(void)

{

//   假设TIM2的时钟源APB1(PCLK1)是36M

//   CK_CNT=36M/(TIM_Prescaler+1)   预分频后的频率=定时器的时钟源/预分频数

//   f=CK_CNT/(1+TIM_Period)        定时器实际频率=预分频后的频率/溢出计数值

//   f=36M/[(TIM_Prescaler+1)×(1+TIM_Period)]

//   T=1/f

//   T=[(TIM_Prescaler+1)×(1+TIM_Period)]/3600000

//   1s=(3600×10000)/36M

//   1s=[(3599+1)×(9999+1)]/36M

    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

    TIM_TimeBaseStructure.TIM_Period = 9999; //定时器计数值0-65535(0xFFFF)

    TIM_TimeBaseStructure.TIM_Prescaler = 3599; //分频计数 0-65535(0xFFFF)

    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //时间分割值,APB1(PCLK1)分频(频率降低),这个值固定了定时器最小周期时间,第一级的分频

    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数

    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);// 初始化定时器基本设定

    TIM_ClearFlag(TIM2, TIM_FLAG_Update);

    TIM_Cmd(TIM2, ENABLE);//使能TIM2

}

关键字:stm32  LED闪烁  TIM2查询 引用地址:stm32快速学习7——LED闪烁(TIM2查询)

上一篇:stm32快速学习2——点亮LED
下一篇:stm32快速学习5——串口中断接收

推荐阅读最新更新时间:2024-03-16 15:12

经典_STM32_ADC多通道采样的例子
STM32 ADC多通道转换 描述:用ADC连续采集11路模拟信号,并由DMA传输到内存。ADC配置为扫描并且连续转换模式,ADC的时钟配置为12MHZ。在每次转换结束后,由DMA循环将转换的数据传输到内存中。ADC可以连续采集N次求平均值。最后通过串口传输出最后转换的结果。 程序如下: #i nclude stm32f10x.h //这个头文件包括STM32F10x所有外围寄存器、位、内存映射的定义 #i nclude eval.h //头文件(包括串口、按键、LED的函数声明) #i nclude SysTickDelay.h #i nclude UART_INTERFACE.h #i nclude stdio.h #d
[单片机]
STM32快速初始化引脚 一行代码完成引脚初始化
前言 平时开发STM32的时候,经常涉及到初始化引脚,便编写了一个快速初始化引脚函数,可分别在F1、F4使用,建议放在sys.c中 硬件准备 STM32开发平台 程序设计 对于STM32F1平台: //以下宏定义等内容放在sys.h #define PA RCC_APB2Periph_GPIOA #define PB RCC_APB2Periph_GPIOB #define PC RCC_APB2Periph_GPIOC #define PD RCC_APB2Periph_GPIOD #define PE RCC_APB2Periph_GPIOE #define PF RCC_APB2Periph_GPIOF #defin
[单片机]
详解STM32单片机的堆栈
学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。 对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区: 栈区(stack) 堆区(Heap) 全局区(static) 文字常亮区程序代码区 程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。 栈是从高到低分配,堆是从低到高分配。 普通单片机与STM32单片机中堆栈的区别 普通单片机启动时,不需要用bootl
[单片机]
STM32 system_stm32f10x.c文件分析
startup_stm32f10x_md.s文件中,调用了一个叫SystemInit的函数,该函数其实在system_stm32f10x.c中定义,旨在初始化系统时钟、初始化外部SRAM、设置中断向量表地址。 void SystemInit (void) { /* 使能内部高速时钟 */ RCC- CR |= (uint32_t)0x00000001; #ifndef STM32F10X_CL RCC- CFGR &= (uint32_t)0xF8FF0000; #else RCC- CFGR &= (uint32_t)0xF0FF0000; #endif /* 禁用PLL、禁用始时钟检测、禁用外部高速时钟 */
[单片机]
keil写STM32程序出现literal treated as "long long"
在Keil MDKARM中 unsigned int value2=0x80000000; unsigned int value4=2147483648; value2编译时不产生警告,而value4就产生警告 main.c(17): warning: #1134-D: literal treated as long long 解决方法: 关键是2147483648是一个字面常量,类型是int型,而不是unsigned int. 上面这个语句,需要先将int类型,转换成unsigned int类型,再赋值给value4; 在转换过程中,因为这个数值超过32位int类型的表示范围,所以会出现你所见到的那个警告. unsign
[单片机]
__I、 __O 、__IO是什么意思?
这是ST库里面的宏定义,定义如下: #define __I volatile const /*! defines 'read only' permissions */ #define __O volatile /*! defines 'write only' permissions */ #define __IO volatile /*! defines 'read / write' permissions */ 显然,这三个宏定义都是用来替换成volatile 和 const 的,所以我们先要了解 这两个关键字的作用: volatile 简单的说,就是不让编译器进行优化,即
[单片机]
STM32—cubeMX+DMA+USART 接收任意长度的数据
前言     之前的一篇文章中我为了可以实现USART接收任意长度的数据,对HAL的库进行了修改,可以实现接收以0x0a结尾的任意长度数据,即认为接收到0x0a时接收结束,见链接:HAL USART接收任意长度。   然而,上述这种方法并不合适,原则上HAL库一般不去修改,不便于其他人移植程序,降低了程序中库的适用性,这是很不好的习惯,所以这种方法并不可取。   后查资料得知STM32中还可以利用DMA的方式实现串口的任意长度数据的接收,故开始学习DMA+串口接收任意长度的数据这种方式。 cubeMX软件配置过程 首先,第一步都是进行时钟树的配置,配置好系统的时钟,不同的芯片配置不同的时钟频率,如图。
[单片机]
<font color='red'>STM32</font>—cubeMX+DMA+USART 接收任意长度的数据
STM32 x 翌控科技 x 米尔电子 | STM32MP135开放式高实时高性能PLC控制器解决方案发布
01前言 随着工业数字化进程加速与IT/OT深入融合,不断增加的OT核心数据已经逐步成为工业自动化行业的核心资产,而OT层数据具备高实时、高精度、冗余度高、数据量大等等特点,如何获取更加精准的OT数据对数字化进程起到至关重要的作用,同时随着国内工业控制系统逐步进入中高端应用,更加精准的控制至关重要,因此工业控制系统高实时高性能需求尤其突出。 面对以上挑战,合作伙伴翌控科技基于米尔STM32MP135开发板发布开放式高实时高性能PLC控制器解决方案,将高精准数据采集、预处理、存储、通信与高实时控制融为一体,为控制系统迈向完全数字化中高端控制提供一个非常好的选择。 02STM32MP135处理器简介 STM32MP1
[嵌入式]
<font color='red'>STM32</font> x 翌控科技 x 米尔电子 | STM32MP135开放式高实时高性能PLC控制器解决方案发布
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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