打印
[STM32F0]

STM32串口出现问题

[复制链接]
1232|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
梦来是缘|  楼主 | 2014-7-21 14:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口双板通信,一个板子发送字符b,另一个板子接收字符并发送,有时候能接收到,有时候接收不到
void int_uart(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_3;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
   
   
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);       
}

void cfg_uart(void)
{
        USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
   
        USART_InitStructure.USART_BaudRate = 115200;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
        USART_Init(USART1, &USART_InitStructure);
   
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
   
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_Cmd(USART1, ENABLE);
}

void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
    {
        start_check = USART_ReceiveData(USART1);
        
        if(start_check == 'b')
        {
             iic_send_switch(22);
             uart_send_data(start_check );
        }
      
    }
}
沙发
梦来是缘|  楼主 | 2014-7-21 14:34 | 只看该作者
用上位机软件发送字符b,板子在复位后只能接收到几个字符,就停不发数据了

使用特权

评论回复
板凳
runningwzf| | 2014-7-21 14:43 | 只看该作者
清中断标志

使用特权

评论回复
地板
梦来是缘|  楼主 | 2014-7-21 15:25 | 只看该作者
不是说只要读取就能清接收标志吗

使用特权

评论回复
5
梦来是缘|  楼主 | 2014-7-21 15:27 | 只看该作者
我自己又新建了一个工程,还是上面的程序就可以了没有出现之前说的情况

使用特权

评论回复
6
mmuuss586| | 2014-7-21 18:57 | 只看该作者
梦来是缘 发表于 2014-7-21 15:27
我自己又新建了一个工程,还是上面的程序就可以了没有出现之前说的情况

新建个工程就可以了?
那看看哪里设置不一样;

使用特权

评论回复
7
梦来是缘|  楼主 | 2014-7-21 19:17 | 只看该作者
mmuuss586 发表于 2014-7-21 18:57
新建个工程就可以了?
那看看哪里设置不一样;

我是根据发送端的工程改的,测试能接收正常改的,接收端的工程煤再看,基本上配置是一样的,但是没找到哪不一样

使用特权

评论回复
8
runningwzf| | 2014-7-24 09:38 | 只看该作者
感觉你这个项目存在两个问题:
1、没有清除中断标志
2、不知道你的iic_send_switch(22)和 uart_send_data(start_check )需要多少执行时间,如果执行时间过程,可能会造成溢出错误。
3、本人的中断处理程序,仅供参考
void USART1_IRQHandler(void)
{
        OS_CPU_SR  cpu_sr;
        INT8U res;
        //提示系统进入中断
        OS_ENTER_CRITICAL();
        OSIntNesting++;
            OS_EXIT_CRITICAL();
        //中断服务
          if(USART_GetITStatus(RS485_UART, USART_IT_RXNE) != RESET){
                  USART_ClearITPendingBit(RS485_UART, USART_IT_RXNE);
                res = USART_ReceiveData(RS485_UART);
                //如果数据接收缓冲区未使用完,则可以接收数据
                if(ComData[BufIndex].RecIndex<SERIAL_BUF_LEN){
                        ComData[BufIndex].RecBuf[ComData[BufIndex].RecIndex++]=res;
                }
                OSMboxPost(Mbox_Com,&(ComData[BufIndex]));
        }
        //溢出错误
        else if(USART_GetFlagStatus(RS485_UART,USART_FLAG_ORE)==SET){
                USART_ClearFlag(RS485_UART,USART_FLAG_ORE); //读SR其实就是清除标志
                res=USART_ReceiveData(RS485_UART);    //读DR
        }
        //提示系统出中断
        OSIntExit();
}

使用特权

评论回复
9
runningwzf| | 2014-7-24 09:41 | 只看该作者
如果不是每个字节都必须实时处理的话,串口建议用DMA+定时器的方式进行数据的介绍,可以显著提高程序的效率。
SMT的串口没有buffer就是坑爹

使用特权

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

本版积分规则

3

主题

21

帖子

1

粉丝