求助:使用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); } } } |
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);
}
}
}