在 stm8s 的 main.c 中使用 tim2 ovf isr

问题描述

嗨,我想使用 tim2 来制作与外部中断 0 (EXTI0) 触发相关的延迟脉冲 我在 stm8_interrupt_vector.c 中编写了代码(它产生脉冲,但不是我需要的时间)。 问题:当我在 main.c 中复制和粘贴代码时,代码不起作用并且计时器 2 中断 isr 不运行 代码在这里: 问题:如何在计时器 2 溢出 isr 中使用全局变量

/*----------------------------stm8_interrupts_vector--------------------------*/

#include "stm8s_it.h"    

char inde=0;    

void EXTI0_IRQHandler(void)
{
TIM2_ClearFlag(TIM2_FLAG_UPDATE);
TIM2->PSCR = 0x1;
TIM2->ARRH = 0x0;//TIM2->CNTRH = 0x0;0x1308
TIM2->ARRL = 0x0f;//TIM2->CNTRL = 0x0;
inde=0;
TIM2_Cmd(ENABLE);

}
void TIM2_OVF_IRQHandler(void)//TIM2_UPD_IRQHandler
{
GPIO_WriteReverse(GPIOB,GPIO_PIN_5);
TIM2_ClearFlag(TIM2_FLAG_UPDATE);
inde++;
if(inde==5)
{
 GPIO_WriteHigh(GPIOB,GPIO_PIN_5);
 TIM2->PSCR = 0x1;
 TIM2->ARRH = 0x0;//TIM2->CNTRH = 0x0;
 TIM2->ARRL = 0xf0;//TIM2->CNTRL = 0x0;
 goto down;
}
if(inde==6)
{
    GPIO_WriteLow(GPIOB,GPIO_PIN_5);
    TIM2_Cmd(disABLE);
    goto down;
}
down:;
TIM2_Cmd(disABLE);
}
typedef void @far (*interrupt_handler_t)(void);

struct interrupt_vector {
unsigned char interrupt_instruction;
interrupt_handler_t interrupt_handler;
};


