你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32c8t6多个串口同时使用

[复制链接]
STMCU小助手 发布时间:2022-10-27 18:27
不同串口连接不同外设根据不同控制指令来执行相应的功能(wifi、语音等)如何同时进行不同串口之间的配置原理和配置单个串口相同,下面就以三个串口中断分别来进行LED的控制,后面根据自己的需求将串口接在不同的外设上面就好了。

stm32c8t6上面可以使用很多串口,通常没有经过重映射的引脚有三组串口
USART1 ------> TX(PA9) RX(PA10)
USART2 ------> TX(A2)  RX(A3)
USART3 ------> TX(PB10) RX(PB11)

下面所配置的串口就是这三组串口

下面是进行端口映射可以配置的串口引脚,可以根据自己的需求查看相关数据手册进行配置,和基本的配置大致相同,多了端口映射

99bf0d5ef39f4611ae03e0a4f41872e3.png

df112cb004dc46e2b63efc597c29b060.png

串口配置源码

  1. /*========================usart.h=====================*/

  2. #ifndef __USART_H
  3. #define __USART_H

  4. #include "stm32f10x.h"
  5. #include <stdio.h>

  6. //串口1
  7. #define USART1_GPIO_PORT      GPIOA
  8. #define USART1_GPIO_CLK       RCC_APB2Periph_GPIOA
  9. #define USART1_TX_GPIO_PIN    GPIO_Pin_9
  10. #define USART1_RX_GPIO_PIN    GPIO_Pin_10

  11. //串口2
  12. #define USART2_GPIO_PORT      GPIOA
  13. #define USART2_GPIO_CLK       RCC_APB2Periph_GPIOA
  14. #define USART2_TX_GPIO_PIN    GPIO_Pin_2
  15. #define USART2_RX_GPIO_PIN    GPIO_Pin_3

  16. //串口3
  17. #define USART3_GPIO_PORT      GPIOB
  18. #define USART3_GPIO_CLK       RCC_APB2Periph_GPIOB
  19. #define USART3_TX_GPIO_PIN    GPIO_Pin_10
  20. #define USART3_RX_GPIO_PIN    GPIO_Pin_11


  21. void usart_init(void);
  22. void usart_init2(void);
  23. void usart_init3(void);
  24. void Init_Usart(void);
  25. void USART_Send_Byte(USART_TypeDef* USARTx, uint16_t Data);
  26. void USART_Send_String(USART_TypeDef* USARTx, char *str);

  27. #endif  /* __USART_H */
