请教STM32f030R8的基本555定时器器

查看: 11441|回复: 28
分享一个STM32F030F4的SSOP转DIP最小系统板,可以很方便的DIY
STM32F030F4是一个很牛X的32位单片机,48MHz的主频,无需外部晶振,16KB的Flash,4KB的RAM,还带多路输入的12位ADC,还有SPI、串口、I2C等,还可以在线仿真单步调试!这一切只需要2.2元……所以还玩毛8051……
为方便平时DIY点小东西(主要是给儿子做电动玩具车、船等),我把它做成一块长26mm宽17.5mm的小PCB:
1-在上面放了个LDO把3.7V-5V转为3.3V给单片机供电,这样就可以接单节锂电池(3.7-4.25V)或者小充电宝(5V)了,省下买一次性干电池的费用(10块钱的电池往往也就能玩几个小时),还环保。
2-放了一个8MHz晶振,实际上用不到,因为内部的RC振荡器精度已经足够了,所以不焊晶振还能多出两个IO
3-所有普通IO都接了个LED,比较酷,也方便观察状态。也能客串一下流水灯
4-留出了4线调试口(SWD),插上J-Link就能单步调试
原理图.png (140.02 KB, 下载次数: 131)
22:45 上传
PCB-才26x17.5mm.PNG (46.66 KB, 下载次数: 28)
22:45 上传
Protel格式的原理图和PCB,有兴趣可以下载下来自己修改(我放弃版权,当然你修改后发表时最好引用一下本帖子链接):
(43.1 KB, 下载次数: 1521)
22:45 上传
点击文件名下载附件
源码随后整理几个再发上来
下来学习下,感谢楼主
固件包,内部有所有外设的例程。论坛限制了附件大小,所以把无关的文件包括图片、pdf手册等都删掉,并且用的是7zip压缩(目前这个工具压缩性能最好,本附件230KB,用winrar压缩是860KB)
(229.09 KB, 下载次数: 1148)
14:53 上传
点击文件名下载附件
谢谢楼主,下载了,其他的资料也想办法分卷压缩发上来啊。
alunli 发表于
谢谢楼主,下载了,其他的资料也想办法分卷压缩发上来啊。
抱歉,清点一下,发现我做的例程都是带有2.4G模块遥控功能的,跑内部商业协议栈,所以不便公开。所以在固件包里删掉了自己的例程,只保留厂家提供的。
其实做IO控制时,厂家的例程已经足够了:有定时器、有读取数字输入口和ADC、有控制输出口
谢谢楼主的答复,你那个板子是找厂家做的吗?有没有多余的转让两块给我啊?
alunli 发表于
谢谢楼主的答复,你那个板子是找厂家做的吗?有没有多余的转让两块给我啊?
在顺易捷打样的,跟其它板一起拼板打样的,只占了一个小边角,所以我也没多少,小孩子玩玩具的消耗量也很大
你如果有需要可以打样一次,50元就能搞到10块10x10cm的板,能切割出150块小板了。
不过还是不建议这样做。我一般都是把一个玩具用到的所有功能都画成小PCB小模块的组合形式,这样可以省很多事,因为现在基本都用贴片元件,搭棚焊接很费劲。
那就算了,我到淘宝去看看,谢谢了。
alunli 发表于
谢谢楼主的答复,你那个板子是找厂家做的吗?有没有多余的转让两块给我啊?
可以参考我做的几个小板:
玩具PCB积木.PNG (92.11 KB, 下载次数: 19)
22:29 上传
其实硬件还是不费事的,主要是软件复杂点
谢谢了,上淘宝才发现,这单片机便宜,小板不到10元,可那个下载器价格不便宜啊,那个USB-》TTL能代替吗?
alunli 发表于
谢谢了,上淘宝才发现,这单片机便宜,小板不到10元,可那个下载器价格不便宜啊,那个USB-》TTL能代替吗?
想要调试爽一点,买个三四十的Jlink还是很有必要的。
如果水平高可以通过LED状态盲调,可以用串口下载(所有STM32芯片都能用串口下载)。买一根几块钱的USB转TTL串口线即可。
你如果需求跟我差不多,建议还是自己画PCB比较合适,这种东西消耗量还是不小的,DIY过程用上了热熔胶、AB胶之后,基本很难二次利用
既然是开源的,建议提交到嘉立创,
这样方便我们在立创商城买元件或者嘉立创打样时,可以捎带1两片这块PCB了。
locky_z 发表于
既然是开源的,建议提交到嘉立创,
这样方便我们在立创商城买元件或者嘉立创打样时,可以捎带1两片这块PCB ...
这个就没精力去折腾了,反正都放弃版权了。有需要的自己画一下也就一两个小时的功夫。
Powered bySTM32F103R8T6的定时器使用问题 - STM32 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 3428|回复: 1
STM32F103R8T6的定时器使用问题
在线时间0 小时
该用户从未签到主题帖子精华
新手上路, 积分 11, 距离下一级还需 39 积分
现在在做一个定时器的测试程序,要用定时器2定时1秒,中断中翻转IO口,改变指示灯状态。下面是我的程序:
#define ENCODER_TIM_PERIOD (u16) 13999
#define TIMx_Channel
#define TIMx_PRE_EMPTION_PRIORITY 0
#define TIMx_SUB_PRIORITY 1
///////////////////////////////
//u8 Port[1];//PCA9554D的端口
u8 act[5][10];//保存A,B,C,共补的电容器投切状态。
u8//临时程序试验用计数变量。
GPIO_InitTypeDef GPIO_InitS
/* Private function prototypes -----------------------------------------------*/
void Switch_Twel(u8 flag );//正负12V输出电压转换及关闭prototypes
u8 Relay_Drive(u8 X,u8 Z);
void Relay_ALL_Leave(void);//切掉全部电容器。
/////////////////////////////////////////////////////////////
/* Private functions ---------------------------------------------------------*/
void Delay100ms(void)
u32 cnt=0x;
while(cnt--);//延时105ms
void GPIO_Ini(void)
/* GPIOA/GPIOB Periph clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/* Configure PA8,PA0 ,PA12 in output pushpull mode *///指示灯控制
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_0|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Configure PB11,PB10 in output pushpull mode ,正负12V的电源转换
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_10;
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_10;//positive and negive 12voltage output
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_12);//双向可控硅的所有驱动输入皆为低电平。
GPIO_SetBits(GPIOA,GPIO_Pin_8);//关闭指示灯。
void timer2_Init(void)
TIM_TimeBaseInitTypeDef
TIM_TimeBaseS
NVIC_InitTypeDef NVIC_InitS
/* TIM2clock source enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIMx_C
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Timer configuration in Encoder mode */
TIM_DeInit(TIM2);
TIM_TimeBaseStructure.TIM_Prescaler = 1999;
// APB2=72M 72M/(71+1)=1M
TIM_TimeBaseStructure.TIM_Period = ENCODER_TIM_PERIOD;
//count 100 reset to 0
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2 , &TIM_TimeBaseStructure);
//使能预装载
TIM_ARRPreloadConfig(TIM2, ENABLE);
//TIM_GenerateEvent(TIM1, TIM_EventSource_Update);
// Clear all pending interrupts
TIM_ClearFlag(TIM2 , TIM_FLAG_Update);
TIM_ClearITPendingBit(TIM2 , TIM_IT_Update);
//enable interrupt
TIM_ITConfig(TIM2 , TIM_IT_Update, ENABLE);
//TIM_Cmd(TIM1, ENABLE);
TIM_Cmd(TIM2,ENABLE);
//TIM_CtrlPWMOutputs(TIM1, ENABLE);
int main(void)
/*!& At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f10x_xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.c file
SystemInit(); // 使用外部8MHZ的晶振,系统时钟改为56MHZ,高速外围56,低俗28MHZ。
GPIO_Ini();
//I2C_EE_Init();
//PCA9554D_Init();//initialize the PCA9554D as the output ,and all output hign level.
timer2_Init();
//u32 cnt=0x0009
现在的问题是,一运行程序,就进入中断文件里面的硬件出错部分:
void HardFault_Handler(void)
__IO u32 ReturnA
ReturnAddr = __get_MSP();
ReturnAddr = *(u32 *)(ReturnAddr+32);
/* Go to infinite loop when Hard Fault exception occurs */
单步执行,发现在timer2_Init();里面执行TIM_Cmd(TIM2,ENABLE);之后,在
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
/* Check the parameters */
assert_param(IS_TIM_ALL_PERIPH(TIMx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
/* Enable the TIM Counter */
TIMx-&CR1 |= TIM_CR1_CEN;
/* Disable the TIM Counter */
TIMx-&CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));
当返回主程序的时候出错。不知道是为什么。
我是刚开始学习STM32F103R8T6,也是第一次接触STM单片机。希望版主、做过的朋友,帮我找找问题,看看怎么回事。十分感谢!
void TIM2_IRQHandler(void)
if(TIM_GetFlagStatus(TIM2,TIM_IT_Update)!=RESET)
// __NOP();
// GPIO_ResetBits(GPIOA,GPIO_Pin_8);
//GPIOA-&BRR
// __NOP();
GPIO_WriteBit(GPIOA,GPIO_Pin_8,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)));
//Clear the interrupt pending flag
// TIM_ClearFlag(TIM2, TIM_FLAG_Update);
// TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
TIM_ClearFlag(TIM2 , TIM_FLAG_Update);
TIM_ClearITPendingBit(TIM2 , TIM_IT_Update);
上面是我的定时器2的定时1S中断程序,但是根本就没有被执行。
& && && && &昨天下午测试的时候(之前已经发现问题出在定时器2上,使能之后就出硬件故障的错误),在下载仿真里,直接GO,发现程序还能运行一小会。
& && && && &网上查找资料,看CM3的权威指南,有以下几种说法:
& && && && &1,数组访问越界;
& && && && &2,非法硬件操作;
& && && && &解决方法有以下几种:
& && && && &A,断掉仿真器给目标板供电的;
& && && && &B,加大堆栈空间的;
& && && && &C,调整优先级的;
& && && && &D,添加.S启动文件;
& && && && &E,初始化之前,要先关闭全局总中断,初始化之后,再打开。
& && && && &要说明的是,我的仿真器是STM32F051的探索套件上自带的STLINK仿真器,没有给目标板供电,因此A不成立;
& && && && &加大堆栈空间我测试过了,没有效果,并且看RAM空间和.MAP文件,显示堆栈空间使用地址是0-4,没有超出范围;
& && && && &第三个,我的程序里面只有一个中断,没有优先级的问题冲突;
& && && && &第四个,我确实没有添加。s文件,但是我认为这个。s文件是自动调用的,理由是在不初始化定时器2时,其他的程序可以正常执行;
& && && && &第五个,这个有点可能,可能是我没有使能全局中断,但是这个还没找到在哪里,我再去查查看看。但是看库里自带的例程,里面同样没有打开全局中断这句话。所以说只是可能。
& && && && &补充一下,我仿真调试之后,在RAM的堆栈空间里面,看到要执行的语句地址是
& && && && &0x20000A74,里面是值也是这个值;这个地址附近有个值是0x;SR值为正常,但是LR却指向0xFFFFFFF1.
& && && && &补充:我的向量表在系统初始化里面,映射到了0xFLASH之后。
& && && && &请遇到过相同问题或由类似解决经验的大虾帮帮我这个初学者,十分感谢!
& && && && &
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp
在线时间0 小时
该用户从未签到主题帖子精华
新手上路, 积分 11, 距离下一级还需 39 积分
RE:STM32F103R8T6的定时器使用问题
下面还有一个485通信接收中断要处理,麻烦各位网友帮我看看。
站长推荐 /2
Tel: 3-8064
备案号: 苏ICP备号-2
|||意法半导体STM32/STM8技术社区
Powered byDescription: &&STM32F072 code! Friends come and rob!
File list:
实验八:TIM定时器(库函数)\drive\adc.c
实验八:TIM定时器(库函数)\drive\adc.h
实验八:TIM定时器(库函数)\drive\ascii.h
实验八:TIM定时器(库函数)\drive\dac.c
实验八:TIM定时器(库函数)\drive\dac.h
实验八:TIM定时器(库函数)\drive\exit.c
实验八:TIM定时器(库函数)\drive\exit.h
实验八:TIM定时器(库函数)\drive\ili9328.c
实验八:TIM定时器(库函数)\drive\ili9328.h
实验八:TIM定时器(库函数)\drive\key.c
实验八:TIM定时器(库函数)\drive\key.h
实验八:TIM定时器(库函数)\drive\led.c
实验八:TIM定时器(库函数)\drive\led.h
实验八:TIM定时器(库函数)\drive\systick.c
实验八:TIM定时器(库函数)\drive\systick.h
实验八:TIM定时器(库函数)\drive\time.c
实验八:TIM定时器(库函数)\drive\time.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_adc.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_cec.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_comp.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_crc.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_dac.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_dbgmcu.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_dma.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_exti.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_flash.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_gpio.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_i2c.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_iwdg.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_misc.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_pwr.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_rcc.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_rtc.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_spi.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_syscfg.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_tim.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_usart.h
实验八:TIM定时器(库函数)\lib\inc\stm32f0xx_wwdg.h
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_adc.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_cec.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_comp.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_crc.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_dac.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_dbgmcu.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_dma.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_exti.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_flash.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_gpio.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_i2c.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_iwdg.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_misc.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_pwr.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_rcc.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_rtc.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_spi.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_syscfg.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_tim.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_usart.c
实验八:TIM定时器(库函数)\lib\src\stm32f0xx_wwdg.c
实验八:TIM定时器(库函数)\stm32f0\stm32f0xx_conf.h
实验八:TIM定时器(库函数)\stm32f0\stm32f0xx_it.c
实验八:TIM定时器(库函数)\stm32f0\stm32f0xx_it.h
实验八:TIM定时器(库函数)\stm32f0\system_stm32f0xx.c
实验八:TIM定时器(库函数)\user\led.crf
实验八:TIM定时器(库函数)\user\led.d
实验八:TIM定时器(库函数)\user\led.o
实验八:TIM定时器(库函数)\user\main.c
实验八:TIM定时器(库函数)\user\main.crf
实验八:TIM定时器(库函数)\user\main.d
实验八:TIM定时器(库函数)\user\main.o
实验八:TIM定时器(库函数)\user\RTE\Device\STM32F030R8\startup_stm32f030.s
实验八:TIM定时器(库函数)\user\RTE\Device\STM32F030R8\startup_stm32f030x8.s
实验八:TIM定时器(库函数)\user\RTE\Device\STM32F030R8\system_stm32f0xx.c
实验八:TIM定时器(库函数)\user\RTE\Device\STM32F030R8\system_stm32f0xx.c.0000
实验八:TIM定时器(库函数)\user\RTE\Device\STM32F072R8\startup_stm32f072.s
实验八:TIM定时器(库函数)\user\RTE\Device\STM32F072R8\system_stm32f0xx.c
实验八:TIM定时器(库函数)\user\RTE\RTE_Components.h
实验八:TIM定时器(库函数)\user\startup_stm32f030x8.d
实验八:TIM定时器(库函数)\user\startup_stm32f030x8.lst
实验八:TIM定时器(库函数)\user\startup_stm32f030x8.o
实验八:TIM定时器(库函数)\user\stm32f0xx_exti.crf
实验八:TIM定时器(库函数)\user\stm32f0xx_exti.d
实验八:TIM定时器(库函数)\user\stm32f0xx_exti.o
实验八:TIM定时器(库函数)\user\stm32f0xx_gpio.crf
实验八:TIM定时器(库函数)\user\stm32f0xx_gpio.d
实验八:TIM定时器(库函数)\user\stm32f0xx_gpio.o
实验八:TIM定时器(库函数)\user\stm32f0xx_it.crf
实验八:TIM定时器(库函数)\user\stm32f0xx_it.d
实验八:TIM定时器(库函数)\user\stm32f0xx_it.o
实验八:TIM定时器(库函数)\user\stm32f0xx_misc.crf
实验八:TIM定时器(库函数)\user\stm32f0xx_misc.d
实验八:TIM定时器(库函数)\user\stm32f0xx_misc.o
实验八:TIM定时器(库函数)\user\stm32f0xx_rcc.crf
实验八:TIM定时器(库函数)\user\stm32f0xx_rcc.d
实验八:TIM定时器(库函数)\user\stm32f0xx_rcc.o
实验八:TIM定时器(库函数)\user\stm32f0xx_syscfg.crf
实验八:TIM定时器(库函数)\user\stm32f0xx_syscfg.d
实验八:TIM定时器(库函数)\user\stm32f0xx_syscfg.o
实验八:TIM定时器(库函数)\user\stm32f0xx_tim.crf
实验八:TIM定时器(库函数)\user\stm32f0xx_tim.d
Download users:
Relate files:
Favorite users:& 二、SMT32F030R8开发板初体验之-定时器使用
管理员:?????人数:6660小组积分:72164简介:欢迎进入STM32小组,学习讨论相关技术、交换资料、交流学习经验和设计心得。QQ群:小组公告福利:免费申请STM32F0308-DISCO开发套件(Discovery kit with STM32F030R8 MCU) 活动马上开始,只需2分钟即可申请。申请地址:??|????|??
需要确认注册邮箱后才能下载,
楼主??[原创]?
二、SMT32F030R8开发板初体验之-定时器使用
3年会员勋章目前未领取。领取条件:?凡是注册时间三年以上的活跃用户即可领取该勋章。
总积分:226分
发表于 21:05
? ? 前面第一讲给大家讲解了一些GPIO口的输出和串口操作,也是我的体验例程吧,这一讲给大家讲讲定时器的使用。大家都知道,任何一个单片机电路的最小系统都离不开时钟,因为时钟是整个系统能够有序的运转的必要条件。有了时钟,单片机才能一步一步的执行我们写的程序,定时器就是通过数时钟个数(我不知道对不对,我是这么理解的。),当我们数到一定个数的时钟时,我们所需要的定时时间就产生了。有了时间以后,那么我们就可以干很多事了。
? ? 例如:我们以前学51的时候,让一个500ms闪烁一次的做法是,P1_0 = 1;delay_ms(500);P1_0 = 1;这种做法的坏处就是delay_ms()函数是一个死循环,白白让费了CPU的宝贵资源,破坏了系统的实时性,如果程序刚好跑到500ms延时,这时按下按键的话,可能按键会不响应,大量使用死循环编写的程序会造成系统的反应迟钝。
? ? 那么,我们使用了定时器以后可以怎么操作呢?我们可以在定时器里面计数,当500ms到时,置位某个标志位为1,我们在主循环里面不停的查询该标志位是否为1,诺为1,则翻转IO口状态,并把标志位清0,这样就可以实现LED灯500ms闪烁一次,并且由于是定时器中断控制的LED灯,因此不会使系统卡死。如下代码:
if(SystemTimeF.Sys500msF)//判断500ms标志位是否为1
SystemTimeF.Sys500msF = 0;//为1则清零标志位
time_500ms_cnt++;//500ms加一次该变量
if(time_500ms_cnt == 1)//如果为1,则点亮LED灯
LED3_ON();
LED4_ON();
else if(time_500ms_cnt == 2)//如果为2,则熄灭LED灯,并将计数变量清0
LED3_OFF();
LED4_OFF();
time_500ms_cnt = 0;
总之,有了定时器,产生了各个时间的标志位,我们就可以精确的控制每一时刻我们要做什么工作,控制外围设备怎么运转。下面说下定时器的简单配置,还是以清风的开源资料及代码讲讲吧,资料我会上传,代码我复制出来讲下,这段初始化的代码是移植正点原子战舰STM32开发板的配套例程里面的代码,可以看到,虽然STM32F1和STM32F0是不同的内核,但是还是可以参考的。业内做开发板的,我想资料做的做好并且完全开源的,非原子大哥莫属了,建议大家没事可以多上开源电子论坛转转。好了,不废话了。请看代码:
/*******************************************************************************
?* 名称: void TIM3_Int_Init(u16 arr,u16 psc)
?* 功能: 定时器3初始化函数
?* 形参: arr:重装载值,
? ? ? ? ?psc:预分频值
?* 返回: 无
?* 说明: 定时时间为(psc/系统时钟 )*(arr + 1)
?******************************************************************************/
void TIM3_Int_Init(u16 arr,u16 psc)
NVIC_InitTypeDef NVIC_InitS//声明中断配置的结构体
TIM_TimeBaseInitTypeDef ?TIM_TimeBaseS//声明定时器配置的结构体
/* TIM3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//首先使能TIM3时钟
//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; ?//TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
/* ?TIM3 中断嵌套设计*/
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE); ?//使能TIMx
以上代码就将TIM3初始化完了,并且使能了定时器3的中断,从而可以在定时器中断里面干很多事了。调用:TIM3_Int_Init(4,4799);//99+1)=10Khz的计数频率,计数到5为500us?
定时器中断函数如下:
//定时器3中断服务程序
void TIM3_IRQHandler(void)?? //TIM3中断
?? if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)? //检查TIM3更新中断发生与否
????? TIM_ClearITPendingBit(TIM3, TIM_IT_Update? );? //清除TIMx更新中断标志
????? SystemTimeF.Sys500usF = 1;//500us到标志
????? SystemTime.Sys2msCnt++;
????? if(SystemTime.Sys2msCnt == 4)//加4次为2ms
???????? SystemTime.Sys2msCnt = 0;
???????? SystemTimeF.Sys2msF = 1; //2ms到标志
???????? SystemTime.Sys10msCnt++;
???????? if(SystemTime.Sys10msCnt == 5)
???????? {
??????????? SystemTime.Sys10msCnt = 0;
??????????? SystemTimeF.Sys10msF = 1; //10ms到标志
??????????? SystemTime.Sys100msCnt++;
??????????? if(SystemTime.Sys100msCnt == 10)
??????????? {
??????????????? SystemTime.Sys100msCnt = 0;
??????????????? SystemTimeF.Sys100msF = 1; //100ms到标志
??????????????? SystemTime.Sys500msCnt++;
??????????????? if(SystemTime.Sys500msCnt == 5)
??????????????? {
?????????????????? SystemTime.Sys500msCnt = 0;
?????????????????? SystemTimeF.Sys500msF = 1; //500ms到标志
?????????????????? SystemTime.Sys1sCnt++;
?????????????????? if(SystemTime.Sys1sCnt == 2)
?????????????????? {
????????????????????? SystemTime.Sys1sCnt = 0;
????????????????????? SystemTimeF.Sys1sF = 1; //1s到标志
?????????????????? }
??????????????? }
??????????? }
???????? }
主函数如下:
int main(void)
?? System_Init();
?? system_source = RCC_GetSYSCLKSource();
?? RCC_GetClocksFreq(&System_Freq);
?? while (1)
????? if(SystemTimeF.Sys500usF)//定时器3中断中产生500us到标志,用来处理500us任务
???????? SystemTimeF.Sys500usF = 0;//处理完后清500us标志
????? if(SystemTimeF.Sys2msF)
???????? SystemTimeF.Sys2msF = 0;
????? if(SystemTimeF.Sys10msF)
???????? SystemTimeF.Sys10msF = 0;
????? if(SystemTimeF.Sys100msF)
???????? SystemTimeF.Sys100msF = 0;
????? if(SystemTimeF.Sys500msF)
???????? SystemTimeF.Sys500msF = 0;
???????? time_500ms_cnt++;
???????? if(time_500ms_cnt == 1)
???????? {
??????????? LED3_ON();
???????? ?? LED4_ON();
???????? }
???????? else if(time_500ms_cnt == 2)
???????? {
??????????? LED3_OFF();
??????????? LED4_OFF();
???????????
??????????? time_500ms_cnt = 0;
???????? }
????? if(SystemTimeF.Sys1sF)
???????? SystemTimeF.Sys1sF = 0;
可以看到,我的主函数是不停的在查询定时器里面相应时间标志是否为1,诺为1,则说明相应的时间到,可以处理该时刻需要做的事。例如,我要在开机3s后关机,则可以这样做:声明一个变量和一个标志位,在1s到标志里,判断开机标志,如果开机标志为1,则变量自加;判断变量为3以后,调用关机函数。这样,任何事情都可以这样做。不知道大家有没有看明白,具体看源代码吧,今天就讲这么多了。很少写文章,写的比较乱,想到什么就写什么,下一个例程准备给大家讲讲按键。
?2 timer.zip( 4MB ) ?该附件被下载次数 ?17?第七节:通用定时器time.pdf( 430KB ) ?该附件被下载次数 ?5
--- 现有 1个主题,共 1页,目前第 1页 ---??
点击,立即回复。
EDN China官方微信
扫一扫关注,获取电子新知,设计灵感
IC厂商小组
在线研讨会
赞助商链接
2016 EDN China -- Use of this website is subject to its terms of use.
京ICP备号-4 |
京公网安备37 |
新版社区已上线,旧版论坛、博客将停用
1、为防数据丢失,旧版论坛、博客不再接受发帖;
2、老用户只需重设密码,即可直接登录新平台;
3、新版博客将于8月底完美归来,敬请期待;
4、全新论坛、问答,体验升级、手机阅读更方便。

我要回帖

更多关于 stm32f030 定时器例程 的文章

 

随机推荐