刚学STM8,把如何解决调试过程中出现的问题记录下来。
芯片采用的是STM8S103F3P6,准备做一个刷卡模块,其中delay函数是用tim2定时器实现的。在网上下的例程,delay函数的单位是1ms,我觉得间隔时间有点长了,准备改成10us,使用HSE外部晶振8MHz,8分频,计10个数产生更新中断。再做一个ms的延时函数,100个10us延时函数实现。
问题现象:
在运行的过程中,发现timer2初始化,打开中断函数enableinterrupts后,程序无法跳出。
问题分析步骤:
1.我先进行了调试,发现程序在tim2的中断服务函数里无法跳出,一开始我认为可能是清除中断标志位的代码没有执行,或是清除中断标志位应该放在进入中断服务函数之后就立即执行,把代码移到中断服务函数中第一句,再运行,还是不行;
2.打开寄存器显示窗口,对照着stm8s的中文手册,找到tim2的寄存器相关内容,单步调试,发现TIM2->SR1的清除中断位有被置0,但是隔几步就又会被置1,我先分析可能是某一处代码的问题,但是重新开始了四五次,发现置1的时机是不固定的。这时我才注意到CNTRL这个寄存器,好像是每次都是在这个寄存器的值变成0x09之后SR1置1的。这才反应过来,可能是tim2的中断服务函数在处理的过程中,又有一个更新中断进来,把SR1的更新中断位重新置1,也就是说我的tim2的定时时间过短。
问题解决:
在延长了定时器的更新时间(100us)后,问题解决了。
总结:
在调试的过程中,发现了查看寄存器的威力,这是一种能够更快解决问题的方法。之前使用stm32的时候由于网上资源丰富,基本上哪种问题都能搜索到,一开始上手也是学的库函数版本,所以对寄存器调试使用不多,多是用watch窗口看变量值的方法。但是stm8网上资源较少,更多还需要自己动手,这才体现出查看寄存器值的优势。从发现问题到解决问题一共用时三小时左右。
关键字:STM8 TIM2 中断
引用地址:
STM8无法跳出TIM2更新中断
推荐阅读最新更新时间:2024-11-04 17:02
S3C2440裸机------异常与中断__swi异常模示程序示例
一般来说,我们的app运行于用户模式,用户模式是一种受限的模式,不能访问硬件,如果app想访问硬件,必须切换模式,当发生中断或者异常时会自动切换模式,但是中断和异常时可遇不可求的,这时候我们通过软中断切换模式。 1.start.S 由于复位之后cpu处于svc管理模式,所以我们先修改cpsr让cpu处于用户模式,然后设置用户模式下的栈。 .text .global _start _start: b reset /* vector 0 : reset */ ldr pc, und_addr /* vector 4 : und */ ldr pc, swi_addr /* vector 8 :
[单片机]
STM32系统学习——EXTI(外部中断)
一、 EXTI 简介 EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 二、 EXTI 功能框图 EXTI 的功能框图包含了 EXTI 最核心内容,掌握了功能框图,对 EXTI 就有一个整体的把握,在编程时思路就非常清晰。EXTI功能框图见图。 在图可以看到很多在信号线上打一个斜杠并标注“20”字样,这个表示在控制器内部类似的信号线路有 20 个,这
[单片机]
N76E003双串口中断配置、问题及解决方法
更正 发现造成该原因是由于TI/RI只要进入中断,就会一起打开造成,针对此情况需要在中断服务函数中将其置低,否则中断响应将一直存在。建议在串口中断中除了对RI进行置低外,还对TI进行置低(代码已修改)。此外我两年前测试时在接收中断中使用的send_data_to_uart1()函数,其会在发送前先将TI置低,后发送完成后会硬件置低,也可能是因为此原因,导致中断能顺利运行。 再次对找到原因的大佬表示感谢,也对那些曾被我误导的同学道歉。 原回答 最近在调试N76E003串口0,串口1中断时,发现当串口0开启中断后,串口1中断无法正常工作,下面详细说说自己的办法。(我的问题原因是中断优先级造成的,取消串口1中断优先级即可解决)
[单片机]
STM32 UART2 中断函数的写法
void USART2_IRQHandler(void) { uchar tmp; //接收中断 if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET) // 接收 中断 { USART_ClearITPendingBit(USART2,USART_IT_RXNE); // U1RX_Clear_Intr_Status_Bit; tmp=USART_ReceiveData(USART2); } //USART_IT_TXE // 发送中断 if( USART_GetITStatus(USART2, USART_IT_TXE) == SET ) //一个是TXE=发送数据寄存器空, {
[单片机]
USB2.0接口IP核的开发与设计
随着PC机和外围设备的发展,传统的并行接口和串行接口RS-232在易用性(即插即用) 和端口扩展等方面存在着一定的缺陷,这就使之越来越成为通信的瓶颈,因此通用串行总线(universal serial bus,USB)接口也就应运而生。1994年Compaq,IBM,Intel,Microsoft ,NEC 等公司共同提出了USB 协议规范,1996 年制定出了比较成熟的USB 1.1协议标准,最高传输速度为12Mbps。随着通信的发展,其速度明显不能满足需求,因此2000年提出了USB 2.0标准,增加了高速模式,使传输速度提高了40倍,达到了480 Mbps.凭借价格低廉、使用简单、协议灵活,接口标准化和易于端口扩展等优点,US
[应用]
STM8S105S4_PKT学习笔记(2) 外部中断
button-- PD7 Led -- PD0 main.c: /* MAIN.C file * * Copyright (c) 2002-2005 STMicroelectronics */ #include stm8s207s6.h void Clock_Init(void) { CLK_SWCR |= 0x02;//使能切换机制 CLK_ECKR |= 0x01;//外部晶振使能 while(!(CLK_ECKR & 0x02));//等待HSE准备就绪 CLK_SWR = 0xB4;//选择HSE为主时钟 CLK_CSSR |= 0x01;//时钟安全系统使能 } void Gpio_I
[单片机]
STM8 定时器TIM1 计时
ST公司的STM8单片机的TIM1定时器,是一个16位高级控制定时器,可用于实现基本的定时,PWM波的产生,这里主要分析下基本的计时功能。 我们先看ST提供的库函数中TIM1定时器的初始化函数 void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler, TIM1_CounterMode_TypeDef TIM1_CounterMode, uint16_t TIM1_Period, uint8_t TIM1_RepetitionCounter) 其中,TIM1_Prescaler是一个16位的分频配置,可输入值为0
[单片机]
STM32F USB中断分析
有时候总在想,怎么样的学习才是最好的?就像学习USB,到底只要学到会应用就可以了,还是要深入到协议内容和驱动底层呢?经常对别人说自己会某某东西,其实自己也只是一知半解的,只会些应用去糊弄别人。于是总在安慰自己:我只要会做些应用就可以了!!! 下面介绍STM32 USB工程的usb_endp.c文件和usb_istr.c两个文件。 首先是usb_endp.c,这个文件很简单,就是定义了结果几个端点输入输出函数,我的工程只有。 uint8_t USB_Receive_Buffer ; //端点接收数据的缓存 REPORT_COUNT=64 uint8_t USB_Send_Buffer ; //端点发送数据的缓存 volatile
[单片机]