OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 270|回复: 12

新人求助,如何用uart3实现printf

[复制链接]

7

主题

23

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-8
在线时间
8 小时
发表于 2019-7-18 09:59:39 | 显示全部楼层 |阅读模式
3金钱
RT,因为调试过程中UART1被其他功能占用,因此需要使用UART3打印数据到屏幕上。但是更改了fputc函数中的uart1为uart3之后仍无法实现。程序卡在
while((USART3->SR&0X40)==0);//循环发送,直到发送完毕
这个循环中。
个人认为可能原因是USART3出于某种原因没有成功能够发送数据,但具体细节及解决方案还是不清楚。

具体代码如下:
//加入以下代码,支持printf函数,而不需要选择MicroLIB   
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数               
struct __FILE
{
int handle;
};
FILE __stdout;      
//定义sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
while((USART3->SR&0X40)==0);//循环发送,直到发送完毕
    USART3->DR = (u8) ch;      
return ch;
}
#endif

最佳答案

查看完整内容[请看2#楼]

问题大概解决了,出在UART3的时钟没使能。我用错了库函数!! 没注意到还有RCC_APB2PeriphClockCmd()和RCC_APB1PeriphClockCmd()的区别
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-8
在线时间
8 小时
 楼主| 发表于 2019-7-18 09:59:40 | 显示全部楼层
问题大概解决了,出在UART3的时钟没使能。我用错了库函数!!
没注意到还有RCC_APB2PeriphClockCmd()和RCC_APB1PeriphClockCmd()的区别
回复

使用道具 举报

2

主题

812

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5598
金钱
5598
注册时间
2015-1-15
在线时间
1061 小时
发表于 2019-7-18 10:28:18 | 显示全部楼层
串口USART3配置设置好了?
一分耕耘一分收获。
回复

使用道具 举报

10

主题

410

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2174
金钱
2174
注册时间
2017-4-12
在线时间
514 小时
发表于 2019-7-18 12:51:47 | 显示全部楼层
串口3有配置?有初始化?
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-6-20
在线时间
0 小时
发表于 2019-7-18 13:41:08 | 显示全部楼层
好文章,必须顶贴

https://www.jianshu.com/p/d9a33a38aab1
https://www.douban.com/note/726028148/

回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-8
在线时间
8 小时
 楼主| 发表于 2019-7-18 16:38:58 | 显示全部楼层
yklstudent 发表于 2019-7-18 10:28
串口USART3配置设置好了?

有,UART3串口有初始化。
批注 2019-07-18 163801.jpg
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-8
在线时间
8 小时
 楼主| 发表于 2019-7-18 16:39:44 | 显示全部楼层
245925587 发表于 2019-7-18 12:51
串口3有配置?有初始化?

有初始化,可以看下面的图。
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2019-4-29
在线时间
10 小时
发表于 2019-7-18 16:50:20 | 显示全部楼层
#include "sys.h"
#include "stdio.h"
#include "string.h"
#include "stdarg.h"
#include "uart3.h"

u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //½óêÕ»o3å×î′ó×Ö½ú
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //·¢Ëí»o3å×î′ó×Ö½ú

u16 USART3_RX_STA = 0;

void uart3_init(u32 bound)
{
        GPIO_InitTypeDef GPIO_InitStructure;//GPIO
        USART_InitTypeDef USART_InitStructure;//′®¿ú
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
       
        USART_DeInit(USART3);  //¸′λ′®¿ú3
        //USART3_TX   PB10
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
        GPIO_Init(GPIOB, &GPIO_InitStructure); //3õê¼»ˉPB10
        //USART3_RX          PB11
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
        GPIO_Init(GPIOB, &GPIO_InitStructure);  //3õê¼»ˉPB11
       
        USART_InitStructure.USART_BaudRate = bound;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæżD£Ñéλ
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½
        USART_Init(USART3, &USART_InitStructure); //3õê¼»ˉ′®¿ú        3
       
        USART_Cmd(USART3, ENABLE);                    //ê1Äü′®¿ú
       
        USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//¿aÆôÖD¶Ï  
       
        //éèÖÃÖD¶ÏóÅÏ輶
        NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//ÇàÕ¼óÅÏ輶3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //×óóÅÏ輶3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷       
}

void USART3_IRQHandler(void)
{
        u8 Res;
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //½óêÕÖD¶Ï(½óêÕμ½μÄêy¾Y±ØDëêÇ0x0d 0x0a½áÎ2)
        {
                Res =USART_ReceiveData(USART3);        //¶á衽óêÕμ½μÄêy¾Y
                if((USART3_RX_STA&0x8000) == 0)//½óêÕÎ′íê3é
                {
                        if(USART3_RX_STA&0x4000)//½óêÕμ½áË0x0d
                        {
                                if(Res != 0x0a)
                                        USART3_RX_STA = 0;//½óêÕ′íÎó
                                else
                                        USART3_RX_STA|= 0x8000;//½óêÕíê3é
                        }
                        else                    //»1Î′½óêÕμ½0x0d
                        {
                                if(Res==0x0d)
                                        USART3_RX_STA |= 0x4000;
                                else
                                {
                                        USART3_RX_BUF[USART3_RX_STA&0x3fff] = Res;
                                        USART3_RX_STA++;
                                        if(USART3_RX_STA>(USART3_MAX_RECV_LEN-1))
                                                USART3_RX_STA = 0;//½óêÕ′íÎó
                                }
                        }                               
                }
        }
}
/*′®¿ú3·¢Ëíoˉêy*/
void u3_printf(char* fmt,...)
{
        u16 i,j;
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)USART3_TX_BUF,fmt,ap);
        va_end(ap);
        i=strlen((const char*)USART3_TX_BUF);                //′Ë′η¢Ëíêy¾YμÄ3¤¶è
        for(j=0;j<i;j++)                                                        //&#209;-&#187;··¢&#203;íêy&#190;Y
        {
          while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //&#209;-&#187;··¢&#203;í,&#214;±μ&#189;·¢&#203;ííê±&#207;   
                USART_SendData(USART3,USART3_TX_BUF[j]);
        }
}
直接添加到你的工程里,可以直接用
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-8
在线时间
8 小时
 楼主| 发表于 2019-7-18 16:52:41 | 显示全部楼层
