这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【炫Q-STM32】深入(二)定时器

共13条 1/2 1 2 跳转至

【炫Q-STM32】深入(二)定时器

专家
2015-07-01 22:56:59     打赏

其实这只是开一个头,还没有什么实质内容,计划学习一些内容,STM32的定时器,据说:


STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。


然后就是写中断,控制blink,可以参考这个帖子,时间太晚了,明天再研究吧


http://www.360doc.com/content/11/0323/12/6139921_103814532.shtml



专家
2015-07-03 22:34:02     打赏
2楼

为啥选了自动登录,登录还会过期,写了半个多小时的帖子不见了


大意就是学习了一个关键字volatile,看了百度

http://baike.baidu.com/link?url=ewY7aG_E86-gzwf7KpzD-fEoNneSOX5bBAkUL0FEfANwBsrL9Pbuk9Qv1-s7bV3PAPokVH1650jj42kB9m2A__


知道了编译器很高大上,会自作主张优化代码,结果比如延时循环,会被认为是无用功而忽略,可以用volatile修饰循环变量,禁止被优化,就写这么多吧。


专家
2015-07-04 18:22:06     打赏
3楼

还是看书比看网页系统,竟然发现定时器是第13章,好嘛,一点一点来吧,先做流水灯,

另外一个发现,不用库确实麻烦,要查表找寄存器地址,其实有些写法也是库里拷过来的,好吧,先看库吧,

这要学习了基于库的工程建立,要有一个库,现在是3.5版本

1)建立工程,选择STM32F103RB,不要启动文件的说

2)复制库文件STM32F10x_StdPeriph_Driver到libraries文件夹 复制库文件Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\下的文件到libraries\CMSIS,复制Libraries\CMSIS\CM3\CoreSupport下的两个文件也到这里 Project\STM32F10x_StdPeriph_Template下的main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h四个文件拷贝到src文件夹

3)添加组sart_code放入文件\libraries\CMSIS\startup\arm\startup_stm32f10x_md.s 添加组src放入文件\src\main.c、src\stm32f10x_it.c 建立组libraries,选择性放入libraries\STM32F10x_StdPeriph_Driver\src里的文件,是否参加编译src\stm32f10x_conf.h来决定 建立组CMSIS放入文件\libraries\CMSIS\system_stm32f10x.c、libraries\CMSIS\core_cm3.c

4)Alt+F7或者Procject->Option for Target ‘…’,选择C/C++页Define USE_STDPERIPH_DRIVER, STM32F10X_MD Include path添加..\src、..\libraries\CMSIS、..\libraries\STM32F10x_StdPeriph_Driver\inc、..\libraries\STM32F10x_StdPeriph_Driver\src确认


专家
2015-07-04 18:25:54     打赏
4楼

做流水灯需要添加两个库文件到工程

stm32f10x_gpio.h
stm32f10x_rcc.h

然后建立两个文件led.c、led.h

根据神舟的定义改一下即可

led.c

#include "led.h"

void LED_GPIO_Config(void)
{		
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); 										   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(GPIOA, &GPIO_InitStructure);		  
	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); 										   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);		  

	GPIO_SetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_3);	 
	GPIO_SetBits(GPIOB, GPIO_Pin_2);	 
}



 

led.h

#ifndef __LED_H
#define	__LED_H

#include "stm32f10x.h"

#define ON  0
#define OFF 1

#define LED1(a)	if (a)	\
					GPIO_SetBits(GPIOA,GPIO_Pin_2);\
					else		\
					GPIO_ResetBits(GPIOA,GPIO_Pin_2)

#define LED2(a)	if (a)	\
					GPIO_SetBits(GPIOB,GPIO_Pin_2);\
					else		\
					GPIO_ResetBits(GPIOB,GPIO_Pin_2)

#define LED3(a)	if (a)	\
					GPIO_SetBits(GPIOA,GPIO_Pin_3);\
					else		\
					GPIO_ResetBits(GPIOA,GPIO_Pin_3)

void LED_GPIO_Config(void);

#endif /* __LED_H */

 


专家
2015-07-04 18:28:26     打赏
5楼

这个流水灯的延时还是通过空循环实现

#include "stm32f10x.h"
#include "led.h"

void Delay(__IO u32 nCount);

int main(void)
{	
	LED_GPIO_Config();

	while (1)
	{
		LED1( ON );	
		Delay(0x0FEFEF);
		LED1( OFF );
		
		LED2( ON );
		Delay(0x0FEFEF);
		LED2( OFF );
		
		LED3( ON );
		Delay(0x0FEFEF);
		LED3( OFF );      
	}
}

void Delay(__IO u32 nCount)
{
	for(; nCount != 0; nCount--);
} 

 

有了前边烧录的基础,运行起来不是问题


专家
2015-07-04 19:44:45     打赏
6楼

通过GPIO找到PA2,PA3,去掉延时

观察一下波形,感觉不够快啊

哪里有问题呢?


专家
2015-07-04 20:20:47     打赏
7楼

换成直接操作寄存器,一次翻转41.7ns,折合24MHz可能也就是这么破逻辑分析仪的极限了吧



专家
2015-07-04 23:11:37     打赏
8楼

继续看书,后来发现开发环境自带分析功能,可以看出用库函数会多一些开销


高工
2015-07-06 21:34:10     打赏
9楼

循序渐进很好,研究完定时器脉冲可以看看定时器的正交编码


专家
2015-07-07 10:53:37     打赏
10楼
“正交编码”我去查查是个啥子概念

共13条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]