在线时间2 小时
UID3395185
ST金币14
蝴蝶豆0
注册时间2020-4-27
该用户从未签到
新手上路
- 最后登录
- 2021-3-19
|
求助:使用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);
}
}
}
|
|