OpenEdv-开源电子网

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

关于用串口进行printf的问题

[复制链接]

7

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-7-23
在线时间
12 小时
发表于 2019-11-17 11:34:36 | 显示全部楼层 |阅读模式
8金钱
在使用正点原子官方提供的usart.c时,将串口一重映射到PB6和PB7,首先是使能PORTB和串口一和复用时钟,然后将对应IO口初始化,再将串口一重映射到PB6、PB7,调用函数进行初始化之后使用printf函数在电脑上面无法接收到数据,请问是还有哪部分需要修改吗?
  1. void uart_init(u32 pclk2,u32 bound)
  2. {           
  3.         float temp;
  4.         u16 mantissa;
  5.         u16 fraction;          
  6.         temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
  7.         mantissa=temp;                                 //得到整数部分
  8.         fraction=(temp-mantissa)*16; //得到小数部分         
  9.     mantissa<<=4;
  10.         mantissa+=fraction;
  11.         RCC->APB2ENR|=0x01;
  12.         RCC->APB2ENR|=1<<3;   //使能PORTB口时钟  
  13.         RCC->APB2ENR|=1<<14;  //使能串口时钟
  14.         GPIOB->CRL&=0X00FFFFFF;//IO状态设置                        //Pin6,Pin7
  15.         GPIOB->CRL|=0X8B000000;//IO状态设置                         //需要修改
  16.         AFIO->MAPR  |= 0x01<<2;
  17.         RCC->APB2RSTR|=1<<14;   //复位串口1                       
  18.         RCC->APB2RSTR&=~(1<<14);//停止复位                     
  19.         //波特率设置
  20.         USART1->BRR=mantissa; // 波特率设置         
  21.         USART1->CR1|=0X200C;  //1位停止,无校验位.
  22. #if EN_USART1_RX                  //如果使能了接收
  23.         //使能接收中断
  24.         USART1->CR1|=1<<5;    //接收缓冲区非空中断使能                   
  25.         MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
  26. #endif
  27. }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-11-18 01:56:27 | 显示全部楼层
回复

使用道具 举报

7

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-7-23
在线时间
12 小时
 楼主| 发表于 2019-11-19 19:50:14 | 显示全部楼层

我设置了AFIO->MAPR,看了一些代码也是只配置了这个寄存器,是不是还有其他地方需要配置?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-11-20 02:43:43 | 显示全部楼层
Tgnrb2000 发表于 2019-11-19 19:50
我设置了AFIO->MAPR,看了一些代码也是只配置了这个寄存器,是不是还有其他地方需要配置?

得使能AIFO时钟,才能设置
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

16

帖子

0

精华

高级会员

Rank: 4

积分
723
金钱
723
注册时间
2019-9-25
在线时间
51 小时
发表于 2019-11-20 08:46:35 | 显示全部楼层
小白前来学习  帮顶
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2015-8-25
在线时间
1035 小时
发表于 2019-11-20 11:38:29 | 显示全部楼层
fputc重定向改没?
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

7

主题

11

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-7-23
在线时间
12 小时
 楼主| 发表于 2019-11-20 19:13:21 | 显示全部楼层

没有改,这个我不知道怎么改、
我看了代码里面是和USART1相关的寄存器好像和使用的GPIO无关
  1. int fputc(int ch, FILE *f)
  2. {      
  3.         while((USART1->SR&0X40)==0);//等待上一次串口数据发送完成  
  4.         USART1->DR = (u8) ch;              //写DR,串口1将发送数据
  5.         return ch;
  6. }
复制代码
回复

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2019-6-9
在线时间
54 小时
发表于 2020-3-19 18:07:33 | 显示全部楼层
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif
回复

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2019-6-9
在线时间
54 小时
发表于 2020-3-19 18:08:08 | 显示全部楼层
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
void _sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif

将这个写到你的uart.c里面去
回复

使用道具 举报

0

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2019-6-9
在线时间
54 小时
发表于 2020-3-19 18:08:35 | 显示全部楼层
pragma用于指示编译器完成一些特定的动作。
#pragma import(__use_no_semihosting_swi)
    在嵌入式程序编译时如果出现printf、fopen、fclose等文件操作,因程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,这时就需要__use_no_semihosting_swi这个声明,使程序遇到这些文件操作函数时不停在此中断处。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-22 23:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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