stm32的

By wit_yuan

       一般来说,串口的发送中断传输数据,对于我目前的应用来说,应用的要求并不是很高,因此,因此就一直没有对其进行一个比较好的实验与认识。然而,在一次串口程序升级(IAP)升级实验中,发现有人使用了这个发送中断方式进行的,所以特别的进行了一个个步骤的实验来进一步知道其运行机理。

       首先,串口发送数据,可以使用的方式有:

1、  发送一个数据,然后读取USART_IT_TXE或者USART_IT_TC寄存器的状态。

2、  使用串口发送中断

3、  使用dma发送完成中断

在效率上,肯定是3比较好。其次是2

 

网上关于USART_IT_TXEUSART_IT_TC是怎么个用法,各家有各家的言论,在我这里只通过实验来了解,因为网上的很多人的讲解是有一些歧义的。

 

本人用的芯片为stm32f103vet6,利用串口1进行实验,先贴上串口1的配置部分:

void USART1_Config(void)

{

       GPIO_InitTypeDef GPIO_InitStructure;

       USART_InitTypeDef USART_InitStructure;

       NVIC_InitTypeDef NVIC_InitStructure;

 

       RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

 

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

       GPIO_Init(GPIOA, &GPIO_InitStructure);   

       /* Configure USART1 Rx (PA.10) as input floating */

       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

       GPIO_Init(GPIOA, &GPIO_InitStructure);

        

       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);

       USART_Cmd(USART1, ENABLE);

 

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init( &NVIC_InitStructure );

 

       USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

       USART_ITConfig(USART1, USART_IT_TC, ENABLE);

}

 

然后是中断部分的实验代码:

 

void USART1_IRQHandler(void)

{

 

    if(SET == USART_GetITStatus(USART1, USART_IT_TXE))

    {

        USART_ClearITPendingBit(USART1, USART_IT_TXE);

             

              if(有数据)

              {

                          

              }

              else

              {

                     USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

                     USART_ITConfig(USART1, USART_IT_TC, ENABLE);

              }

    }

    else if (USART_GetITStatus(USART1, USART_IT_TC) != RESET)

    {

        USART_ClearITPendingBit(USART1, USART_IT_TC);

              USART_ITConfig(USART1, USART_IT_TC, DISABLE);

    }

}

 

现在分析,在使能了串口1的功能后,明显的是,串口就开始进入发送寄存器空状态,也就是说if(SET == USART_GetITStatus(USART1, USART_IT_TXE))是成立的,如果没有if判断语句的话,也就是没有if{}else{},那么就会一直在if(SET == USART_GetITStatus(USART1, USART_IT_TXE))中断中,因此对于if(有数据)就需要在if(有数据){

USART_SendData(USART1, 数据);}了,一直等到没有数据了,就进入关闭USART_GetITStatus(USART1, USART_IT_TC) != RESET与之同时,需要开启USART_ITConfig(USART1, USART_IT_TC, ENABLE);让其进入传输完成中断。有人说,这个中断是发送一个字节完成后中断,这种理解十分的让人有歧义,应该说,发送一个字节数据之后,如果后续还有数据,这个中断是不会进去的,这个USART_GetITStatus(USART1, USART_IT_TC) != RESET;串口空闲相关。应该稍微准确的说法是,发送一个字节数据完成后,串口处于空闲状态了,这个时候,会进入这个中断。

 

好了,如果把串口初始化完成了,这个时候,串口发送中断都被禁止了,怎么去发送数据呢?

       发送数据,直接把USART_ITConfig(USART1, USART_IT_TXE, ENABLE);显然是不够的,需要通过USART_SendData(USART1, 数据);然后开启中断。可以暂且看作是激活串口,但是过程应该是数据到达寄存器后,很快为空,进而产生if(SET == USART_GetITStatus(USART1, USART_IT_TXE))为真的条件,从而一切仍然能够正常运行了。

 

注意点:

1、  中断流程

2、  再次发送数据,操作步骤。

 

综上,一个串口中断发送数据的程序就可以明显展开了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值