原创 STM32学习笔记time定时器

2009-8-16 17:22 8465 4 5 分类: MCU/ 嵌入式
先来个广告:试验板子
http://item.taobao.com/auction/item_detail.jhtml?item_id=af46787150a8e26f29546dccfbed3ab6&x_id=0db2


好长时间没有更新了,主要是前断时间被其他事中断了。
先把源文件弄上来,如下:
rarMDK编译器3.7

无疑STM32的定时器是复杂的,主要有定时,捕获,PWM产生功能。我花了点时间看通用定时器2,3,4的框图,tim1则在通用定时器的基础上多加了些功能,称为高级定时器。

////////////////////////////////////////////////////////////////////////////////
根据程序来分析:
/////////////定时器2配置500ms///////////////////////////////////////////////////////
   TIM_DeInit(TIM2);//TIM2,3,4:SystemClk=APB1(Max36Mhz)
   RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //使能TIM2的时钟
   //////////定时器2配置///////////////////////////////
   //计划:PSC = 349 则     CK_CNT = 36Mhz/(349+1) =>10us
   //      ARR = 50 000     1us * 50 000 =50ms                                               
   m_TIM_TimeBaseInitTypeDef.TIM_Prescaler           = 349; //预分频    PSC(0-65535)
   m_TIM_TimeBaseInitTypeDef.TIM_CounterMode       = TIM_CounterMode_Up; //计数模式
   m_TIM_TimeBaseInitTypeDef.TIM_Period               = 50000; //自动重载 ARR(0-65535)
   m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision       = TIM_CKD_DIV1; //时钟分频因子1,2,4
   m_TIM_TimeBaseInitTypeDef.TIM_RepetitionCounter = 0;//循环计数次数(只是TIM1,8有)
   TIM_TimeBaseInit(TIM2,&m_TIM_TimeBaseInitTypeDef);
   ////////////////////////////////////////////////////
   //使能配置中断=>:使能更新事件中断
   TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//Enables or disables the specified TIM interrupts.
   //注意TIM_UpdateDisableConfig 用DISABLE函数处才将对应为清零而达到使能(UDIS=0:使能更新事件)
   TIM_UpdateDisableConfig(TIM2,DISABLE);//Enables or Disables the TIMx Update event.     
   NVIC->ISER[0] |= (1 << (TIM2_IRQChannel & 0x1F));     // enable interrupt
   //开始计数
   TIM_Cmd(TIM2,ENABLE);//Enables or disables the specified TIM peripheral.
   首先在在定时功能上和传统的51,avr比,多了些功能,其他的一样。其输入时钟源为APB1/2,等同51,avr的系统时钟。忘了51,至少avr有时钟分频功能,stm32也有在函数配置中TIM_ClockDivision       = TIM_CKD_DIV1; //(时钟分频因子1,2,4)在时钟输入上,时钟多了个选TIM_Prescaler(预分频,这个的加入灵活性加大,它可以是0-65535的任意值,则预传统的只能几个选择则体现了配置的灵活和实用。
//
m_TIM_TimeBaseInitTypeDef.TIM_Prescaler           = 349;
// m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision       = TIM_CKD_DIV1;

   再说:51,avr的计数器初值,也是决定定时大小的一个因素。具体实现:就是计数器计数自减或者增加到某个值,发生溢出中断,在自加的时候是从初值加到满值 溢出。自减时,是从初值减到0溢出,发生中断,在每次定时完毕的定时器溢出后,其初值需要在中断函数中重新赋值给计数器
在stm32中也是有个同样的功能,但是这儿是不同的。在自加的时候,从0开始,直到寄存器TIMx_ARR值大小产生溢出中断,自减是从TIMx_ARR值大小开始自动减直到0溢出,不通点1。在进入中断后,中断函数一个更新事件,这个更新事件自动重载TIMx_ARR到计数器,这一点与51中的自动重载类似.
//
m_TIM_TimeBaseInitTypeDef.TIM_Period               = 50000;
 
  上面为使用库函数,在MDK中可以用init.c配置定时器,这样更是简便,图下:
3eb2ddfb-618a-4339-89b7-121d8c53abee.JPG
代码再上船的源文件中只需要调用stm32_Init();当然这个函数还配置了系统时钟,等等。编写代码只需要再中断函数中添加代码即可.

另上一个定时器其他功能的程序包,没有测试,在网上下载的。在readme文件有中文说明
rar
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户213884 2009-12-11 16:30

请教一下,我想在捕获时发生中断,在计数器溢出时也发生中断,该怎么办,捕获已经完成了,就是更新事件没有做好。我是用来测脉冲的,100多Hz
相关推荐阅读
用户1494767 2014-09-27 12:21
zigbee学习--osalInitTasks
http://85kaifa.taobao.com [学习 记录中....随时更改] zigbee学习--osalInitTasks  (OSAL_SampleApp.c) /****...
用户1494767 2012-08-12 18:31
ubuntu 10.04下nfs挂载2440
1、安装端口映射器portmap(可选)    sudo apt-get install portmap 2、在终端提示符后键入以下命令安装NFS服务器   sudo apt-get ins...
用户1494767 2012-08-09 22:33
Linux下DNW的PC端USB驱动和写入工具【转】
1. 下载Linux下DNW的PC端USB驱动和写入工具 文件名: dnw_linux.zip 下载后把后缀名改成.tgz #或者搜索 linux dnw 2. 编译PC端USB驱动和写入...
用户1494767 2012-01-06 17:01
STM32F207 uCOS-II移植笔记(下)
  第十步:main函数中变为:主要是将时钟初始化去掉,并建立一个启动任务        int main(void)        {           CPU_INT08U  o...
用户1494767 2012-01-05 09:51
STM32F207 uCOS-II移植笔记(上)
                                     STM32F207 uCOS-II移植笔记(上) 第一步: 建立STM32F207工程,已经有相关文档说明。其中stm...
用户1494767 2011-12-15 18:04
转]ubuntu 环境变量设置方法
环境变量配置文件 在Ubuntu中有如下几个文件可以设置环境变量 1、/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,...
EE直播间
更多
我要评论
1
4
关闭 站长推荐上一条 /3 下一条