Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
定时器
国民技术_N32G45x
N32G45x 定时器外部时钟输入ETR的使用
发布于 2022-03-31 09:36:00 浏览:1120
订阅该版
[tocm] ### N32G45x 定时器外部时钟输入ETR的使用 目前官方提供的代码只有定时器模式,没有计数器模式,这里就搞一下计数器模式。以下代码已在N32G455REL7上测试通过。 计数器,用来接收脉冲信号再合适不过了,省得搞一堆中断,浪费CPU时间。图片上传不了啦,在文档231页。 ``` **外部时钟源模式2** 选定此模式的方法是设置 TIMx_SMCTRL 寄存器中的 EXCEN=1(设置 TIMx_SMCTRL 寄存器中的SMSEL=111,同时设置 TSEL=111 有相同效果)。计数器能够在外部触发 ETR 的每一个上升沿或下降沿计数。 例如,要配置在 ETR 下每 2 个上升沿计数一次的向上计数器,使用下列步骤: 本例中不需要滤波器,置TIMx_SMCTRL寄存器中的EXTF[3:0]=0000 设置预分频器,置TIMx_SMCTRL寄存器中的EXTPS[1:0]=01 设置在ETR的上升沿检测,置TIMx_SMCTRL寄存器中的EXTP=0 开启外部时钟模式2,置TIMx_SMCTRL寄存器中的EXCEN=1 启动计数器,置TIMx_CTRL1寄存器中的CNTEN=1 计数器在每 2 个 ETR 上升沿计数一次。在 ETR 的上升沿和计数器实际时钟之间的延时取决于在 ETRP 信号端的重新同步电路。 ``` 以上是官方的文档的描述,这里主要是要设置TIMx_SMCTRL和TIMx_CTRL1。 ``` //TIM8初始化代码,ETR=PA0 static inline void rt_counter_init(void) { TIM_TimeBaseInitType TIM_TimeBaseStructure = {0}; GPIO_InitType GPIO_InitCtlStruct; TIM_DeInit(TIM8); RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE); GPIO_InitStruct(&GPIO_InitCtlStruct); GPIO_InitCtlStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitCtlStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitCtlStruct.Pin = GPIO_PIN_0; GPIO_InitPeripheral(GPIOA, &GPIO_InitCtlStruct); RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM8, ENABLE); /* Time base configuration */ TIM_TimeBaseStructure.Period = 65535; TIM_TimeBaseStructure.Prescaler = 0; TIM_TimeBaseStructure.ClkDiv = 0; TIM_TimeBaseStructure.CntMode = TIM_CNT_MODE_UP; TIM_InitTimeBase(TIM8, &TIM_TimeBaseStructure); TIM_ConfigExtClkMode2(TIM8, TIM_EXT_TRG_PSC_OFF, TIM_EXT_TRIG_POLARITY_NONINVERTED, 0); TIM_SetCnt(TIM8, 0); TIM_Enable(TIM8, ENABLE); } ``` 读取计数器的值,直接使用TIM_GetCnt(TIM8); 实际使用过程中,为了减少计算,添加两个函数,对开启和关闭进行控制,直接读就可以了,但要小心计数器的溢出问题,由于本人使用场景,不可能溢出,所以这里的代码就很简单了。 ``` static uint16_t tim8_cnt = 0; void rt_counter_open(void) { TIM_SetCnt(TIM8, 0); TIM_Enable(TIM8, ENABLE); } void rt_counter_close(void) { tim8_cnt = TIM_GetCnt(TIM8); TIM_Enable(TIM8, DISABLE); } uint16_t rt_counter_read(void) { return tim8_cnt ; } ```
2
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
wlof
这个家伙不懒,什么也没写
文章
16
回答
64
被采纳
0
关注TA
发私信
相关文章
1
定时器中要延时,用什么办法?
2
cubemx配置定时器PWM可以输出移到RT_stdio不能输出?
3
对源码中优先级处理和定时器的两个疑问?
4
关于定时器时钟,怎么定时一个1MHz时钟
5
rt_spi_send、rt_spi_recv不能放在定时器里进行使用
6
关闭定时器中断,再开启中断
7
关于在L4潘多拉上定时器TIM3跑hwtimer_sample例程出错的问题
8
rtthread studio里定时器倍频问题
9
rt-thread-studio开发潘多拉的定时器出现问题?
10
多个软件定时器之间会不会冲突
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
中断
编译报错
Debug
SFUD
rt_mq_消息队列_msg_queue
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
10
个答案
1
次被采纳
踩姑娘的小蘑菇
4
个答案
1
次被采纳
红枫
4
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
Ryan_CW
4
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
YZRD
2
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部