问题描述
嗨,我想使用 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 (将#修改为@)