【stm32c8t6多个串口使用】

最近做的一个小项目会同时用到多个串口,不同串口连接不同外设根据不同控制指令来执行相应的功能(wifi、语音等)如何同时进行不同串口之间的配置原理和配置单个串口相同,下面就以三个串口中断分别来进行LED的控制,后面根据自己的需求将串口接在不同的外设上面就好了。

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

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

串口配置源码

/*========================usart.h=====================*/#ifndef __USART_H
#define __USART_H#include "stm32f10x.h"
#include <stdio.h>//串口1
#define USART1_GPIO_PORT      GPIOA
#define USART1_GPIO_CLK       RCC_APB2Periph_GPIOA
#define USART1_TX_GPIO_PIN    GPIO_Pin_9
#define USART1_RX_GPIO_PIN    GPIO_Pin_10//串口2
#define USART2_GPIO_PORT      GPIOA
#define USART2_GPIO_CLK       RCC_APB2Periph_GPIOA
#define USART2_TX_GPIO_PIN    GPIO_Pin_2
#define USART2_RX_GPIO_PIN    GPIO_Pin_3//串口3
#define USART3_GPIO_PORT      GPIOB
#define USART3_GPIO_CLK       RCC_APB2Periph_GPIOB
#define USART3_TX_GPIO_PIN    GPIO_Pin_10
#define USART3_RX_GPIO_PIN    GPIO_Pin_11void usart_init(void);
void usart_init2(void);
void usart_init3(void);
void Init_Usart(void);
void USART_Send_Byte(USART_TypeDef* USARTx, uint16_t Data);
void USART_Send_String(USART_TypeDef* USARTx, char *str);#endif  /* __USART_H */
/*=======================usart.c======================*/
#include "./usart/usart.h"
/*** 功能:串口初始化函数* 参数:None* 返回值:None*/
void usart_init(void)
{GPIO_InitTypeDef GPIO_Init_Structure;                            //定义GPIO结构体USART_InitTypeDef USART_Init_Structure;                          //定义串口结构体NVIC_InitTypeDef  NVIC_Init_Structure;                                                       //定义中断结构体NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RCC_APB2PeriphClockCmd(USART1_GPIO_CLK,  ENABLE);                 //开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,  ENABLE);          //开启USART1时钟//配置PA9  TXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                //复用推挽GPIO_Init_Structure.GPIO_Pin   = USART1_TX_GPIO_PIN;GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_Init( USART1_GPIO_PORT, &GPIO_Init_Structure);//配置PA10 RXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;                //复用推挽GPIO_Init_Structure.GPIO_Pin   = USART1_RX_GPIO_PIN;GPIO_Init( USART1_GPIO_PORT, &GPIO_Init_Structure);//串口相关配置USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);                                                                                    //串口中断配置USART_Init_Structure.USART_BaudRate = 115200;                                          //波特率设置为115200USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位   USART_Init(USART1, &USART_Init_Structure);                                             //初始化 USART_Cmd(USART1, ENABLE);                                                            //串口使能//中断结构体配置NVIC_Init_Structure.NVIC_IRQChannel            =   USART1_IRQn;NVIC_Init_Structure.NVIC_IRQChannelCmd     =   ENABLE;NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  =  0;NVIC_Init_Structure.NVIC_IRQChannelSubPriority         =  1;NVIC_Init(&NVIC_Init_Structure);}void usart_init2(void)
{GPIO_InitTypeDef GPIO_Init_Structure;                            //定义GPIO结构体USART_InitTypeDef USART_Init_Structure;                          //定义串口结构体NVIC_InitTypeDef  NVIC_Init_Structure;                                                       //定义中断结构体NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RCC_APB2PeriphClockCmd(USART2_GPIO_CLK,  ENABLE);                 //开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,  ENABLE);          //开启USART1时钟//配置PA2 TXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                //复用推挽GPIO_Init_Structure.GPIO_Pin   = USART2_TX_GPIO_PIN;GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init( USART2_GPIO_PORT, &GPIO_Init_Structure);//配置PA3 RXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;                //复用推挽GPIO_Init_Structure.GPIO_Pin   = USART2_RX_GPIO_PIN;GPIO_Init( USART2_GPIO_PORT, &GPIO_Init_Structure);USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);  USART_Init_Structure.USART_BaudRate = 115200;                                          //波特率设置为115200USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位  USART_Init(USART2, &USART_Init_Structure);  USART_Cmd(USART2, ENABLE);//中断结构体配置NVIC_Init_Structure.NVIC_IRQChannel            =   USART2_IRQn;NVIC_Init_Structure.NVIC_IRQChannelCmd     =   ENABLE;NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  =  0;NVIC_Init_Structure.NVIC_IRQChannelSubPriority         =  3;NVIC_Init(&NVIC_Init_Structure);
}void usart_init3(void)
{GPIO_InitTypeDef GPIO_Init_Structure;                            //定义GPIO结构体USART_InitTypeDef USART_Init_Structure;                          //定义串口结构体NVIC_InitTypeDef  NVIC_Init_Structure;                                                       //定义中断结构体NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RCC_APB2PeriphClockCmd(USART3_GPIO_CLK,  ENABLE);                 //开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,  ENABLE);            //开启APB2总线复用时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,  ENABLE);          //开启USART1时钟//配置PB10 TXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_AF_PP;                //复用推挽GPIO_Init_Structure.GPIO_Pin   = USART3_TX_GPIO_PIN;GPIO_Init_Structure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init( USART3_GPIO_PORT, &GPIO_Init_Structure);//配置PB11 RXGPIO_Init_Structure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;                //复用推挽GPIO_Init_Structure.GPIO_Pin   = USART3_RX_GPIO_PIN;GPIO_Init( USART3_GPIO_PORT, &GPIO_Init_Structure);USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);    USART_Init_Structure.USART_BaudRate = 115200;                                          //波特率设置为115200USART_Init_Structure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;       //硬件流控制为无USART_Init_Structure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;                       //模式设为收和发USART_Init_Structure.USART_Parity = USART_Parity_No;                                   //无校验位USART_Init_Structure.USART_StopBits = USART_StopBits_1;                                //一位停止位USART_Init_Structure.USART_WordLength = USART_WordLength_8b;                           //字长为8位   USART_Init(USART3, &USART_Init_Structure);   USART_Cmd(USART3, ENABLE);//中断结构体配置NVIC_Init_Structure.NVIC_IRQChannel          =   USART3_IRQn;NVIC_Init_Structure.NVIC_IRQChannelCmd     =   ENABLE;NVIC_Init_Structure.NVIC_IRQChannelPreemptionPriority  =  1;NVIC_Init_Structure.NVIC_IRQChannelSubPriority         =  3;NVIC_Init(&NVIC_Init_Structure);
}//三个串口初始化函数
void Init_Usart(void)
{usart_init();usart_init2();usart_init3();
}/*** 功能:串口写字节函数* 参数1:USARTx :串口号* 参数2:Data   :需写入的字节* 返回值:None*/
void USART_Send_Byte(USART_TypeDef* USARTx, uint16_t Data)
{USART_SendData(USARTx, Data);while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE)==RESET);
}
/*** 功能:串口写字符串函数* 参数1:USARTx :串口号* 参数2:str    :需写入的字符串* 返回值:None*/
void USART_Send_String(USART_TypeDef* USARTx, char *str)
{uint16_t i=0;do{USART_Send_Byte(USARTx,  *(str+i));i++;}while(*(str + i) != '\0');while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET);
}
/*** 功能:重定向*/
int fputc(int ch,FILE *f)
{USART_SendData(USART1, (uint8_t)ch);while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);return (ch);
}
/*** 功能:重定向*/
int fgetc(FILE *f)
{while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)==RESET);return (int)USART_ReceiveData(USART1);
}/*
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET){}
}*//*
void USART2_IRQHandler(void)
{if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET){}
}*//*
void USART3_IRQHandler(void)
{char temp;if(USART_GetITStatus(USART3,USART_IT_RXNE) != RESET){}
}
*/
/*=======================main.c======================*/
#include "stm32f10x.h"
#include "usart.h"
#include "led.h"
int main()
{Init_Usart();led_init();printf("====================串口测试=====================\n");//USART_Send_String(USART1,"usart1 test\n");while(1){}
}//串口1中断
void USART1_IRQHandler(void)
{char temp;//USART_Send_String(USART1,"Usart1 interrupt test\n"); if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET){temp = USART_ReceiveData(USART1);if(temp == 'O'){GPIO_ResetBits(GPIOC,GPIO_Pin_13);USART_Send_String(USART1,"Led Open Successful\n");       }if(temp == 'C'){GPIO_SetBits(GPIOC,GPIO_Pin_13);USART_Send_String(USART1,"Led Close Successful\n");}}
}//串口2中断
void USART2_IRQHandler(void)
{char temp;//USART_Send_String(USART2,"Usart2 interrupt test\n"); if(USART_GetITStatus(USART2,USART_IT_RXNE)!= RESET){temp = USART_ReceiveData(USART2);if(temp == 'O'){GPIO_ResetBits(GPIOC,GPIO_Pin_13);USART_Send_String(USART2,"Led Open Successful\n");       }if(temp == 'C'){GPIO_SetBits(GPIOC,GPIO_Pin_13);USART_Send_String(USART2,"Led Close Successful\n");}}
}//串口3中断
void USART3_IRQHandler(void)
{char temp;//USART_Send_String(USART3,"Usart3 interrupt test\n"); if(USART_GetITStatus(USART3,USART_IT_RXNE)!= RESET){temp = USART_ReceiveData(USART3);if(temp == 'O'){GPIO_ResetBits(GPIOC,GPIO_Pin_13);USART_Send_String(USART3,"Led Open Successful\n");       }if(temp == 'C'){GPIO_SetBits(GPIOC,GPIO_Pin_13);USART_Send_String(USART3,"Led Close Successful\n");}}
}

