迅维网

查看: 1032|回复: 0
打印 上一主题 下一主题

STM32定时器学习笔记

[复制链接]
跳转到指定楼层
1#
发表于 2016-7-20 14:07:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: 山东青岛 来自 山东青岛

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
在配置STM32外设的时候,任何时候都要先使能该外设的时钟!
第一个例程,首先,考虑一个延时程序,要实现这一功能,共四步步骤(实际使用中两步就够了,第一步任何例程都必须做,):
Stm32_Clock_Init(9); //系统时钟设置,系统时钟设置为9倍频,即8Mhz*9=72Mhz
delay_init(72);      //延时初始化,按总线时钟72Mhz延时
//LED_Init();      //初始化与LED连接的硬件接口,这个不算第三步,使用它以便演示流水灯
  delay_ms(300);
第一步,看第一个程序:
void Stm32_Clock_Init(u8 PLL)
{
unsigned char temp=0;   
MYRCC_DeInit();    //复位并配置向量表
RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位
RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
RCC->CFGR|=1<<16;   //PLLSRC ON
FLASH->ACR|=0x32;   //FLASH 2个延时周期
RCC->CR|=0x01000000;  //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟  
while(temp!=0x02)     //等待PLL作为系统时钟设置成功
{   
  temp=RCC->CFGR>>2;
  temp&=0x03;
}   
}      
第二步,延时功能初始化,看第二个程序
void delay_init(u8 SYSCLK)
{
SysTick->CTRL&=0xfffffffb;//bit2清空,选择外部时钟  HCLK/8
fac_us=SYSCLK/8;      
fac_ms=(u16)fac_us*1000;
}
第三部,调用延时程序:
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=0x00;       //关闭计数器
SysTick->VAL =0X00;       //清空计数器        
}   
//延时nus
//nus为要延时的us数.                 
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=0x00;       //关闭计数器
SysTick->VAL =0X00;       //清空计数器  
}


------------------------------------

不得不说,《21天学通ARM嵌入式开发》是一本不折不扣的烂书,只是把官方手册照搬上去,再把库函数加些注释就变成一本书了,谁买谁上当,视频教程也没什么技术含量可言,千万不要买这本书。

STM32的定时器功能比单片机复杂,切不可照搬,首先给出一些基本定义:
ARR:auto reload register:自动重载寄存器,ARR也有定时器重载值的含义,STM32中的定时器是自动重载的,(不像单片机中的定时器有自动重载模式和手动软件重载模式,而且手动重载用得较多);
TIMx_CR:定时器控制寄存器;
更新事件:更新不等于触发中断,更新是指计数器上溢或下溢时,内部产生一个更新信号,根据此时相关寄存器的设置执行一些相应操作,比如重载ARR,具体在下文中会介绍。
触发事件:主要用于信号计数,可以使内部信号(定时器的输出也可以作为触发信号),也可以是外部引脚信号


接下来关注下面寄存器TIMx_CR中的两个位
ARPE:自动重装载预装载允许位
TIMx_CR中的UDIS:update disable 禁止更新
ARPE为0时,若改变ARR值,影子寄存器中的值立即被改变;ARPE=1时,影子寄存器中的值将等到计数值到达上一次设定的溢出值(即发生更新事件后)时,才会装载被修改过的ARR值;
UDIS:禁止更新,1有效
产生更新事件的条件:
①当计数器上溢或下溢时,并触发中断;
②当循环计数器计数值为0时(仅适用于TIM1),触发中断;
③通过软件设置UG(Update Generation)位,这种情况下不会触发定时中断


您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复