STMCU小助手
发布时间:2023-2-26 18:41
|
本文适用于STM32F103最小系统板,其他的STM32系列也大同小异。话不多说,直接上代码% ^8 {2 o* l2 P( _: b: O 先写time.h文件7 J- o. i$ b9 {+ U) H% J: j k% J7 x. g5 v, X+ M7 \ #ifndef __TIMER_H, Z; K+ m# X/ i' o #define __TIMER_H' Q1 R8 L* X. k; z+ b #include "sys.h"! ~: ^. f! O% f1 o! V- k ( Z2 W8 o" }8 A" Q8 ?3 c2 B' W, b void TIM3_ETR(u16 arr,u16 psc); #endif 我是用TIM3的ETR功能的引脚PD2,其他也是一样的。7 w' p) a0 r! p9 H4 _5 e" y7 Q ' O) p0 x1 c/ o0 Y 再写timer.c; V2 K3 q2 l/ m $ w3 A! G* ~: `: n/ D. ` 4 |1 o5 i6 S0 r* `9 o #include "timer.h" #include "led.h" #include "usart.h" & G0 H& y; l1 Y: F1 F ) j: b+ i3 Y6 c //定时器3外部输入脉冲计数ETR配置3 S' B5 b4 Z* a2 K$ l1 n/ A% H" a! G ( \$ I7 E) N5 l; H / k3 l& i2 Z# S5 ^4 R0 b void TIM3_ETR(u16 arr,u16 psc)0 u# Q8 N8 s; a' i& y( v7 z7 Z$ v# Z { GPIO_InitTypeDef GPIO_InitStructure;5 @6 a# q2 w! z6 ~ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure;, v) e v2 d" ]6 P M% O $ ~ w/ ~% z3 }2 q RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); - m. ^; y* {9 v0 K, n) ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); + n/ ^' ?% _1 h1 K0 f GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 7 W% O0 y8 ]2 o: h# X% _ GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_ResetBits(GPIOD,GPIO_Pin_2); , n5 P: ^" w" {) G Z //初始化定时器 TIM3 ; j! H: \7 B8 I6 L5 A/ Y" T TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器 - D5 C- C$ ~9 n TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;8 X& }5 E* ~2 x3 |8 V4 |' ?4 l TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位& l- u; }) N1 q: M+ G % s. F. q: I! y1 r6 }: [' Y; w2 ^ //中断分组初始化 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断6 T% y d9 g! F( l5 k2 \ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级" w& J6 t* ]# R NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能3 h1 E5 f; b* N6 d5 w \ NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 - ~2 P, e& X6 e. Q; H* ] TIM_ITRxExternalClockConfig(TIM3,TIM_TS_ETRF);7 {8 q- K+ g/ b% x0 ^ TIM_ETRClockMode2Config(TIM3,TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted,0x00);6 T& `4 z8 a- ?1 d! p: V" U: x8 ]4 f TIM_SetCounter(TIM3, 0); . C& b& Q: W. X% a2 F: T# Z& D: f' B TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断 TIM_Cmd(TIM3,ENABLE ); } ) d, T7 I d7 d( c) q6 }7 F, u% ^8 r , `. i+ g' O+ u; t) { //定时器3中断服务程序 8 i' L4 n3 u. C% _* N7 T( K* W void TIM3_IRQHandler(void)+ E, q9 F4 U# v9 l% A { * C9 |7 S U; I6 v: x if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //获取中断状态 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); LED0=!LED0; + B) n5 J/ e- W1 Q( I } } 0 z; w: {, @1 Z3 ]% S 最后写main.c( G7 L' S( U0 L5 B8 A$ L$ L2 ^ 3 ?3 w: y I7 A0 [ 0 i& x: H" j* m7 s; I8 R9 o #include "led.h" #include "delay.h"% h L0 ]. p. y& E) e #include "key.h" #include "sys.h" #include "usart.h"! Q0 g* ]: Q+ k #include "timer.h"# V: u7 D1 o D5 s+ }$ d m3 ~/ w: H( c0 Y x( r% p$ x int main(void)0 j! ^6 P9 M; Z; t8 o5 h# [' s) E { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(); //初始化延时函数) C5 i! ?8 L! @0 Q( b uart_init(115200); //初始化串口波特率为115200 KEY_Init(); //初始化与按键连接的硬件接口 LED_Init(); //初始化LED端口 TIM3_ETR(1000,0); while(1)* B3 v: L3 z; J {printf("Count=%d\n",TIM_GetCounter(TIM3));8 J2 i' y2 M! Q. }! p LED1=!LED1;} } 8 F& x; C& w; I1 X 观察到的现象是:当给PD2输入脉冲时,在串口上打印出脉冲数目,每满1000次,LED0闪烁。可更改中断服务函数实现所需功能。: p; ?: V! o D7 Y: V8 F ———————————————— 版权声明:李隆晨; b9 k8 ^" C* z& _8 e ' |5 y6 w& N% n# R$ | |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版