实验结果

【stm32c8t6多个串口同时使用】相关推荐

  1. CC2538 ZigBee 芯片 两路UART串口同时使用

    前言 众所周知,CC2538 zigbee芯片物理上支持UART0和UART1,但是在Z-Stack协议栈里面只提供了UART1的代码支持,并没有提供UART0的代码支持,但是具体如何同时使用UART ...

  2. 基于CUBEMX和STM32C8T6的同轴麦轮小车制作(二)——HAL库接受jy61p陀螺仪数据,并解决数据溢出卡死问题。

    基于CUBEMX和STM32C8T6的同轴麦轮小车制作(二)--HAL库接受jy61p陀螺仪数据,并解决数据溢出卡死问题 本文利用STM32C8T6中的串口1于JY61P实时通信,并用串口2将其角度打 ...

  3. STM32的优先级NVIC_PriorityGroupConfig的理解及其使用(转)

    源:http://blog.csdn.net/yx_l128125/article/details/9703843 写作原由:因为之前有对stm32 优先级做过研究,但是没时间把整理的东西发表,最近项 ...

  4. 最简单DIY基于STM32单片机的WIFI智能小车设计方案

    STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇:最简单DIY基于STM32F ...

  5. 最简单DIY基于STM32单片机的蓝牙智能小车设计方案

    STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 文章目录 STM32库函数开发系列文 ...

  6. 基于FreeRTOS的物联网智能车库管理系统(可进行车牌识别)

    FreeRTOS操作系统与物联网项目实战 学了一周的FreeRTOS实时操作系统,物联网也学过了,看到网上低配版的操作系统车库,于是便想着自己做个高配版的,便开始了我的一周项目计划. 文章目录 Fre ...

  7. 自制小四轴:从入门到放弃

    四轴飞行器,又称四旋翼飞行器,简称四轴.四旋翼.四轴飞行器的四个螺旋桨与电机直接相连,通过改变电机转速获得旋转机身的力,从而调整自身姿态. 四轴的叶片转速极高,有一定的危险性,一般不能在室内飞,特别是 ...

  8. 【A40i】全志A40i方案项目指引

    全志A40i 前几天,在写了一份关于全志方案选型的博文后,遭到许多网友的"声讨",有的网友反馈博文内容太短没看够:还有的网友反馈没有把全志的所有IC系列选型都列出来:更有网友吐槽博 ...

  9. arduino舵机代码_Arduino如何同时使用多个串口

    问题 如果想要给Arduino UNO R3同时接上WiFi模块和蓝牙模块时,但是Arduino的串口只有一个,怎样才能让Arduino同时使用多个串口呢? 解决方案 其实Arduino官方提供了一个 ...

