找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3374|回复: 0
打印 上一主题 下一主题
收起左侧

stm32 DEBUG USART程序

[复制链接]
跳转到指定楼层
楼主
ID:72519 发表于 2015-1-23 01:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #ifndef _DEBUGUSART_H_
  2. #define _DEBUGUSART_H_
  3. #include  <stm32f10x.h>
  4. #include<stdio.h>

  5. #define USE_USART             3

  6. #if(USE_USART==1)
  7. #define DEBUG_USART             USART1
  8. #define DEBUGRX_PORT      GPIOA
  9. #define DEBUGRX_PIN      GPIO_Pin_10//RX
  10. #define DEBUGTX_PORT      GPIOA
  11. #define DEBUGTX_PIN      GPIO_Pin_9//TX
  12. #define DEBUG_USART_IRQn        USART1_IRQn
  13. #define DEBUG_RCC_APBnPeriphClockCmd() RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
  14. #endif

  15. #if (USE_USART==3)
  16. #define DEBUG_USART             USART3
  17. #define DEBUGRX_PORT      GPIOD
  18. #define DEBUGRX_PIN      GPIO_Pin_9//RX
  19. #define DEBUGTX_PORT      GPIOD
  20. #define DEBUGTX_PIN      GPIO_Pin_8//TX
  21. #define DEBUG_USART_IRQn        USART3_IRQn
  22. #define DEBUG_RCC_APBnPeriphClockCmd() RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);\
  23.                                        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);\
  24.                                        GPIO_PinRemapConfig(GPIO_FullRemap_USART3,ENABLE);
  25. #endif


  26. void UARTGPIO_config(void);//串口IO口配置
  27. void USART_config(u32 baudrate);//串口初始化
  28. void UARTNVIC_config(void);//配置中断
  29. int  fputc(int ch, FILE *f);//发送数据
  30. int  fgetc(FILE *f); // 接收数据
  31. int  USART_Scanf_Name(char * str);
  32. void DEBUGUSART(u32 baudrate);
  33. #endif
  34. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. #include"DEBUG_USART.H"

  37. void DEBUGUSART(u32 baudrate)
  38. {  
  39. USART_config(baudrate);   //串口初始化19200
  40.   UARTGPIO_config();      //串口IO口配置
  41. }

  42. void UARTGPIO_config(void)//串口IO口配置
  43. {
  44. GPIO_InitTypeDef GPIO_InitStructure;
  45. //GPIO_StructInit(&GPIO_InitStructure);//用默认值初始化结构体为所有端口2M浮空输入
  46. GPIO_InitStructure.GPIO_Pin = DEBUGTX_PIN;//PA9作为US1的TX端,负责发送数据
  47. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出模式
  48. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//2M
  49. GPIO_Init(DEBUGTX_PORT,&GPIO_InitStructure);//用以上值初始化PA9口

  50. GPIO_InitStructure.GPIO_Pin = DEBUGRX_PIN;//PA10作为US1的RX端,负责接收数据
  51. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式
  52. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//2M
  53. GPIO_Init(DEBUGRX_PORT, &GPIO_InitStructure);//用以上值初始化PA10口
  54. }

  55. void USART_config(u32 baudrate)//串口初始化
  56. {
  57. USART_InitTypeDef USART_InitStructure;
  58. DEBUG_RCC_APBnPeriphClockCmd();       
  59. USART_StructInit(&USART_InitStructure);//将结构体设置为缺省状态,9600bps,8数据位,1停止位,不校验,硬件流控制失能
  60. USART_InitStructure.USART_BaudRate =baudrate;//波特率设置为19200
  61. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//一帧数据的宽度设置为8bits
  62. USART_InitStructure.USART_StopBits = USART_StopBits_1;//在帧结尾传输1个停止位
  63. USART_InitStructure.USART_Parity = USART_Parity_No;//奇偶失能模式,无奇偶校验
  64. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送/接收使能
  65. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制失能
  66. USART_Init(DEBUG_USART, &USART_InitStructure);//设置串口1
  67. //USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE);//打开串口1的接收中断响应函数
  68. USART_Cmd(DEBUG_USART, ENABLE);//打开串口1
  69. }


  70. void UARTNVIC_config()//配置中断
  71. {
  72. NVIC_InitTypeDef NVIC_InitStructure;
  73. //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//选择中断分组1
  74. NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQn;//选择串口1中断
  75. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占式中断优先级设置为0
  76. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//响应式中断优先级设置为3
  77. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断
  78. NVIC_Init(&NVIC_InitStructure);
  79. }


  80. /*
  81. void DEBUG_USART_IRQHandler(void)//中断方式的USART接收
  82. {
  83. if (USART_GetITStatus(DEBUG_USART, USART_IT_RXNE) != RESET)  //判断发生接收中断
  84. {//USART_ClearITPendingBit(DEBUG_USART,  USART_IT_RXNE);    //清除中断标志,读接收到的数据时自动清除
  85. USART_SendData(DEBUG_USART, USART_ReceiveData(DEBUG_USART));//将数据回送至电脑
  86. while(USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TC) == RESET);//等待数据发送完毕
  87. }
  88. }*/

  89. /*
  90. if (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) != RESET)  //判断接收标志;查询方式的USART接收
  91. {
  92. USART_ReceiveData(DEBUG_USART);
  93. }
  94. USART_SendData(DEBUG_USART, i);//将数据回送至电脑
  95. while(USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TC) == RESET);//等待数据发送完毕
  96. */

  97. int fputc(int ch, FILE *f)//发送数据
  98.    {
  99.       USART_SendData(DEBUG_USART, (unsigned char) ch);//
  100.       while (!(DEBUG_USART->SR & USART_FLAG_TXE));
  101.       return (ch);
  102.    }



  103. int fgetc(FILE *f) // 接收数据
  104.   {
  105.       while (!(DEBUG_USART->SR & USART_FLAG_RXNE));
  106.       return ((int)(DEBUG_USART->DR & 0x1FF));
  107.    }
  108. //如果要使用printf函数除了#include<stdio.h>和重定义两个输入输出函数外还应该Target->Code Generation中勾选Use MicroLIB
  109. //char ch='E',str[10]={"FGHIJKLM"};
  110. //int intd=12345;
  111. //printf("The is a example!\n");
  112. //printf("%c\n%s\n%d\n%c\n%s\n%d\n%d\n",'A',"BCD",0x23,ch,str,ch,intd);
  113. //The is a example!
  114. //A
  115. //BCD
  116. //35
  117. //E
  118. //FGHIJKLM
  119. //69
  120. //12345
  121. /*******************************************************************************
  122. * Function Name  : USART_Scanf_Name
  123. * Description    : Gets Char values from the hyperterminal.
  124. * Input          : None
  125. * Output         : None
  126. * Return         : Length
  127. *******************************************************************************/
  128. int USART_Scanf_Name(char * str)
  129. {       
  130.     u16 index = 0;
  131. USART_ClearFlag(DEBUG_USART,USART_FLAG_RXNE);//清一下接收标志位
  132.     while(1)
  133.     {
  134.         /* Loop until RXNE = 1 */
  135.         while(USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET){}//等待直到有数据的到来
  136.         
  137. str[index++] = (USART_ReceiveData(DEBUG_USART));
  138.    printf("%c",str[index - 1]);//返回输入的内容
  139.    if(str[index - 1] == 0x0d)//回车键\r
  140.    {  
  141.        index--;//去掉回车符并以\0结尾
  142. str[index] ='\0';//结束符号
  143.        return index;
  144.         }
  145.     }       
  146. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表