今天跟大家分享一个STM32应用开发过程中操作CCR寄存器遇到的小案例,是关于STM32定时器中的捕获寄存器清零的问题。
有人用STM32做输入捕获,在捕获的回调函数里先将捕捉到的CCR值放入缓冲区,然后打算将CCR寄存器清零。结果发现根本清不了。相关代码如下【基于STM32cube库】:
voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM4)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
ccr_cur =__HAL_TIM_GET_COMPARE(&htim4, TIM_CHANNEL_1); //【1】
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_1,0); //欲清零CCR1 【2】
dbug_data = __HAL_TIM_GET_COMPARE(&htim4,TIM_CHANNEL_1); // 【3】
//再次读取的值仍然为ccr_cur的值
上面代码第【1】句将捕获到的CCR值放入CCR_CUR变量。
代码第【2】句意图将TIM4_CCR1清零;第【3】句意欲从TIM4_CCR1读取数据到dbug_data.
最后发现,做过ccr清零操作后再来读取CCR的值时发现还是清零操作之前的数据。
从代码上看并无什么问题。再看看CCR寄存器定义:
从定义上看,CCR寄存器可读可写,作为输入捕捉时CCR的值为最近一次捕捉到的计数器的值。咋看之下似乎也没什么问题。难道库代码有问题?
尝试将库调用直接改为对寄存器的操作,结果还是一样。那问题出在哪里呢?上面那句关于作为通道作为输入时的描述似乎有点意犹未尽的味道。
再继续细看关于输入捕捉的章节,看到一段关键性的语句:
上面红线上面的那句话彻底说明白了,当某定时器通道配置为输入捕获时,该通道的CCR寄存器变为只读,只能在发生捕获时硬件装载修改。到这里,问题也算有个了结。对于这个问题,如果手册看得不到位,就有点麻烦。在碰到类似问题时,有针对性地对相关手册章节仔细研读下或许可以柳暗花明。
关键字:STM32 定时器 CCR清零
引用地址:
一个关于STM32定时器的CCR清零话题
推荐阅读最新更新时间:2024-03-16 15:33
STM32学习总结之不同文件的作用
学习内容: startup_stm32f10x_hd.s 启动文件。 system_stm32f10x.c 这个文件的作用是里面实现了各种常用的系统时钟设置函数,有72M,56M,48M,36M,24M,8M,我们使用的是是把系统时钟设置成72M。 Stm32f10x.h 1、处理器外设寄存器的结构体定义。2、处理器外设的内存映射。3、处理器外设寄存器的位定义。一个寄存器有很多个位,每个位写1 或者写0 的功能都是不一样的,处理器外设寄存器的位定义就是把外设的每个寄存器的每一个位写1 的16 进制数定义成一个宏,宏名即用该位的名称表示。 无论是寄存器编程还是固件库编程,都必须包含这个头文件,有关外设寄存器的说明 都在这里面。
[单片机]
stm32 Ctext-M3内核最简单的多任务RTOS
RTOS 实时操作系统,我做的是一个多任务的操作系统,可以同时运行多个任务,我这里设置的最大任务数是32个, 估计跑30多个任务的嵌入式设备很少吧,32个任务够用了。 OS我把它叫做HesOS,主要功能如下,比较简单。 1--实现多任务调度 2--实现任务调度锁 3--实现临界区保护 4--实现读取cpu使用率(这个功能比较重要的) 5--实现us延时(用于模拟如IIC总线模拟) 对于一般的嵌入式应用有这些功能,差不多够用了。 移植HesOS也非常简单,不会像其它的OS一样比较庞大,修改的地方也比较多,使用起来也复杂。 HesOS不管是移植和使用都是非常简单的,类似于PC的线程使用。 主
[单片机]
STM32开发笔记97: C++语言命名规范
单片机型号:STM32F091RCT6 在此文章中记录C++语言的命名规范。 1、文件名均采用小写英文字母方式实现,多个英文单词之间用“_ 予以分割; 2、宏定义均采用大写英文字母方式实现,多个英文单词之间用“_ 予以分割; 3、自定义数据类型均小写英文字母方式实现,多个英文单词之间用“_ 予以分割; 4、类名首字母用C表示,后续采用匈牙利命名法,首字母大写,如遇英文缩写单词,则按照英文命名规范进行拼写,例如LED为缩写单词,但是英文规范可以写作led或Led,则类名用CLed表示,而HAL是硬件映射层的缩写,英文用全大写表示,使用时,则使用CHAL命名; 5、用类声明的类对象,去除首字母C即可,例如CLe
[单片机]
【STM32电机矢量控制】记录13——EXTI外部中断
STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。 STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18: 线0~15:对应外部 IO口的输入中断。 线16:连接到 PVD 输出。 线17:连接到 RTC 闹钟事件。 线18:连接到 USB 唤醒事件。 触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。 外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,P
[单片机]
stm32读取DS2411
DS2411的读写时序和DS18B20一致,毕竟同一个公司出的。 下面是代码 源文件 ds2411.c #include ds2411.h #include delay.h #include usart.h // // //复位DS2411 void DS2411_Rst(void) { DS2411_IO_OUT(); //SET PA11 OUTPUT DS2411_DQ_OUT=0; //拉低DQ delay_us(750); //拉低750us DS2411_DQ_OUT=1; //DQ=1 delay_us(15); //15US } //等待D
[单片机]
限量7折!米尔STM32MP135开发板
说到 MCU 就会想到 S MT32, 而 STM32MP1 作为新一代 MPU 的典范,有着极富开创意义的异构系统架构,兼容 MPU 和 MCU 的 双重优势,入门级、性价比高、能跑 L inux 系统、应用场景丰富 等 特点,深 受业界的喜爱! 米尔电子作为 ST 官方合作伙伴,先后开发了 S TM32MP151 、 S TM32MP157 、 STM32MP13 5 系列核心板和开发板,受到广大客户的认可。 米尔为了感谢广大客户的支持,推出 STM32MP1 35 开发板打折特惠活动! 米尔基于 STM32MP1 35 开发板 限 量 7 折! 7 折!
[嵌入式]
stm32 IAP + APP ==>双剑合一
(扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级程序做了详细的分析http://blog.csdn.net/yx_l128125/article/details/12992773,考虑到出厂时要先烧写IAP 再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP == 双剑合一”链接稍后发,希望通过IAP程序的hex 文件 和 APP的hex文件 合成一个hex 或者把合成的hex文件转成.bin 文件 减少“体力”) 一、简单框架介绍 (简单回顾上篇博文《IAP在线 升级详解》http://blog.csdn.net/yx_l128125/article/deta
[单片机]
基于STM32 MCU应用的EMC指南之软件篇
在基于微控制器的电子系统中,强壮的软件设计是提高 EMC 性能的主要因素。必须尽量在项目设计阶段的早期考虑 EMC 干扰导致的问题。EMC 导向的软件提高了应用的安全性和可靠性。强化 EMC 性能的软件的实施成本低,可提高最终的抗扰性能,并节约硬件和开发成本。用户应考虑到模拟或数字数据受到的 EMC 干扰,就像任何其它应用参数一样。 EMC 干扰导致的问题示例: 微控制器无响应 程序计数器失控 执行意外指令 地址指向错误 子程序执行错误 寄生复位和 / 或寄生中断 IP 配置损坏 I/O 失灵 软件故障的后果示例: 产品意外响应 上下文丢失 进程中的意外分支 中断丢失 数据完整性缺失 输入值误读 01使用看门狗或时间控制 为了
[单片机]