OpenEdv-开源电子网

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

请问各位,我把战舰开发板例程里面的串口1通信想改为串口2,但是它打印不了,除了改引脚中断这些配置还需要还需要改什么吗?

[复制链接]

25

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2022-11-1
在线时间
53 小时
发表于 2023-4-21 10:24:57 | 显示全部楼层 |阅读模式
1金钱
请问各位,我把战舰开发板例程里面的串口1通信想改为串口2,但是它打印不了,除了改引脚中断这些配置还需要还需要改什么吗?

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

使用道具 举报

29

主题

167

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1011
金钱
1011
注册时间
2021-7-26
在线时间
184 小时
发表于 2023-4-21 10:26:58 | 显示全部楼层
改引脚,改寄存器,用printf的话还要改重映射
回复

使用道具 举报

25

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2022-11-1
在线时间
53 小时
 楼主| 发表于 2023-4-21 11:01:46 | 显示全部楼层
精英板 发表于 2023-4-21 10:26
改引脚,改寄存器,用printf的话还要改重映射

寄存器和重映射在哪改
回复

使用道具 举报

26

主题

1538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6376
金钱
6376
注册时间
2015-8-25
在线时间
1004 小时
发表于 2023-4-21 13:04:16 | 显示全部楼层
wsh15249375668 发表于 2023-4-21 11:01
寄存器和重映射在哪改

printf重映射在usart.c中改,fputc函数中将USART1改为USART2
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.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

25

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2022-11-1
在线时间
53 小时
 楼主| 发表于 2023-4-21 14:20:48 | 显示全部楼层
szczyb1314 发表于 2023-4-21 13:04
printf重映射在usart.c中改,fputc函数中将USART1改为USART2

大佬你看这是我修改完的源文件,但是它就是打印不出来东西
  1. #include "sys.h"
  2. #include "usart.h"          




  3. //如果使用ucos,则包括下面的头文件即可.
  4. #if SYSTEM_SUPPORT_OS
  5. #include "includes.h"                                        //ucos 使用          
  6. #endif


  7. //加入以下代码,支持printf函数,而不需要选择use MicroLIB          
  8. #if 1
  9. #pragma import(__use_no_semihosting)            
  10. //标准库需要的支持函数                 
  11. struct __FILE
  12. {
  13.         int handle;

  14. };

  15. FILE __stdout;      
  16. //定义_sys_exit()以避免使用半主机模式   
  17. void _sys_exit(int x)
  18. {
  19.         x = x;
  20. }
  21. //重定义fputc函数
  22. int fputc(int ch, FILE *f)
  23. {      
  24.         while((USART2->SR&0X40)==0);//循环发送,直到发送完毕   
  25.     USART2->DR = (u8) ch;      
  26.         return ch;
  27. }
  28. #endif

  29. /*使用microLib的方法*/
  30. /*
  31. int fputc(int ch, FILE *f)
  32. {
  33.         USART_SendData(USART1, (uint8_t) ch);

  34.         while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET) {}       
  35.    
  36.     return ch;
  37. }
  38. int GetKey (void)  {

  39.     while (!(USART2->SR & USART_FLAG_RXNE));

  40.     return ((int)(USART2->DR & 0x1FF));
  41. }
  42. */

  43. #if EN_USART2_RX  
  44. u8 USART_RX_BUF[USART_REC_LEN];     
  45. u16 USART_RX_STA=0;      
  46.   
  47. void uart_init(u32 bound)
  48. {
  49.         GPIO_InitTypeDef GPIO_InitStructure;
  50.         USART_InitTypeDef USART_InitStructure;
  51.         NVIC_InitTypeDef NVIC_InitStructure;
  52.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);        //
  53.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);      //串口2是挂载在APB1下面的外设

  54.         //USART1_TX连接在PA9上
  55.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  56.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  57.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
  58.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  59.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;   //USART1_RX在PA10上
  60.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  61.         GPIO_Init(GPIOA, &GPIO_InitStructure);

  62.         NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  63.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
  64.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;               
  65.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
  66.         NVIC_Init(&NVIC_InitStructure);       

  67.        
  68.         USART_InitStructure.USART_BaudRate = 115200;
  69.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  70.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  71.         USART_InitStructure.USART_Parity = USART_Parity_No;
  72.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  73.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  74.   USART_Init(USART2, &USART_InitStructure);
  75.        
  76.        
  77.   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  78.   USART_Cmd(USART2, ENABLE);                  

  79. }

  80. void USART2_IRQHandler(void)                        //串口1中断响应函数
  81. {
  82.         u8 Res;
  83. #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  84.         OSIntEnter();   
  85. #endif
  86.         if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //判断是否接收中断,如果接受中断,
  87.                 //则读取串口接受到的数据(接收到的数据必须是0x0d 0x0a结尾)
  88.        

  89.         {
  90.                 Res =USART_ReceiveData(USART2);        //读取接收到的数据
  91.                
  92.                 if((USART_RX_STA&0x8000)==0)//接收未完成
  93.                         {
  94.                         if(USART_RX_STA&0x4000)//接收到了0x0d
  95.                                 {
  96.                                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  97.                                 else USART_RX_STA|=0x8000;        //接收完成了
  98.                                 }
  99.                         else //还没收到0X0D
  100.                                 {       
  101.                                 if(Res==0x0d)USART_RX_STA|=0x4000;
  102.                                 else
  103.                                         {
  104.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  105.                                         USART_RX_STA++;
  106.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
  107.                                         }                 
  108.                                 }
  109.                         }                    
  110.      }
  111. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  112.         OSIntExit();                                                                                           
  113. #endif
  114. }
  115. #endif       
复制代码
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2023-4-21 17:53:05 | 显示全部楼层
wsh15249375668 发表于 2023-4-21 14:20
大佬你看这是我修改完的源文件,但是它就是打印不出来东西

第42行 不对  改的时候全局搜索一下有没有漏的 或者从第一行 逐行改
回复

使用道具 举报

25

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2022-11-1
在线时间
53 小时
 楼主| 发表于 2023-4-23 15:52:43 | 显示全部楼层
babyrabbit 发表于 2023-4-21 17:53
第42行 不对  改的时候全局搜索一下有没有漏的 或者从第一行 逐行改

都改完了,就是打印不了,串口1可以,串口2就不行了
回复

使用道具 举报

11

主题

31

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2022-8-19
在线时间
17 小时
发表于 2023-6-21 14:33:22 | 显示全部楼层
请问楼主解决了吗?我也是这样改的,打印的全是乱码,无法实现printf功能
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-6-21 15:23:46 | 显示全部楼层
简单方式就是用cubemx或者cubeide生成下就好了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 06:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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