打印
[STM32L1]

STM32L151 串口中断问题求帮忙

[复制链接]
4233|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
windit|  楼主 | 2014-9-25 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求大神帮忙看下,为什么一初始化好串口,就进入到TX中断里面了,而且进去就出不来了?以下是初始化函数和中断

void InitUart3()
{
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
       
    /* 串口3 TX = PB10  RX = PB11 */

        /* 第1步: 配置GPIO */

        /* 打开 GPIO 时钟 */
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

        /* 打开 UART 时钟 */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

    /* 将 PB10 映射为 USART3_TX */
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_USART3);

    /* 将 PB11 映射为 USART3_RX */
        GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_USART3);
     

        /* 配置 USART Tx 为复用功能 */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;        /* 输出类型为推挽 */
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        /* 内部上拉电阻使能 */
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        /* 复用模式 */

        //GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
        GPIO_Init(GPIOC, &GPIO_InitStructure);

        ///配置 USART Rx 为复用功能
    /*
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_Init(GPIOC, &GPIO_InitStructure);
    */
   

        /* 第2步: 配置串口硬件参数 */
        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(USART3, &USART_InitStructure);
     
    USART_ITConfig(USART3, USART_IT_TXE, ENABLE);   
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    USART_ITConfig(USART3, USART_IT_TC, ENABLE);
   
        USART_Cmd(USART3, ENABLE);                /* 使能串口 */
   
        /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
                如下语句解决第1个字节无**确发送出去的问题 */
        USART_ClearFlag(USART3, USART_FLAG_TC);     /* 清发送完成标志,Transmission Complete flag */   
   
   
         
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//选择分组方式0
   // 使能 USART1 中断
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

void USART3_IRQHandler(void)
{
    uint8_t getdata;
   // printf("usart interrupt!!!\r\n");
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//如果寄存器中有数据
    {
        USART_ClearITPendingBit(USART3,USART_IT_RXNE);
        getdata = (uint8_t)USART_ReceiveData(USART3);
        printf("usart rx interrupt!!!\r\n");
        Uart_GetRxByte(getdata);
    }
    else if(USART_GetITStatus(USART3,USART_IT_TXE) != RESET)
    {
        USART_ClearITPendingBit(USART3,USART_IT_TXE);   
        Uart_SetTxByte(USART3);
        printf("usart tx interrupt!!!\r\n");
    }              
}
沙发
mmuuss586| | 2014-9-25 19:39 | 只看该作者
1、开了2个发送中断,去掉一个试下;
2、另外程序加上这个判断看看
if(USART_GetITStatus(USART2, USART_IT_TC) != RESET)  
3、清除发送中断标志,放在定时器3使能前面
USART_ClearFlag(USART3, USART_FLAG_TC);

使用特权

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

本版积分规则

13

主题

20

帖子

2

粉丝