extern void _stext();     // startup routine 
extern void EXTI0_IRQHandler(void);
extern void TIM2_OVF_IRQHandler(void);//TIM2_UPD_IRQHandler// 
(interrupt_handler_t)TIM2_OVF_IRQHandler} 
struct interrupt_vector const _vectab[] = {
{0x82,(interrupt_handler_t)_stext},// reset 
{0x82,NonHandledInterrupt},// trap  
{0x82,// irq0  
{0x82,// irq1  
{0x82,// irq2  
{0x82,(interrupt_handler_t)EXTI0_IRQHandler},// irq3  
{0x82,// irq4  
{0x82,// irq5  
{0x82,// irq6  
{0x82,// irq7  
{0x82,// irq8  
{0x82,// irq9  
{0x82,// irq10 
{0x82,// irq11 
{0x82,// irq12 
{0x82,(interrupt_handler_t)TIM2_OVF_IRQHandler},// irq13 Timer2 ovf   TIM2_UPD_IRQHandler   
{0x82,// irq14 
{0x82,// irq15 
{0x82,// irq16 
{0x82,// irq17 
{0x82,// irq18 
{0x82,// irq19 
{0x82,// irq20 
{0x82,// irq21 
{0x82,// irq22 
{0x82,// irq23 
{0x82,// irq24 
{0x82,// irq25 
{0x82,// irq26 
{0x82,// irq27 
{0x82,// irq28 
{0x82,// irq29 
};



/*--------------------------------MAIN.C file---------------------------------*/

#include "stm8s.h"
#include "stm8s_tim2.h"
char lastkey=0;
int i=0;
char b=0;
char inde=0;
bool state = FALSE;

void clock_setup(void);
void EXTI_setup(void);
void TIM2_setup(void);
void GPIO_setup(void);
void main(void)
{
GPIO_setup();
TIM2_setup();
EXTI_setup();
clock_setup();

while (1)
    {       
    };      
}
void GPIO_setup(void)                   //numeric setup Ok
{
        GPIO_DeInit(GPIOA);
        GPIO_Init(GPIOA,GPIO_PIN_3,GPIO_MODE_IN_PU_IT);//interrupt input:detect zero time
        
        GPIO_DeInit(GPIOB);
        GPIO_Init(GPIOB,GPIO_PIN_5,GPIO_MODE_OUT_PP_HIGH_FAST);//gate-trig
        GPIO_Init(GPIOB,GPIO_PIN_4,GPIO_MODE_OUT_PP_HIGH_FAST);//ADC-key            
        
        GPIO_DeInit(GPIOD);
        GPIO_Init(GPIOD,GPIO_PIN_2,GPIO_MODE_OUT_PP_HIGH_FAST);//A
        GPIO_Init(GPIOD,GPIO_MODE_OUT_PP_HIGH_FAST);//B
        GPIO_Init(GPIOD,GPIO_MODE_OUT_PP_HIGH_FAST);//C
        GPIO_Init(GPIOD,GPIO_PIN_6,GPIO_MODE_OUT_PP_HIGH_FAST);//D
        GPIO_Init(GPIOD,GPIO_MODE_OUT_PP_HIGH_FAST);//E          
        GPIO_Init(GPIOD,GPIO_PIN_1,GPIO_MODE_OUT_PP_HIGH_FAST);//DP         
        GPIO_Init(GPIOD,GPIO_MODE_OUT_PP_HIGH_FAST);//uart Tx
        //GPIO_Init(GPIOD,GPIO_MODE_IN_PU_NO_IT);//uart Rx
        
        GPIO_DeInit(GPIOC);
        GPIO_Init(GPIOC,GPIO_MODE_OUT_PP_HIGH_FAST);//F
        GPIO_Init(GPIOC,GPIO_PIN_7,GPIO_MODE_OUT_PP_HIGH_FAST);//G
        GPIO_Init(GPIOC,GPIO_MODE_OUT_PP_HIGH_FAST);//key-Bt3
        GPIO_Init(GPIOC,GPIO_MODE_OUT_PP_HIGH_FAST);//key-Bt2
        GPIO_Init(GPIOC,GPIO_MODE_OUT_PP_HIGH_FAST);//key-Bt1
        

}
void clock_setup(void)
{



CLK_DeInit(); 

    CLK_HSECmd(disABLE);
CLK_LSICmd(disABLE);
CLK_HSICmd(ENABLE);
while(CLK_GetFlagStatus(CLK_FLAG_HSIRDY) == FALSE);
            
CLK_ClockSwitchCmd(ENABLE);
            
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO,CLK_SOURCE_HSI,disABLE,CLK_CURRENTCLOCKSTATE_ENABLE);
//{
        CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV8);
        CLK_SYSCLKConfig(CLK_PRESCALER_cpuDIV1);
        CLK_PeripheralClockConfig(CLK_PERIPHERAL_UART1,ENABLE);
        CLK_PeripheralClockConfig(CLK_PERIPHERAL_ADC,ENABLE);
//}
CLK_PeripheralClockConfig(CLK_PERIPHERAL_SPI,disABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C,disABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_AWU,disABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER1,disABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER2,ENABLE);
CLK_PeripheralClockConfig(CLK_PERIPHERAL_TIMER4,disABLE);

}
void EXTI_setup(void)
{
    ITC_DeInit();
ITC_SetSoftwarePriority(ITC_IRQ_PORTA,ITC_PRIORITYLEVEL_0);
            
EXTI_DeInit();
EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOA,EXTI_SENSITIVITY_RISE_ONLY);
EXTI_SetTLISensitivity(EXTI_TLISENSITIVITY_RISE_ONLY);
            
enableInterrupts();
}
void TIM2_setup(void)
{
TIM2_DeInit();
ITC_SetSoftwarePriority(ITC_IRQ_TIM2_OVF,ITC_PRIORITYLEVEL_0);
    TIM2_TimeBaseInit(TIM2_PRESCALER_1,1000);
    TIM2_ITConfig(TIM2_IT_UPDATE,ENABLE);
    TIM2_Cmd(ENABLE);
    
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)