您的位置:首页 > 其它

STM32学习之:USART中断方式

2017-10-20 10:51 453 查看
 前面我们接收了串口通信的查询方式,现在我们来介绍中断方式。

   步骤一:初始化GPIO

GPIO_InitTypeDef GPIO_InitStructure;

 /* Configure USART1 Tx (PA.09) as alternate function push-pull */

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

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

 

步骤二:开时钟

/* Enable USART1, GPIOA, GPIOD and AFIO clocks */

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD

                         | RCC_APB2Periph_AFIO, ENABLE);

在此说明,不用设置RCC_APB2Periph_AFIO也是可以的,也就是在此没有使用复用功能。

这两个步骤与查询方式是一样的。

 

步骤三:初始化USART1

USART_InitStructure.USART_BaudRate = 115200;

 USART_InitStructure.USART_WordLength = USART_WordLength_8b;

 USART_InitStructure.USART_StopBits = USART_StopBits_2;

 USART_InitStructure.USART_Parity = USART_Parity_No;      //设置奇校验时,通信出现错误

 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

 /* Configure the USART1 */

 USART_Init(USART1, &USART_InitStructure);

 /* Enable the USART Transmoit interrupt: this interrupt is generated when the

     USART1 transmit data register is empty */ 

 USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

 /* Enable the USART Receive interrupt: this interrupt is generated when the

     USART1 receive data register is not empty */

 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

 /* Enable USART1 */

 USART_Cmd(USART1, ENABLE);

在这里要使能USART1的外设中断,如USART_ITConfig(USART1, USART_IT_TXE, ENABLE);这就是使能发送中断,但发送寄存器空时能产生中断。

 

步骤四:编写中断函数

uint8_t TxBuffer[] = "\n\rUSART Hyperterminal Interrupts Example: USART-Hyperterminal\

 communication using Interrupt\n\r";

uint8_t RxBuffer[RxBufferSize];

uint8_t NbrOfDataToTransfer = TxBufferSize;

uint8_t NbrOfDataToRead = RxBufferSize;

uint8_t TxCounter = 0;

uint16_t RxCounter = 0;

 

void USART1_IRQHandler(void)

{

 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)

 {

    /* Read one byte from the receive data register */

    RxBuffer[RxCounter++] = (USART_ReceiveData(USART1) & 0x7F);

    if(RxCounter == NbrOfDataToRead)

    {

      /* Disable the USART Receive interrupt */

      USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

    }

 }

 

 if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)

 {  

    /* Write one byte to the transmit data register */

      USART_SendData(USART1, TxBuffer[TxCounter++]);

    if(TxCounter == NbrOfDataToTransfer)

    {

      /* Disable the USART1 Transmit interrupt */

      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

    }

 }

}

 

至此程序就结束了。

 

我们就会有个疑问,main()只包括前三个步骤的初始化和一个死循环,那么中断又是如何触发的呢,main()的结构如下:

int main(void)

{

 /* System Clocks Configuration */

 RCC_Configuration();

 /* NVIC configuration */

 NVIC_Configuration();

 /* Configure the GPIO ports */

 GPIO_Configuration();

 USART_Configuration();

 

 while (1)

 {

 }

}

原来是这样的:状态寄存器USART_SR的复位值为0x00C0H, 也就是第七位TXE和第六位TC复位值为1,而TXE=1,表明发送数据寄存器为空, TC=1表明发送已完成。而在USART的设置中有

USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

这两句使能中断,也就是说当TXE=1就会进入中断,所以程序初始化后就能进入中断,执行

if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)

 {  

    /* Write one byte to the transmit data register */

      USART_SendData(USART1, TxBuffer[TxCounter++]);

    if(TxCounter == NbrOfDataToTransfer)

    {

      /* Disable the USART1 Transmit interrupt */

      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

    }

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: