ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

配置串口的中断接收(标准库)基于STM32F103VET6单片机

2022-02-06 18:32:41  阅读:224  来源: 互联网

标签:USART STM32F103VET6 NVIC 单片机 InitStructure UART4 串口 DEBUG GPIO


注:如有错误欢迎批评改正。

1.串口初始化

我用的是片上外设UART4(因为USART1-3已经有别的用途)

首先定义一个UART(通用异步收发传输器)初始化函数,在函数中定义一个GPIO初始化结构体和一个USART初始化结构体。分别用于定义UART4引脚的输入输出模式和UART4的工作参数。

void UART4_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    // 打开串口GPIO的时钟
    DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
    
    // 打开串口外设的时钟
    DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

    // 将USART Tx的GPIO配置为推挽复用模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
    GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
    
    // 配置串口的工作参数
    // 配置波特率
    USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
    // 配置 针数据字长
    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(DEBUG_USARTx, &USART_InitStructure);
    
    // 串口中断优先级配置
    NVIC_Configuration();

    // 使能串口接收中断
    USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);    
//    USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
    // 使能串口
    USART_Cmd(DEBUG_USARTx, ENABLE);        

  // 清除发送完成标志
    USART_ClearFlag(UART4, USART_FLAG_TC);     
}

 

2.中断初始化

然后定义一个NVIC(嵌套向量中断控制器)初始化函数,在函数中定义一个NVIC初始化结构体。用于配置中断源,优先级等参数。这些都可以在misc.h里看到,根据需要选择就好(如果英文不太好可以下载一个有道词典,划词翻译很方便,我就是英文不好)。

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 嵌套向量中断控制器组选择 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  
  /* 配置USART为中断源 */
  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  /* 抢断优先级*/
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  /* 初始化配置NVIC */
  NVIC_Init(&NVIC_InitStructure);
}

 

3.注意事项

这里主要就是说几个我遇到的问题,第一个就是要在串口初始化函数中使能串口接收中断,第二个就是程序要有一个死循环(这样程序才能一直运行从而有机会触发中断),还有就是在stm32f10x_it.h中写一个中断服务函数(只要触发中断就会调用这个函数,在选择中断源的时候可以选择中断触发条件,我这里选择的是接收寄存器非空中断,意思就是只要数据寄存器接收到数据就会触发中断)

    
/*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  UART4_Config();

    /* 发送一个字符串 */
    Usart_SendString( DEBUG_USARTx,"串口发送实验成功\n");
    
    //注释掉的是没使用中断时候的接收函数
//    while(1)
//    {
//    UART4_DATA=UART4_RECEIVE();
//    Usart_SendByte(DEBUG_USARTx,UART4_DATA);
//    }
while(1)
{}
// 串口(UART4)中断服务函数
void DEBUG_USART_IRQHandler(void)
{
  uint8_t UART4_Temp;
    if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET)
    {        
        UART4_Temp = USART_ReceiveData(DEBUG_USARTx);
    USART_SendData(DEBUG_USARTx,UART4_Temp);    
    }     
}

 

(函数名要在头文件中声明//.h文件)

 

标签:USART,STM32F103VET6,NVIC,单片机,InitStructure,UART4,串口,DEBUG,GPIO
来源: https://www.cnblogs.com/GREEN-FIEID/p/15866029.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有