我用正点原子的开发板也试了一下(F767),我根据我的意思把你们提供的串口通信例程修改了下(F767),串口1接收中断中只负责接收,而主循环中则是串口循环发送,每个循环最多发送一个字节。发现如果主循环中不发送,则串口接收正常,接收速度很快。但是当我主循环里循环发送时,串口接收中断运行一段时间后就无法进入中断,但是程序没死,照样在发送。能麻烦帮看下吗,按理说串口中断也没关,其他中断也没打开。
下面是主循环程序:
int main(void)
{
u8 len,i;
u32 times=0;
Cache_Enable(); //打开L1-Cache
HAL_Init(); //初始化HAL库
Stm32_Clock_Init(432,25,2,9); //设置时钟,216Mhz
delay_init(216); //延时初始化
uart_init(115200); //串口初始化
LED_Init(); //初始化LED
while(1)
{
times++;
if(times>0x2fffff)
{
times=0;
for(i=0;i<12;i++)
{
/***************加上这一句,串口接收就有问题*****************/
UART1_TX_BUF[++UART1_SendBuf_Count]='0'+i; //如果有发送的时候会导致运行无法进入串口接收中断?????
/***************加上这一句,串口接收就有问题*****************/
}
LED0_Toggle;
}
if(UART1_SendBuf_Count!=UART1_SendBuf_Current) //main循环中发送串口数据,此处每次最多发一个字节
{
HAL_UART_Transmit(&UART1_Handler,(uint8_t*)(&UART1_TX_BUF[++UART1_SendBuf_Current]),1,1000); //发送接收到的数据
while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET); //等待发送结束
}
}
}
下面是串口中断的操作:
u8 UART1_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
u8 UART1_TX_BUF[USART_SEND_LEN]; //发送缓冲,最大USART_REC_LEN个字节.
u8 UART1_ReceiveBuf_Current=0; //接收缓存当前处理的字节位置
u8 UART1_ReceiveBuf_Count=0; //接收缓存中存储字节量
u8 UART1_SendBuf_Current=0; //发送缓存当前处理的字节位置
u8 UART1_SendBuf_Count=0; //发送缓存中存储字节量
u8 aRxBuffer_UART1[RXBUFFERSIZE];//HAL库使用的串口接收缓冲
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)//如果是串口1
{
UART1_RX_BUF[++UART1_ReceiveBuf_Count] = aRxBuffer_UART1[0]; //串口接收中断中只负责接收
if(UART1_ReceiveBuf_Count%50==0) LED1_Toggle;
}
}
工程文件压缩了也有好几M,传不上来,哪位亲能帮我看看,告知可能是什么原因,多谢。
|