OpenEdv-开源电子网

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

STM32F103C8T6的串口3如何配置

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-12-9
在线时间
4 小时
发表于 2021-1-4 22:33:18 | 显示全部楼层 |阅读模式
STM32F103C8T6的串口3能用吗?为什么怎么配置都不行,求指教,(ZET6的能用,但是程序移植在C8T6上串口3就没反应了)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

141

帖子

0

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2020-11-21
在线时间
67 小时
发表于 2021-1-5 11:19:02 | 显示全部楼层
  1. #include "uart3.h"

  2. void  uart3_init(u16 baud)
  3. {
  4.     GPIO_InitTypeDef GPIO_InitStructure;
  5.     USART_InitTypeDef USART_InitStructure;
  6.     NVIC_InitTypeDef  NVIC_InitStructure;

  7.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  8.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

  9.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  10.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  11.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.     GPIO_Init(GPIOB, &GPIO_InitStructure);

  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16.     GPIO_Init(GPIOB, &GPIO_InitStructure);

  17.     NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  18.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  19.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  20.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  21.     NVIC_Init(&NVIC_InitStructure);

  22.     USART_InitStructure.USART_BaudRate = baud;
  23.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  24.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  25.     USART_InitStructure.USART_Parity = USART_Parity_No;
  26.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  27.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  28.     USART_Init(USART3, &USART_InitStructure);

  29.     USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  30.     USART_Cmd(USART3, ENABLE);

  31. }

  32. void USART3_IRQHandler(void)
  33. {
  34.   u16 tem=0;
  35.         if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
  36.         {
  37.            tem = USART_ReceiveData(USART3);
  38.                 USART_SendData(USART3,tem);
  39.         }

  40. }
















复制代码
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2020-12-9
在线时间
4 小时
 楼主| 发表于 2021-1-7 14:41:20 | 显示全部楼层
已解决,谢谢
回复 支持 反对

使用道具 举报

15

主题

74

帖子

0

精华

初级会员

Rank: 2

积分
199
金钱
199
注册时间
2020-10-9
在线时间
34 小时
发表于 2021-5-12 16:06:58 | 显示全部楼层
怎么解决的?我串口三没反应
回复 支持 反对

使用道具 举报

25

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2022-11-1
在线时间
53 小时
发表于 2023-4-23 16:32:38 | 显示全部楼层

楼主怎么解决的,我的STM32F103RCT6的串口1可以用,改成串口2、3用不了
回复 支持 反对

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-4-24 14:19:58 | 显示全部楼层
wsh15249375668 发表于 2023-4-23 16:32
楼主怎么解决的,我的STM32F103RCT6的串口1可以用,改成串口2、3用不了

要看你接收端是什么信号ttl还是232,一般开发板1上面都有相应转换芯片,类似ch340,2,3如果没有,你即使发出来,也接收不到的,你可以用示波器或者逻辑分析仪之类看看芯片口输出的信号
回复 支持 反对

使用道具 举报

25

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2022-11-1
在线时间
53 小时
发表于 2023-4-25 11:29:40 | 显示全部楼层
a5820736 发表于 2023-4-24 14:19
要看你接收端是什么信号ttl还是232,一般开发板1上面都有相应转换芯片,类似ch340,2,3如果没有,你即使 ...

请问怎么看串口2、3上面有没有转换芯片
回复 支持 反对

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
发表于 2023-4-25 11:37:23 | 显示全部楼层
wsh15249375668 发表于 2023-4-25 11:29
请问怎么看串口2、3上面有没有转换芯片

把你初始化代码发出来看看
回复 支持 反对

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2023-4-25 12:16:40 | 显示全部楼层
wsh15249375668 发表于 2023-4-25 11:29
请问怎么看串口2、3上面有没有转换芯片

原理图呗
回复 支持 反对

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
发表于 2023-4-25 13:42:38 | 显示全部楼层

1能用,2、3不能用。感觉他是程序初始化没弄好,很大可能是时钟部分。串口1在APB2上,串口2、3是在APB1上,改动上很容易错
回复 支持 反对

使用道具 举报

25

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
269
金钱
269
注册时间
2022-11-1
在线时间
53 小时
发表于 2023-4-26 09:57:09 | 显示全部楼层
苏九思 发表于 2023-4-25 13:42
1能用,2、3不能用。感觉他是程序初始化没弄好,很大可能是时钟部分。串口1在APB2上,串口2、3是在APB1上 ...

时钟没问题,我把源文件里面的代码发你看看
  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((USART3->SR&0X40)==0);//循环发送,直到发送完毕   
  25.     USART3->DR = (u8) ch;      
  26.         return ch;
  27. }
  28. #endif

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

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

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

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

  43. #if EN_USART3_RX         //使能串口3中断接收
  44. u8 USART_RX_BUF[USART_REC_LEN];         //接收字节的长度
  45. u16 USART_RX_STA=0;        //接收状态标志

  46. void uart_init(u32 bound)
  47. {
  48.         GPIO_InitTypeDef GPIO_InitStructure;
  49.         USART_InitTypeDef USART_InitStructure;
  50.         NVIC_InitTypeDef NVIC_InitStructure;
  51.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        //
  52.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);      //串口3是挂载在APB1下面的外设

  53.        
  54.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  55.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       
  57.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  58.   
  59.        
  60.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;   //
  61.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  62.         GPIO_Init(GPIOB, &GPIO_InitStructure);

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

  68.        
  69.         USART_InitStructure.USART_BaudRate = 115200;
  70.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  71.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  72.         USART_InitStructure.USART_Parity = USART_Parity_No;
  73.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  74.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  75.   USART_Init(USART3, &USART_InitStructure);
  76.        
  77.        
  78.   USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);   //开启串口中断
  79.   USART_Cmd(USART3, ENABLE);                        //使能串口3

  80. }

  81. void USART3_IRQHandler(void)                        //串口1中断响应函数
  82. {
  83.         u8 Res;

  84.         if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //判断是否接收中断,如果接受中断,
  85.                 //则读取串口接受到的数据(接收到的数据必须是0x0d 0x0a结尾)
  86.        

  87.         {
  88.                 Res =USART_ReceiveData(USART3);        //读取接收到的数据
  89.                
  90.                 if((USART_RX_STA&0x8000)==0)//接收未完成
  91.                         {
  92.                         if(USART_RX_STA&0x4000)//接收到了0x0d
  93.                                 {
  94.                                 if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  95.                                 else USART_RX_STA|=0x8000;        //接收完成了
  96.                                 }
  97.                         else //还没收到0X0D
  98.                                 {       
  99.                                 if(Res==0x0d)USART_RX_STA|=0x4000;
  100.                                 else
  101.                                         {
  102.                                         USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
  103.                                         USART_RX_STA++;
  104.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
  105.                                         }                 
  106.                                 }
  107.                         }                    
  108.      }

  109. }
  110. #endif       
复制代码
回复 支持 反对

使用道具 举报

10

主题

116

帖子

0

精华

高级会员

Rank: 4

积分
842
金钱
842
注册时间
2021-12-23
在线时间
202 小时
发表于 2023-4-26 11:22:03 | 显示全部楼层
wsh15249375668 发表于 2023-4-26 09:57
时钟没问题,我把源文件里面的代码发你看看

初始化代码没问题,头文件中也要改。如果这些都改好了,在主程序中写一个循环一直发送,看看能不能发送出来数据。从引脚直接出来的TX信号是TTL的,可以直接使用串口助手之类的通过USB-TTL通信,如果有232或者485那就要用相应的USB-485、USB-232来进行通信
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 09:36

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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