复制代码
  1. /*=======================usart.c======================*/
  2. #include "./usart/usart.h"
  3. /**
  4. * 功能:串口初始化函数
  5. * 参数:None
  6. * 返回值:None
  7. */
  8. void usart_init(void)
  9. {
  10.     GPIO_InitTypeDef GPIO_Init_Structure;                            //定义GPIO结构体
  11.     USART_InitTypeDef USART_Init_Structure;                          //定义串口结构体
  12.         NVIC_InitTypeDef  NVIC_Init_Structure;                                                                                                                //定义中断结构体
  13.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  14.         
  15.     RCC_APB2PeriphClockCmd(USART1_GPIO_CLK,  ENABLE);                 //开启GPIOA时钟
  16.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟
  17.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,  ENABLE);          //开启USART1时钟

  18.     //配置PA9  TX
  19.     GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                //复用推挽
  20.     GPIO_Init_Structure.GPIO_Pin   = USART1_TX_GPIO_PIN;
  21.     GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_50MHz;   
  22.     GPIO_Init( USART1_GPIO_PORT, &GPIO_Init_Structure);

  23.     //配置PA10 RX
  24.     GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;                //复用推挽
  25.     GPIO_Init_Structure.GPIO_Pin   = USART1_RX_GPIO_PIN;
  26.     GPIO_Init( USART1_GPIO_PORT, &GPIO_Init_Structure);
  27.     //串口相关配置
  28.           USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);                                                                                                                                                                        //串口中断配置
  29.     USART_Init_Structure.USART_BaudRate = 115200;                                          //波特率设置为115200
  30.     USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无
  31.     USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发
  32.     USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位
  33.     USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位
  34.     USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位   
  35.     USART_Init(USART1, &USART_Init_Structure);                                             //初始化        
  36.     USART_Cmd(USART1, ENABLE);                                                            //串口使能
  37.                
  38.                 //中断结构体配置
  39.         NVIC_Init_Structure.NVIC_IRQChannel                         =   USART1_IRQn;
  40.         NVIC_Init_Structure.NVIC_IRQChannelCmd           =   ENABLE;
  41.         NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  =  0;
  42.         NVIC_Init_Structure.NVIC_IRQChannelSubPriority         =  1;
  43.         NVIC_Init(&NVIC_Init_Structure);

  44. }




  45. void usart_init2(void)
  46. {
  47.     GPIO_InitTypeDef GPIO_Init_Structure;                            //定义GPIO结构体
  48.     USART_InitTypeDef USART_Init_Structure;                          //定义串口结构体
  49.         NVIC_InitTypeDef  NVIC_Init_Structure;                                                                                                                //定义中断结构体
  50.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  51.         
  52.     RCC_APB2PeriphClockCmd(USART2_GPIO_CLK,  ENABLE);                 //开启GPIOA时钟
  53.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟
  54.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,  ENABLE);          //开启USART1时钟

  55.     //配置PA2 TX
  56.     GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                //复用推挽
  57.     GPIO_Init_Structure.GPIO_Pin   = USART2_TX_GPIO_PIN;
  58.     GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_10MHz;

  59.     GPIO_Init( USART2_GPIO_PORT, &GPIO_Init_Structure);

  60.     //配置PA3 RX
  61.     GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;                //复用推挽
  62.     GPIO_Init_Structure.GPIO_Pin   = USART2_RX_GPIO_PIN;
  63.     GPIO_Init( USART2_GPIO_PORT, &GPIO_Init_Structure);
  64.         
  65.     USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);        
  66.     USART_Init_Structure.USART_BaudRate = 115200;                                          //波特率设置为115200
  67.     USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无
  68.     USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发
  69.     USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位
  70.     USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位
  71.     USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位  
  72.     USART_Init(USART2, &USART_Init_Structure);  
  73.     USART_Cmd(USART2, ENABLE);
  74.                
  75.                 //中断结构体配置
  76.         NVIC_Init_Structure.NVIC_IRQChannel                         =   USART2_IRQn;
  77.         NVIC_Init_Structure.NVIC_IRQChannelCmd           =   ENABLE;
  78.         NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  =  0;
  79.         NVIC_Init_Structure.NVIC_IRQChannelSubPriority         =  3;
  80.         NVIC_Init(&NVIC_Init_Structure);
  81. }



  82. void usart_init3(void)
  83. {
  84.     GPIO_InitTypeDef GPIO_Init_Structure;                            //定义GPIO结构体
  85.     USART_InitTypeDef USART_Init_Structure;                          //定义串口结构体
  86.           NVIC_InitTypeDef  NVIC_Init_Structure;                                                                                                                //定义中断结构体
  87.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  88.         
  89.     RCC_APB2PeriphClockCmd(USART3_GPIO_CLK,  ENABLE);                 //开启GPIOA时钟
  90.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟
  91.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,  ENABLE);          //开启USART1时钟

  92.     //配置PB10 TX
  93.     GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                //复用推挽
  94.     GPIO_Init_Structure.GPIO_Pin   = USART3_TX_GPIO_PIN;
  95.     GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_10MHz;
  96.     GPIO_Init( USART3_GPIO_PORT, &GPIO_Init_Structure);

  97.     //配置PB11 RX
  98.     GPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;                //复用推挽
  99.     GPIO_Init_Structure.GPIO_Pin   = USART3_RX_GPIO_PIN;
  100.     GPIO_Init( USART3_GPIO_PORT, &GPIO_Init_Structure);
  101.         
  102.     USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);        
  103.     USART_Init_Structure.USART_BaudRate = 115200;                                          //波特率设置为115200
  104.     USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无
  105.     USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发
  106.     USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位
  107.     USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位
  108.     USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位   
  109.     USART_Init(USART3, &USART_Init_Structure);   
  110.     USART_Cmd(USART3, ENABLE);
  111.                
  112.                 //中断结构体配置
  113.         NVIC_Init_Structure.NVIC_IRQChannel                         =   USART3_IRQn;
  114.         NVIC_Init_Structure.NVIC_IRQChannelCmd           =   ENABLE;
  115.         NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  =  1;
  116.         NVIC_Init_Structure.NVIC_IRQChannelSubPriority         =  3;
  117.         NVIC_Init(&NVIC_Init_Structure);
  118. }


  119. //三个串口初始化函数
  120. void Init_Usart(void)
  121. {
  122.         usart_init();
  123.         usart_init2();
  124.         usart_init3();
  125. }



  126. /**
  127. * 功能:串口写字节函数
  128. * 参数1:USARTx :串口号
  129. * 参数2:Data   :需写入的字节
  130. * 返回值:None
  131. */
  132. void USART_Send_Byte(USART_TypeDef* USARTx, uint16_t Data)
  133. {
  134.     USART_SendData(USARTx, Data);
  135.     while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE)==RESET);
  136. }
  137. /**
  138. * 功能:串口写字符串函数
  139. * 参数1:USARTx :串口号
  140. * 参数2:str    :需写入的字符串
  141. * 返回值:None
  142. */
  143. void USART_Send_String(USART_TypeDef* USARTx, char *str)
  144. {
  145.     uint16_t i=0;
  146.     do
  147.     {
  148.         USART_Send_Byte(USARTx,  *(str+i));
  149.         i++;
  150.     }
  151.     while(*(str + i) != '\0');

  152.     while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
  153. }
  154. /**
  155. * 功能:重定向
  156. */
  157. int fputc(int ch,FILE *f)
  158. {
  159.     USART_SendData(USART1, (uint8_t)ch);
  160.     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
  161.     return (ch);
  162. }
  163. /**
  164. * 功能:重定向
  165. */
  166. int fgetc(FILE *f)
  167. {
  168.     while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET);
  169.     return (int)USART_ReceiveData(USART1);
  170. }

  171. /*
  172. void USART1_IRQHandler(void)
  173. {
  174.     if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
  175.     {

  176.     }
  177. }*/


  178. /*
  179. void USART2_IRQHandler(void)
  180. {
  181.     if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)
  182.     {

  183.     }
  184. }*/



  185. /*
  186. void USART3_IRQHandler(void)
  187. {
  188.     char temp;
  189.     if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET)
  190.     {

  191.     }
  192. }
  193. */
