打印

串口中断卡住了

[复制链接]
836|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大白农|  楼主 | 2015-8-23 09:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
执行到USART_ITConfig(USART1, USART_IT_TC, ENABLE);这一步时,程序莫名其妙地卡住了,问一下是什么原因?
#include "stm32f10x.h"

int global = 0;

void uart_init(int bound)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
       
        USART_DeInit(USART1);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
       
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
       
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        USART_InitStructure.USART_BaudRate = bound;
        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_IRQChannelPreemptionPriority = 0;  
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
        NVIC_Init(&NVIC_InitStructure);  
          
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);  
               
        USART_Cmd(USART1, ENABLE);
}

void NVIC_Configuration()
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
}

int main()
{
        NVIC_Configuration();
        uart_init(9600);

        USART_SendData(USART1, global);
        while (1)
        {
                if (USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET)
                {
                USART_SendData(USART1, global);
                }
        }
       
    return 0;
}

void USART1_IRQHandler()
{
        global++;
}


相关帖子

沙发
deliciouscook| | 2015-8-23 16:25 | 只看该作者
USART_FLAG_TC需要软件清除,你的里面好像没有清除,没有清除就没有等待,发完一个就直接下一个

使用特权

评论回复
板凳
justperky| | 2015-8-24 12:22 | 只看该作者
最好还是用USART_FLAG_TXE

使用特权

评论回复
地板
低八度的声线| | 2015-8-24 17:16 | 只看该作者
USART_ClearITPendingBit(USART1, USART_IT_TC);                //清除完成标志

使用特权

评论回复
5
Desire1| | 2015-8-24 18:45 | 只看该作者
Bit 7 TXE: Transmit data register empty
This bit is set by hardware when the content of the USARTx_TDR register has been
transferred into the shift register. It is cleared by a write to the USARTx_TDR register.
An interrupt is generated if the TXEIE bit =1 in the USARTx_CR1 register.

Bit 6 TC: Transmission complete
This bit is set by hardware if the transmission of a frame containing data is complete and if
TXE is set. An interrupt is generated if TCIE=1 in the USARTx_CR1 register. It is cleared by
software, writing 1 to the TCCF in the USARTx_ICR register or by a write to the
USARTx_TDR register.
An interrupt is generated if TCIE=1 in the USARTx_CR1 register.

好好看看Reference manual吧,只要发送寄存器空,发送完了,这两个标志都是置位的,刚初始化完就是这个状态

使用特权

评论回复
6
北方小榕树| | 2015-8-26 22:00 | 只看该作者
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);/*等待发送完成*/
USART_FLAG_TC需要软件清除,你的里面好像没有清除,没有清除就没有等待,发完一个就直接下一个。
最好还是用USART_FLAG_TXE

使用特权

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

本版积分规则

15

主题

139

帖子

0

粉丝