今天把stm32的串口配置起来,把经验跟大家共享下

总的函数如下

void USART1Configuration(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1,ENABLE);
    USART1_GPIO_Configuration();
    USART1_Param_Configuration();
    NVIC_Configuration();  /*串口使用中断方式才用到*/
    //打开发送接收中断
    USART_ITConfig(USART1, USART_IT_TXE, ENABLE); 
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1,ENABLE); /*使能串口*/

}

时间配置就不讲了
首先是配置USART的GPIO口
/*******************************************************************************
* Name : UART1_GPIO_Configuration
* Deion : Configures the uart1 GPIO ports.
* Input : None
* Output : None
* Return : None
*******************************************************************************/

void USART1_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Configure USART1_Tx as alternate 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 as input floating
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}

然后是配置串口参数
/*******************************************************************************
* Name : UART1_Configuration
* Deion : Configures the uart1
* Input : None
* Output : None
* Return : None
*******************************************************************************/

void USART1_Param_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;

USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
/* Configure the USART1 synchronous paramters */
USART_ClockInit(USART1, &USART_ClockInitStructure);

USART_InitStructure.USART_BaudRate = 9600;
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;
/* Configure USART1 basic and asynchronous paramters */
USART_Init(USART1, &USART_InitStructure);
}

然后是在中断设置,需要修改stm32f10x_it.c 中的串口中断函数 并且需要修改void NVIC_Configuration(void)函数

修改NVIC_Configuration函数
/*******************************************************************************
* Name : NVIC_Configuration
* Deion : Configures NVIC and Vector Table base location.
* Input : None
* Output : None
* Return : None
*******************************************************************************/

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//

/* Enable the USART1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;  /*这个串口中断入口可以查询stm32f10.h得到看有哪些中断入口*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

串口中断处理函数文件

/* Private macro -------------------------------------------------------------*/
#define countof(a)   (sizeof(a) / sizeof(*(a)))

/* Private variables ---------------------------------------------------------*/
uint8_t TxBuffer[160];
uint8_t RxBuffer[RxBufferSize];
uint8_t NbrOfDataToTransfer = TxBufferSize;
uint8_t NbrOfDataToRead = RxBufferSize;
uint8_t TxCounter = 0;
uint16_t RxCounter = 0;

//串口中断

void USART1_IRQHandler(void)
{
    /*接收中断*/
    u16 i;
    
    if(USART_GetFlagStatus(USART1,USART_IT_RXNE)== SET)
    {              
        i = USART_ReceiveData(USART1);
        USART_SendData(USART1,i);     /*回显*/
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
        {
        }               
    }

//发送中断,很少用到
    if (USART_GetITStatus(USART1, USART_IT_TXE) == SET)
    {
        USART_SendData(USART1, TxBuffer[TxCounter++]);
        if (NbrOfDataToTransfer==TxCounter)   /*最后一个字节不要,因为字符串最后一个是\0*/
        {
            //发送字节结束
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
        }
    }
   
}

至此 串口就可以工作起来了,但是还有很重要一点,就是编译时要打开target-Use  MicroLIB勾上,就可以了。

发送中断应该说有两个一个是发送完中断,一个是缓冲区空中断,你说的问题应该是发生在缓冲区空中断中.
当发送一帧数据时,如果发生缓冲区空中断或发送完毕中断时,还有数据要继续发送,那就发送下一个数据,如果数据已经都发送完了,则处理方式上有点区别,如果用缓冲区空中断,则而将中断关闭,如果用发送完毕中断,则直接返回就可以了

但是要用到printf来打印到串口1的话,需要对printf重定向到usart1,printf函数不用到中断

/*******************************************************************************
 * Function Name   : int fputc(int ch, FILE *f)
 * Description     : Retargets the C library printf function to the USART.printf重定向
 * Input           : None
 * Output          : None
 * Return          : None
 *******************************************************************************/
 int fputc(int ch, FILE *f)
 {

/* Write a character to the USART */
    USART_SendData(USART1, (u8) ch);
     /* Loop until the end of transmission */
    while((USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET))
    {
    }    
    return ch;
 }

/*******************************************************************************
 * Function Name   : int fgetc(FILE *f)
 * Description     : Retargets the C library printf function to the USART.fgetc重定向
 * Input           : None
 * Output          : None
 * Return          : 读取到的字符
 *******************************************************************************/
 int fgetc(FILE *f)
 {
    /* Loop until received a char */
    while((USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET))
    {
    }
  
      /* Read a character from the USART and RETURN */
    return (USART_ReceiveData(USART1));
 }

到这里,usart1就能打印出printf的内容了