zejack 发表于 2019-7-18 16:50
#include "sys.h"
#include "stdio.h"
#include "string.h"

好的,我有空试试。现在又有新BUG出来了。
回复

使用道具 举报

22

主题

272

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
401
金钱
401
注册时间
2019-3-21
在线时间
107 小时
发表于 2019-7-18 16:53:34 | 显示全部楼层
Cuifamily111 发表于 2019-7-18 16:39
有初始化,可以看下面的图。

#include "usart.h"
#include "pms5003.h"
#include "stdio.h"

extern uint8_t data_cnt;
extern uint8_t counter;

void usart_config(void)
{
  //1:打开GPIO ,USART3的时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
  
  //2:初始化相应的串口引脚
  usart_release_gpio_int();
  
  //3:配置串口模式
  usart_para_config();
  
  //4:配置串口中断
  usart_nvic_config();
}

void usart_release_gpio_int(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;                   //USART3
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOC,&GPIO_InitStructure);
  
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_1);         //TX            
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_1);         //RX  
}

void usart_para_config(void)
{
  USART_InitTypeDef USART_InitStructure;
  
  USART_InitStructure.USART_BaudRate = 9600;         /*波特率*/
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   /*流控*/
  USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;    /*数据位,8*/
  USART_InitStructure.USART_Parity = USART_Parity_No;            /*校验位,n*/
  USART_InitStructure.USART_StopBits = USART_StopBits_1;         /*停止位,1*/
  USART_Init(USART3,&USART_InitStructure);
  
  USART_ClearFlag(USART3,USART_FLAG_TC);                    //清除发送完成标志位
  USART_Cmd(USART3,ENABLE);                                 //使能串口3
  
  USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
}

int fputc(int ch, FILE *f)                                    //IAR重定向printf函数
{
  //while (USART_GetFlagStatus(USART3,USART_FLAG_TC)  ==  RESET )
  while (USART_GetFlagStatus(USART3,USART_FLAG_TXE)  ==  RESET )
  {
   
  }
  USART_SendData(USART3,(uint8_t) ch);
  return ch;
}


参考一下我这个吧,
回复

使用道具 举报

7

主题

23

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-7-8
在线时间
8 小时
 楼主| 发表于 2019-7-18 17:39:41 | 显示全部楼层
1599064432 发表于 2019-7-18 16:53
#include "usart.h"
#include "pms5003.h"
#include "stdio.h"

谢谢,我有空试试。
回复

使用道具 举报

0

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-7-24
在线时间
17 小时
发表于 2019-7-26 10:13:50 | 显示全部楼层
如何只发送,不接受
回复

使用道具 举报

0

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-7-24
在线时间
17 小时
发表于 2019-7-26 10:14:50 | 显示全部楼层
直接用printf 实行串口发送
回复

使用道具 举报

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

本版积分规则



关闭

正点原子酷炫Linux来了,猛击上一条 /1 下一条

正点原子公众号

QQ|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2019-8-20 13:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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