请选择 进入手机版 | 继续访问电脑版
搜索
查看: 642|回复: 2

[求助] STM8S207R8外部中断

[复制链接]

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2021-3-19
发表于 2021-1-9 16:17:16 | 显示全部楼层 |阅读模式
求助:使用STM8S207R8单片机,寄存器操作,没有使用库函数,使用PA1,PA2做模拟串口,PA1----TX,PA2-----RX,定时器4做模拟波特率定时104us,模拟波特率9600,发送数据正常,接收采用中断开启的方式,当数据起始位来临时,进入外部中断,并关闭外部中断,开启定时器,初始化定时器重装载值,按位接收数据,目前问题出现在外部中断关闭时,没有关闭成功,导致数据接收失败,代码片段如下:
外部中断:
@far @interrupt void EXTI_PA2_TLI(void)  //
{
        debug ++;
        GPIOA -> CR1 |= (1<<2);//中断上拉
        GPIOA -> CR2 &= ~(1<<2);//关中断
        receive_flag = 1;
        TIM4 -> CNTR =0x67;
        TIM4 -> IER = 0x01;
}

定时器4中断:
@far @interrupt void TIM4_UPD_OVF_IRQHandler (void)//104US
{               
        TIM4 -> SR1 = 0x00;   
        
  if(receive_flag == 1)
        {
                uartn_rx_data = uartn_rx_data >> 1;
               
                if(read_RXD)
                {
                        uartn_rx_data |= 0x80;
                }
                uartn_rx_bit++;
                if(uartn_rx_bit > 7)
                {
                        uartn_rx_bit = 0;
                        receive_flag = 0;
                        uartn_receive_buff[uartn_rx_length] = uartn_rx_data;
                        uartn_rx_data = 0;
                        uartn_rx_length ++;
                        GPIOA -> CR2 |= (1<<2);//开中断
                        TIM4 -> IER = 0x00;            // 禁止中断
                        TIM4->CNTR=0;
                        if(uartn_rx_length >= 64)
                        {
                                //memset(uartn_receive_buff,0,64);
                                uartn_rx_length = 0;
                        }
                }
        }
        else if(send_flag == 1)
        {
                if(Uartn_cont==0)
                {
                        GPIOA -> ODR &= ~(1<<1);
                }
                else
                {
                        if((Uartn_data&0x01)==0x01)
                        {
                                GPIOA -> ODR |= (1<<1);        
                        }
                        else
                        {
                                GPIOA -> ODR &= ~(1<<1);
                        }
                        Uartn_data>>=1;
                }
                Uartn_cont++;
                if(Uartn_cont>9)
                {
                        Uartn_cont=0;
                        send_flag = 0;
                        TIM4 -> IER = 0x00;            // 禁止中断
                        TIM4->CNTR=0;
                        GPIOA -> ODR |= (1<<1);
                }
        }
}

使用库函数写的103的小程序可以正常运行
void tim4IRQ(void)
{
    TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
    debug ++;

  if(receive_flag == 1)
    {
        uartn_rx_data = uartn_rx_data >> 1;

        if(0 != GPIO_ReadInputPin(GPIOA, GPIO_PIN_2))
        {
            uartn_rx_data |= 0x80;
        }
        uartn_rx_bit++;
        if(uartn_rx_bit > 7)
        {
            uartn_rx_bit = 0;
            receive_flag = 0;
            uartn_receive_buff[uartn_rx_length] = uartn_rx_data;
            uartn_rx_data = 0;
            uartn_rx_length ++;
            GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
            TIM4_Cmd(DISABLE);
            TIM4->CNTR=0;
            if(uartn_rx_length >= 64)
            {
                memset(uartn_receive_buff,0,64);
                uartn_rx_length = 0;
            }
        }
    }
    else if(send_flag == 1)
    {
        if(Uartn_cont==0)
        {
            GPIOA -> ODR &= ~(1<<1);
        }
        else
        {
            if((Uartn_data&0x01)==0x01)
            {
                GPIOA -> ODR |= (1<<1);
            }
            else
            {
                GPIOA -> ODR &= ~(1<<1);
            }
            Uartn_data>>=1;
        }
        Uartn_cont++;
        if(Uartn_cont>9)
        {
            Uartn_cont=0;
            send_flag = 0;
            TIM4_Cmd(DISABLE);
            TIM4->CNTR=0;
            GPIOA -> ODR |= (1<<1);
        }
    }
}



回复

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2021-3-19
 楼主| 发表于 2021-1-9 16:38:11 | 显示全部楼层
我使用库函数写的小程序就可以正常运行代码如下:
void GpioAIRQ(void)
{
        debug2 ++;
        debug3 = 0;
        GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_NO_IT);//关中断
        receive_flag = 1;
        TIM4_SetCounter(0x67);
        TIM4_Cmd(ENABLE);//启动定时器
        TIM4_Cmd(ENABLE);//启动定时器
}
void tim4IRQ(void)
{
        TIM4_ClearITPendingBit(TIM4_IT_UPDATE);
        debug ++;

  if(receive_flag == 1)
        {
                uartn_rx_data = uartn_rx_data >> 1;
               
                if(0 != GPIO_ReadInputPin(GPIOA, GPIO_PIN_2))
                {
                        uartn_rx_data |= 0x80;
                }
                uartn_rx_bit++;
                if(uartn_rx_bit > 7)
                {
                        uartn_rx_bit = 0;
                        receive_flag = 0;
                        uartn_receive_buff[uartn_rx_length] = uartn_rx_data;
                        uartn_rx_data = 0;
                        uartn_rx_length ++;
                        GPIO_Init(GPIOA, GPIO_PIN_2, GPIO_MODE_IN_PU_IT);
                        TIM4_Cmd(DISABLE);
                        TIM4->CNTR=0;
                        if(uartn_rx_length >= 64)
                        {
                                memset(uartn_receive_buff,0,64);
                                uartn_rx_length = 0;
                        }
                }
        }
        else if(send_flag == 1)
        {
                if(Uartn_cont==0)
                {
                        GPIOA -> ODR &= ~(1<<1);
                }
                else
                {
                        if((Uartn_data&0x01)==0x01)
                        {
                                GPIOA -> ODR |= (1<<1);       
                        }
                        else
                        {
                                GPIOA -> ODR &= ~(1<<1);
                        }
                        Uartn_data>>=1;
                }
                Uartn_cont++;
                if(Uartn_cont>9)
                {
                        Uartn_cont=0;
                        send_flag = 0;
                        TIM4_Cmd(DISABLE);
                        TIM4->CNTR=0;
                        GPIOA -> ODR |= (1<<1);
                }
        }
}
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

1306

帖子

929

蝴蝶豆

版主

最后登录
2021-3-31
发表于 2021-1-25 11:03:30 | 显示全部楼层
对比一下库函数看看吧。 我看库函数是先关中断,然后再设置IO其他模式
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-29 18:36 , Processed in 0.152099 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表