最新文章

  1. 如何记录数据表信息的变更
  2. Centos DNS服务(二)-bind主从配置与基于TSIG加密的动态更新
  3. 美肤磨皮算法OpenCV3实现
  4. ios开发,地图标注聚集。搜索标注title功能
  5. 上海市经济信息化委关于征集本市2020年拟新建互联网数据中心项目的通知
  6. git提交输入密码_git提交到自己的服务器,每次都要输入密码
  7. MySQL如何存储Emoji表情,UTF-8和UTF-8MB4字符编码有何区别
  8. javascript - dom
  9. 互联网传真 传真指令_传真的完整形式是什么?
  10. office移动端_阿里云 Teambition 网盘产品快讯:移动端正式版即将上线,体验将大幅提升...
  11. 数据分析利器之Pandas
  12. Python Mysql 数据库操作
  13. 用Go语言打印三角形汇总 (Golang经典编程案例)
  14. 百度云下载不限速方法合集
  15. verilog实现5分频
  16. 四川店盈通电子商务有限公司:《零售的哲学》中的最基本观点“以用户为中心”
  17. ReadProcessMemory()
  18. h.264 sei信息
  19. eclipse oxygen配置tomcat
  20. 理想的清理软件——CCleaner

热门文章

  1. 【PAT甲级 - C++题解】1147 Heaps
  2. 移动端横屏/强制横屏
  3. 精神分析学的创始人弗洛伊德先生关于梦的理论
  4. Java中如果被除数是零时的异常处理
  5. KPM算法——数据结构|复习局|串|复杂模式匹配算法|二维数组解决KPM
  6. 为了得到一个数的“相反数“,我们将这个数的数字顺序颠倒,然后再加上原先的数得到“相反数“。
  7. 知了 | 基于NLP的智能问答推荐系统
  8. 【MATLAB】数字图像处理--图像的频域处理-相位谱重构
  9. tyvj2059 元芳看电影
  10. java获取指定周的第一天和最后一天(周统计报表)