打印
[STM8]

STM8S103进入中断后无法退出,求助

[复制链接]
2980|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wuxin999|  楼主 | 2015-10-25 10:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟新学STM8,看到定时器部分时候用定时器4写了个LED的演示程序,烧录后发现LED并不能正常闪烁,完整的程序如下:1  stm8_interrupt_vector.c程序

/*        BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
*        Copyright (c) 2007 STMicroelectronics
*/
//这里使用的是定时器4
typedef void [url=home.php?mod=space&uid=1095855]@far[/url] (*interrupt_handler_t)(void);

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

@far [url=home.php?mod=space&uid=422518]@interrupt[/url] void NonHandledInterrupt (void)
{
        /* in order to detect unexpected events during development,
           it is recommended to set a breakpoint on the following instruction
        */
        return;
}


extern void _stext();     /* startup routine */
@far @interrupt void timer4_out (void);
struct interrupt_vector const _vectab[] = {
        {0x82, (interrupt_handler_t)_stext}, /* reset */
        {0x82, NonHandledInterrupt}, /* trap  */
        {0x82, NonHandledInterrupt}, /* irq0  */
        {0x82, NonHandledInterrupt}, /* irq1  */
        {0x82, NonHandledInterrupt}, /* irq2  */
        {0x82, NonHandledInterrupt}, /* irq3  */
        {0x82, NonHandledInterrupt}, /* irq4  */
        {0x82, NonHandledInterrupt}, /* irq5  */
        {0x82, NonHandledInterrupt}, /* irq6  */
        {0x82, NonHandledInterrupt}, /* irq7  */
        {0x82, NonHandledInterrupt}, /* irq8  */
        {0x82, NonHandledInterrupt}, /* irq9  */
        {0x82, NonHandledInterrupt}, /* irq10 */
        {0x82, NonHandledInterrupt}, /* irq11 */
        {0x82, NonHandledInterrupt}, /* irq12 */
        {0x82, NonHandledInterrupt}, /* irq13 */
        {0x82, NonHandledInterrupt}, /* irq14 */
        {0x82, NonHandledInterrupt}, /* irq15 */
        {0x82, NonHandledInterrupt}, /* irq16 */
        {0x82, NonHandledInterrupt}, /* irq17 */
        {0x82, NonHandledInterrupt}, /* irq18 */
        {0x82, NonHandledInterrupt}, /* irq19 */
        {0x82, NonHandledInterrupt}, /* irq20 */
        {0x82, NonHandledInterrupt}, /* irq21 */
        {0x82, NonHandledInterrupt}, /* irq22 */
        {0x82, timer4_out}, /* irq23 */
        {0x82, NonHandledInterrupt}, /* irq24 */
        {0x82, NonHandledInterrupt}, /* irq25 */
        {0x82, NonHandledInterrupt}, /* irq26 */
        {0x82, NonHandledInterrupt}, /* irq27 */
        {0x82, NonHandledInterrupt}, /* irq28 */
        {0x82, NonHandledInterrupt}, /* irq29 */
};
2   此处是MAIN.C文件

void init_io(void)
{
        PB_CR1 &= ~(1<<5);
        PB_CR2 &= ~(1<<5);
        PB_DDR |= (1<<5);
        PB_ODR = 0xff;
}
void init_timer4 (void)
{
        TIM4_PSCR = 0x02;
        TIM4_ARR = 0xFA;
        TIM4_CNTR = 0xFA;
        TIM4_IER |= (1<<0);
}
@far @interrupt void timer4_out (void)
{
        count++;
}
void init_clk (void)
{
        CLK_CMSR = 0xe1;
        CLK_CKDIVR =((0x11<<3)|(0x01));//8|2
        CLK_PCKENR1 |= (1<<4);
}//1M
void main (void)
{
        _asm("sim");
        init_io();//板上一个LED,初始化LED输出的接口
        init_clk();//初始化系统时钟
        init_timer4();//初始化定时器4
        TIM4_CR1 = (1<<0);
        _asm("rim");
        while(1)
        {
                if(count>1000)//当定时器中断服务程序的计数大于1000的时候执行括号内的程序
                {
                        PB_ODR^=(1<<5);//LED接口取反
                        count = 0;//计数清零
                }
        }
}
单步运行的时候发现程序一直运行在中断服务程序@far @interrupt void timer4_out (void)中,count一直在加1,无法跳出中断服务程序。
昨天看了一晚上,实在看不出是语法错误还是规格数理解有问题,请各位帮忙看看,找找问题在哪里。
沙发
huangcunxiake| | 2015-10-25 14:57 | 只看该作者
退出就是清除中断标志啊,然后重启中断服务。

使用特权

评论回复
板凳
643757107| | 2015-10-25 15:00 | 只看该作者
有没有清除中断标志啊。

使用特权

评论回复
地板
huangcunxiake| | 2015-10-25 15:28 | 只看该作者
楼主随便先找个别人写的能用的,慢慢修改。

使用特权

评论回复
5
NE5532| | 2015-10-25 16:30 | 只看该作者
中断标志没清,当然一直在里面转。

使用特权

评论回复
6
gmm2015| | 2015-10-26 09:24 | 只看该作者
没清中断标志位

使用特权

评论回复
7
wuxin999|  楼主 | 2015-10-26 14:45 | 只看该作者
huangcunxiake 发表于 2015-10-25 14:57
退出就是清除中断标志啊,然后重启中断服务。

这个到没有,因为学习的时候例程是把LED接口取反直接放在中断服务程序里的,所以还不知道这一说,谢谢

使用特权

评论回复
8
wuxin999|  楼主 | 2015-10-26 14:46 | 只看该作者
643757107 发表于 2015-10-25 15:00
有没有清除中断标志啊。

这个没有,多谢指点

使用特权

评论回复
9
wuxin999|  楼主 | 2015-10-26 14:47 | 只看该作者
huangcunxiake 发表于 2015-10-25 15:28
楼主随便先找个别人写的能用的,慢慢修改。

恩,我现在正在学习中,还没涉及到具体项目,这是在学习中遇到的问题:)

使用特权

评论回复
10
wuxin999|  楼主 | 2015-10-26 14:47 | 只看该作者
NE5532 发表于 2015-10-25 16:30
中断标志没清,当然一直在里面转。

恩,谢谢,多谢指点

使用特权

评论回复
11
wuxin999|  楼主 | 2015-10-26 14:48 | 只看该作者

恩,多谢指点:)

使用特权

评论回复
12
309030106| | 2015-10-28 19:52 | 只看该作者
一般退出中断要清除中断标志的

使用特权

评论回复
13
FireRiver9| | 2015-10-28 21:07 | 只看该作者
楼主到底是不是中断标志位没清

使用特权

评论回复
14
huangcunxiake| | 2015-10-28 21:22 | 只看该作者
进入中断后,先关闭中断,然后清理标志,之后处理中断程序,然后重启中断退出。

使用特权

评论回复
15
wuxin999|  楼主 | 2015-11-10 12:42 | 只看该作者
FireRiver9 发表于 2015-10-28 21:07
楼主到底是不是中断标志位没清

是中断标志没清

使用特权

评论回复
16
wuxin999|  楼主 | 2015-11-10 12:43 | 只看该作者
309030106 发表于 2015-10-28 19:52
一般退出中断要清除中断标志的

:handshake

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:少年不识愁滋味,爱上层楼。爱上层楼,为赋新词强说愁。而今识尽愁滋味,欲说还休。欲说还休,却道天凉好个秋!

1

主题

93

帖子

1

粉丝