野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10233|回复: 1

USART中,printf函数不能正常作用

[复制链接]
发表于 2019-1-28 15:17:33 | 显示全部楼层 |阅读模式
在学习USART过程中,32可以使用编写的函数给电脑发字节和半字,但是用printf函数后,程序可以编译可以烧录,但电脑不能显示字符串。
已经在外设驱动头文件中包含stdio.h,也已经在外设驱动c文件中添加重定向c库函数。下面是main.c和bsp_usart.c的代码:

main.c

  1. #include "stm32f10x.h"
  2. #include "./led/bsp_led.h"
  3. #include "./usart/bsp_usart.h"

  4. void delay(uint32_t count)
  5. {
  6.        
  7.         for(;count!=0;count--);
  8.        
  9. }

  10. int main(void)
  11. {

  12.         LED_GPIO_Config();
  13.         USART_Config();
  14.   //Usart_SendString(DEBUG_USARTx  ,"asfas\n");
  15.         printf("sddscdc");


  16.         while(1)
  17.         {

  18.                 GPIO_SetBits(G_LED_GPIO_PORT,G_LED_GPIO_PIN);
  19.                 GPIO_ResetBits(B_LED_GPIO_PORT,B_LED_GPIO_PIN);
  20.                 GPIO_SetBits(R_LED_GPIO_PORT,R_LED_GPIO_PIN);
  21.                 delay(0xffffff);
  22.        
  23.                 GPIO_ResetBits(G_LED_GPIO_PORT,G_LED_GPIO_PIN);
  24.                 GPIO_SetBits(B_LED_GPIO_PORT,B_LED_GPIO_PIN);
  25.                 GPIO_SetBits(R_LED_GPIO_PORT,R_LED_GPIO_PIN);
  26.                 delay(0xffffff);
  27.                
  28.                 GPIO_SetBits(G_LED_GPIO_PORT,G_LED_GPIO_PIN);
  29.                 GPIO_SetBits(B_LED_GPIO_PORT,B_LED_GPIO_PIN);
  30.                 GPIO_ResetBits(R_LED_GPIO_PORT,R_LED_GPIO_PIN);
  31.                 delay(0xffffff);

  32.         }

  33. }


复制代码

bsp_usart.c

  1. #include "./usart/bsp_usart.h"

  2. /**
  3.   * [url=home.php?mod=space&uid=41770]@brief[/url]  配置嵌套向量中断控制器NVIC
  4.   * @param  无
  5.   * @retval 无
  6.   */
  7. //static void NVIC_Configuration(void)
  8. //{
  9. //  NVIC_InitTypeDef NVIC_InitStructure;
  10. //  
  11. //  /* 嵌套向量中断控制器组选择 */
  12. //  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  13. //  
  14. //  /* 配置USART为中断源 */
  15. //  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;
  16. //  /* 抢断优先级*/
  17. //  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  18. //  /* 子优先级 */
  19. //  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  20. //  /* 使能中断 */
  21. //  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  22. //  /* 初始化配置NVIC */
  23. //  NVIC_Init(&NVIC_InitStructure);
  24. //}

  25. void USART_Config(void)
  26. {
  27.         GPIO_InitTypeDef GPIO_InitStructure;
  28.         USART_InitTypeDef USART_InitStructure;

  29.         // 打开串口GPIO的时钟
  30.         DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
  31.        
  32.         // 打开串口外设的时钟
  33.         DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

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

  39.   // 将USART Rx的GPIO配置为浮空输入模式
  40.         GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
  41.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  42.         GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
  43.        
  44.         // 配置串口的工作参数
  45.         // 配置波特率
  46.         USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
  47.         // 配置 针数据字长
  48.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  49.         // 配置停止位
  50.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  51.         // 配置校验位
  52.         USART_InitStructure.USART_Parity = USART_Parity_No ;
  53.         // 配置硬件流控制
  54.         USART_InitStructure.USART_HardwareFlowControl =
  55.         USART_HardwareFlowControl_None;
  56.         // 配置工作模式,收发一起
  57.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  58.         // 完成串口的初始化配置
  59.         USART_Init(DEBUG_USARTx, &USART_InitStructure);
  60.        
  61.         // 串口中断优先级配置
  62. //        NVIC_Configuration();
  63.        
  64.         // 使能串口接收中断
  65. //        USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);       
  66.        
  67.         // 使能串口
  68.         USART_Cmd(DEBUG_USARTx, ENABLE);            
  69. }

  70. void Usart_SendByte(USART_TypeDef* USARTx,uint8_t data)//发送字节
  71. {
  72.         USART_SendData(USARTx, data);
  73.         while( (USART_GetFlagStatus( USARTx,USART_FLAG_TXE))==RESET );

  74. }
  75. void Usart_HalfWord(USART_TypeDef* USARTx,uint16_t data)//发送半字
  76. {
  77.         uint8_t data_H,data_L;
  78.         data_L=((data)&0xff);
  79.         data_H=(data&0xff00)>>8;
  80.         Usart_SendByte(USARTx, data_H);
  81.         Usart_SendByte(USARTx, data_L);

  82. }
  83. void Usart_SendArry(USART_TypeDef* USARTx,uint8_t *arry,uint8_t size)//发送数组
  84. {
  85.         uint8_t i;
  86.         for(i=0;i<size;i++)
  87.         {
  88.                 Usart_SendByte(USARTx, *arry++);
  89.                
  90.         }
  91.         while( (USART_GetFlagStatus( USARTx,USART_FLAG_TC))==RESET );
  92.        
  93. }
  94. void Usart_SendString(USART_TypeDef* USARTx,char *string)//发送字符串
  95. {
  96.          while(*string!='\0')
  97.         {
  98.                 Usart_SendByte(USARTx, *string++);
  99.                
  100.         }
  101.         while( (USART_GetFlagStatus( USARTx,USART_FLAG_TC))==RESET );
  102.        
  103. }

  104. ///重定向c库函数printf到串口,重定向后可使用printf函数
  105. int fputc(int ch, FILE *f)
  106. {
  107.                 /* 发送一个字节数据到串口 */
  108.                 USART_SendData(DEBUG_USARTx, (uint8_t) ch);
  109.                
  110.                 /* 等待发送完毕 */
  111.                 while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);               
  112.        
  113.                 return (ch);
  114. }

  115. ///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
  116. int fgetc(FILE *f)
  117. {
  118.                 /* 等待串口输入数据 */
  119.                 while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

  120.                 return (int)USART_ReceiveData(DEBUG_USARTx);
  121. }


复制代码

请大家帮我看看^_^。
回复

使用道具 举报

发表于 2019-1-29 22:53:02 | 显示全部楼层
我试过了代码没有问题,应该是你没有勾选魔术棒内Target选项卡中的Use MicroLIB选项
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 08:55 , Processed in 0.036181 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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