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的内容了

时间: 2024-10-03 05:05:00

stm32开发之串口的调试的相关文章

Eclipse + CDT + YAGARTO + J-Link,STM32开源开发环境搭建与调试

Eclipse+CDT+YAGARTO+J-Li:开源开发环境搭建与调试:作者:Chongqing:邮箱:ycq.no1@163.com:文档版本:V1.0:发布日期:2014-08-04:前言:此文档本着开源精神,基于LGPL协议发布:因网上开源的单片机.微控制器开发平台信息很少,故:因用ARM公司的KeiluVision开发环境开:因Eclipse是一个       Eclipse + CDT + YAGARTO + J-Link,STM32 开源开发环境搭建与调试 作者 :Chongqin

单片机-stm32开发版可以正常使用at24c02,

问题描述 stm32开发版可以正常使用at24c02, 我把02芯片换成24c32以后,在头文件中把类型换成了对应的32,但是上电以后确实不能读写的,可能是什么原因 解决方案 http://www.51hei.com/bbs/dpj-35372-1.html 解决方案二: AT24C02和AT24C32的区别 I2C调试小技巧AT24C02STM32外设驱动篇--AT24C02(I2C接口) 解决方案三: 你提的问题资源很少,无法分析不过可以给你提出一些建议 对于芯片型号的更换,即使是同一系列的

Visual Studio 原生开发的10个调试技巧(二)

原文:Visual Studio 原生开发的10个调试技巧(二) 我以前关于 Visual Studio 调试技巧的文章引起了大家很大的兴趣,以至于我决定分享更多调试的知识.以下的列表中你可以看到写原生开发的调试技巧(接着以前的文章来编号).这些技巧可以应用在 VS2005 或者更新版本中(当然有一些可以适用于旧版本).如果你继续,你可以知道每个技巧的详细信息. 数据断点 线程重命名 特定进程中断 大概执行时间 数字格式化 内存数据格式化 系统DLL中断 装载符号表 MFC中内存泄露报告 调试A

Visual Studio原生开发的10个调试技巧(一)

原文:Visual Studio原生开发的10个调试技巧(一) 最近碰巧读了Ivan Shcherbakov写的一篇文章,<11个强大的Visual Studio调试小技巧>.这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧.我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧.(如果你是工作在托管代码下,调试器会有更多的特性,在CodeProject中有介绍它们的文章),下面是我的整理的一些技巧: 异常中断 | B

zigbee 串口-关于zigbee的协议栈开发时串口无法读写

问题描述 关于zigbee的协议栈开发时串口无法读写 各位朋友大家好: 我最近在做一个基于zigbee的数据采集,使用的工具是(fantai)cc2530,但是在使用过程中遇到了串口无法读写,我看了好多网上的解释,在条件设置的地方设置了HAL_UART=TRUE,但是还是无法成功进行读写.反复查询还是没能解决.希望能得到哪位大神的帮组啊.

c#-C#串口通信问题,串口助手调试和真机测试不一样

问题描述 C#串口通信问题,串口助手调试和真机测试不一样 我用的两台电脑装串口助手来测试发送信息,发送的是16进制信息.通过串口调试助手测试发送的信息是没有问题的.然后链接机器发送信息,机器没反映,用串口助手发送信息机器能正常运行,大神能指出哪里可能出问题? 解决方案 C# 串口通信调试助手1编程练习:串口通信调试助手 解决方案二: 串口助手发送能正常,那就建议看看你的串口初始化吧.

vsphere 二次开发添加串口

问题描述 vsphere 二次开发添加串口 各位大神,有谁在做vsphere java api二次开发吗,跪求添加串口的代码??? 解决方案 java串口APIhttp://download.csdn.net/detail/Chen_j_m/2412945

xdebug-zend studio+IIS+mysql开发环境下Xdeug调试配置失败

问题描述 zend studio+IIS+mysql开发环境下Xdeug调试配置失败 配置基本没错,但是在调试的时候,出现了如下的提示,求大神指教

stm32开发之使用Keil MDK以及标准外设库创建STM32工程

通过上一节对标准外设库的介绍,想必各位读者对标准外设库已经有了基本的认识,然而由于标准外设库中文件众多,很多初学者在开始很长一段时间内甚至都无法完全自己建立一个工程,很多人只是依赖标准外设库或给定的工程模板.本节就介绍怎样利用Keil MDK开发环境和标准外设库来搭建自己的工程. 建立一个基于标准外设库其实并不复杂,网络上也有很多关于怎样在Keil MDK下建立工程的教程,方法也各异,本节所介绍的方法本着少改动.便于使用.方便更换器件等原则,给大家介绍怎样在Keil中创建一个工程,并以一个最简单