STMCU小助手
发布时间:2023-2-26 18:41
|
本文适用于STM32F103最小系统板,其他的STM32系列也大同小异。话不多说,直接上代码 4 P0 h# {5 E4 R. J9 } x 先写time.h文件 ! P# m. j2 O9 \: f: L #ifndef __TIMER_H+ |% r$ g Q6 L9 j1 c #define __TIMER_H #include "sys.h" void TIM3_ETR(u16 arr,u16 psc);) H# b4 J0 Y2 m/ Q& h$ j #endif ( ^: w. E1 e1 ^0 a0 u 我是用TIM3的ETR功能的引脚PD2,其他也是一样的。 - q: s# n& ~' I' \ % z( T7 X2 K& R 再写timer.c, s; L \0 r, |, ^ [, n$ q6 V " z5 E: V) r) a #include "timer.h"1 k- G$ \6 ~- G4 n) l j2 x #include "led.h" #include "usart.h". z/ k7 D3 @0 v7 d1 i' Q & M9 }/ Z- B- V * U) M; t# h- w9 i3 L 0 Q# e5 d# i9 M. j //定时器3外部输入脉冲计数ETR配置 # b% R2 K9 o3 G void TIM3_ETR(u16 arr,u16 psc)! `' d8 e; F. F v7 @ { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;/ A+ n; q( [! B5 g! r0 U6 B NVIC_InitTypeDef NVIC_InitStructure;# H; ^3 e( \* y* N( m7 @ ( k% Z/ ]4 C: p$ C RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 4 Z. Y) T0 u. w3 z9 P RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; / M0 v& O5 g1 r; @4 d+ r' |1 m- t GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_ResetBits(GPIOD,GPIO_Pin_2); % ]8 W# j4 ?# ~5 N* Z $ l; P- ]2 s- p8 X0 P //初始化定时器 TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值 [/ C% @( s0 G! s0 Z9 D TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器 5 K5 D" Q, w9 q' P Z TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;9 U. I$ a' ]) h! {! z" R. Q TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式7 ~7 f+ Y2 I6 p \* \ TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //中断分组初始化 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断. h, E% l8 q# B5 L% W6 } NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级2级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级0级: K) \, H* G( |6 m NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 4 y4 W. A8 ?) }2 x ) `. Y, L4 Z# a& t5 j& e TIM_ITRxExternalClockConfig(TIM3,TIM_TS_ETRF); TIM_ETRClockMode2Config(TIM3,TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_Inverted,0x00);+ d$ R9 V ^+ E, b+ e TIM_SetCounter(TIM3, 0); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//允许更新中断 * F& D0 ~. z( i9 h) ~ TIM_Cmd(TIM3,ENABLE ); }: \8 B2 V3 J: E& H 1 j6 G6 e: \1 D, s8 Q( J! o " C' |4 X. E* w2 w' M . h) ^$ P$ `8 e! q //定时器3中断服务程序 void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //获取中断状态( u" ^( O- M9 s { TIM_ClearITPendingBit(TIM3, TIM_IT_Update);. ^ W4 j3 Z4 h) h" ^7 D LED0=!LED0; " g3 t+ z* j7 ?: x% [ } } & Q, b; x" b7 X& C# G5 ]! R - Y; X" k1 i" H, n 5 h+ k. H/ s1 z' q7 N& M 最后写main.c$ x! h# D! s7 Z7 } #include "led.h". ]( L3 _$ @# K% g0 F. N #include "delay.h", u) u" F k9 @. ^, F$ q9 H( Q# c6 i: c #include "key.h"0 e$ E: Q: P1 A) y #include "sys.h" #include "usart.h"' t/ j! B4 k4 e& O$ `2 ~ #include "timer.h"# L9 v2 w5 r; x4 h, H, S# h & Y& r M' b1 l; N' U4 W0 C* j 6 { U } m% Z2 l0 C( t int main(void)) _" w" U, f$ w, \9 i: i+ \) @% S { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2% q6 G( G) T6 R* ~ delay_init(); //初始化延时函数2 L: x9 D$ i1 Y6 {' w' U uart_init(115200); //初始化串口波特率为115200 KEY_Init(); //初始化与按键连接的硬件接口' d7 n, X, o/ W5 T+ _ LED_Init(); //初始化LED端口 TIM3_ETR(1000,0); ( ^- t8 ?% A( u$ L/ m8 m( W ) _& J$ r# s% G% k0 ?/ G1 T while(1) {printf("Count=%d\n",TIM_GetCounter(TIM3));$ M7 J; ] W7 z0 ` LED1=!LED1;} } % ] U; Y4 U9 }; A# ~7 ~ 观察到的现象是:当给PD2输入脉冲时,在串口上打印出脉冲数目,每满1000次,LED0闪烁。可更改中断服务函数实现所需功能。/ ?# Y# d2 H& ?# V/ u ———————————————— 版权声明:李隆晨 1 p5 X' m R6 p0 @7 ~ |
【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 功能的使用
微信公众号
手机版