(3)stm32开发之串口的调试相关推荐

  1. STM32开发,串口和PC机通信(串口中断、FIFO机制),安富莱+正点原子程序合并

    STM32开发,串口和PC机通信(串口中断.FIFO机制),安富莱+正点原子程序合并 1 概述 1.1 资源概述 1.2 实现功能 2 软件实现 2.1实现步骤 2.2 main()函数代码 2.3 ...

  2. eclipse+gcc STM32开发环境搭建及调试

    记录一下本人进行eclipse+gcc stm32开发环境的搭建过程,以便后续学习使用 参考资料如下: CubeMX+Eclipse+Jlink STM32开发环境搭建_小裘HUST的博客-CSDN博 ...

  3. STM32开发板串口 ISP 方式下载程序

    STM32开发板无下载电路也可以下载程序方法 自己设计的stm32开发板,手上无下载器,也没有板载的一键下载电路的情况下解决下载程序方法? 必须具备的条件:USB-TTL模块一个,板上预留有boot0 ...

  4. linux eclipse stm32,在ubuntu下利用eclipse搭建stm32开发环境和st-link调试

    一.下载eclipse: 我们选择的工具为Eclipse IDE for C/C++ Developers,官网下载地址在 https://www.eclipse.org/downloads/pack ...

  5. 基于STM32战舰开发板的USMART调试组件的使用

    基于STM32战舰开发板的USMART调试组件的使用 USMART调试组件是什么? USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具.具体工作过程是通过串 ...

  6. STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式2)

    STM32 OTA应用开发--通过串口/RS485实现OTA升级(方式2) 目录 STM32 OTA应用开发--通过串口/RS485实现OTA升级(方式2) 前言 1 环境搭建 2 功能描述 3 程序 ...

  7. STM32开发板学习笔记【5】UART 串口 1 数据收发实验

    实验目的: 串口的使用对于我们开发调试过程中的作用是非常之大,可以用来查看,打印以及输入相关信息.所 以对串口的调试使用要熟练掌握. 实验内容: 编写串口 1 数据收发程序.调试编译好程序后,将程序下 ...

  8. HMI智能串口屏——在STM32开发板上的实战应用及其详解

    HMI智能串口屏--在STM32开发板上的实战应用及其详解 一.HMI智能串口屏使用步骤 二.附录 一.HMI智能串口屏使用步骤 安装USART HMI软件 (一般买的串口屏里面,商家送的资料里面都有 ...

  9. 【嵌入式系统开发11】串口通讯“小试牛刀”——完成一个STM32的USART串口通讯程序

    本文目的是主要介绍通过STM32F103C8T6完成一个STM32的USART串口通讯程序,在没有示波器条件下,使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形. 文章目录 前言 (一)需求分析 ...

最新文章

  1. Linux操作系统无人值守安装配置指南
  2. Qt之QObjectCleanupHandler使用介绍
  3. 机器学习经典算法实践_服务机器学习算法的系统设计-不同环境下管道的最佳实践
  4. 最大权闭合图hdu3996
  5. 使用 Warshall(沃舍尔)算法求解关系的传递闭包
  6. C语言程序设计基础讲座之函数
  7. ICCV 2019 | 厦大提出快速NAS检索方法,四小时搜索NN结构
  8. 西华大学计算机专业怎么样呢,西华大学(专业学位)计算机技术考研难吗
  9. 文件的HANDLE转化为FILE*!!!
  10. MATLAB机械动力分析,基于MATLAB的柔性机械臂动力学分析
  11. 软件质量 软件测试和质量保证
  12. USB协议详解第17讲(USB事务总结)
  13. linux filesystem not open,建立物理卷报错Can't open /dev/sdb5 exclusively. Mounted filesystem的问题解决过程记录...
  14. 《Robot Framework自动化测试修炼宝典》道长
  15. 超越授权使用计算机,提供侵入、非法控制计算机信息系统程序、工具罪
  16. 大数据信息安全问题有哪些
  17. 1367918-21-5,Methylamino-PEG1-acid HCl salt带有甲胺基和羧酸的PEG连接剂
  18. unity避免相机穿墙
  19. 动态域名解析概述及操作步骤讲解
  20. Echarts 鼠标hover时柱状图设置背景色

热门文章

  1. 英语听说计算机考试演练专用,新中考首次英语听说机考12月23日举行,9月28日全体中学生模拟演练!...
  2. anaconda如何更改环境配置_Anaconda环境配置2020-08-27
  3. 看完这些福利才知道,为什么说双12一定要出去浪
  4. Android多媒体开发-- android中OpenMax的实现整体框架
  5. 给MVC中的V设计一个框架
  6. firefox2.0的拖放式搜索怎么不行了?是设置问题吗?
  7. java引用类的关键字_java中定义类通常使用的关键字有哪些
  8. mysql多源复制相同数据库名称_mysql数据库多源复制方案
  9. Ext Ajax:如何调用Ext.Ajax.request方法和使用Java Servlet进行处理
  10. 深度学习之迁移学习实现神奇宝贝识别