复制代码
  1. /*=======================main.c======================*/
  2. #include "stm32f10x.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. int main()
  6. {
  7.     Init_Usart();
  8.         led_init();

  9.         printf("====================串口测试=====================\n");
  10.         //USART_Send_String(USART1,"usart1 test\n");
  11.     while(1)
  12.     {
  13.                         
  14.     }
  15. }

  16. //串口1中断
  17. void USART1_IRQHandler(void)
  18. {
  19.         char temp;
  20.         //USART_Send_String(USART1,"Usart1 interrupt test\n");        
  21.         if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)
  22.         {
  23.                 temp = USART_ReceiveData(USART1);
  24.                 if(temp == 'O')
  25.                 {
  26.                         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  27.                         USART_Send_String(USART1,"Led Open Successful\n");               
  28.                 }
  29.                 if(temp == 'C')
  30.                 {
  31.                         GPIO_SetBits(GPIOC,GPIO_Pin_13);
  32.                         USART_Send_String(USART1,"Led Close Successful\n");
  33.                 }
  34.         }
  35. }


  36. //串口2中断
  37. void USART2_IRQHandler(void)
  38. {
  39.         char temp;
  40.         //USART_Send_String(USART2,"Usart2 interrupt test\n");        
  41.         if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET)
  42.         {
  43.                 temp = USART_ReceiveData(USART2);
  44.                 if(temp == 'O')
  45.                 {
  46.                         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  47.                         USART_Send_String(USART2,"Led Open Successful\n");               
  48.                 }
  49.                 if(temp == 'C')
  50.                 {
  51.                         GPIO_SetBits(GPIOC,GPIO_Pin_13);
  52.                         USART_Send_String(USART2,"Led Close Successful\n");
  53.                 }
  54.         }
  55. }

  56. //串口3中断
  57. void USART3_IRQHandler(void)
  58. {
  59.         char temp;
  60.         //USART_Send_String(USART3,"Usart3 interrupt test\n");        
  61.         if(USART_GetITStatus(USART3,USART_IT_RXNE)!= RESET)
  62.         {
  63.                 temp = USART_ReceiveData(USART3);
  64.                 if(temp == 'O')
  65.                 {
  66.                         GPIO_ResetBits(GPIOC,GPIO_Pin_13);
  67.                         USART_Send_String(USART3,"Led Open Successful\n");               
  68.                 }
  69.                 if(temp == 'C')
  70.                 {
  71.                         GPIO_SetBits(GPIOC,GPIO_Pin_13);
  72.                         USART_Send_String(USART3,"Led Close Successful\n");
  73.                 }
  74.         }
  75. }
复制代码

实验结果

40ed4417767c4f09abbd2e4f4e7afe6a.png

————————————————
版权声明:@slow-walker

收藏 评论0 发布时间:2022-10-27 18:27

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版