STM32 F103C8T6学习笔记3:串口配置—串口收发—自定义Printf函数

今日学习使用STM32 C8T6的串口,我们在经过学习笔记2的总结归纳可知,STM32 C8T6最小系统板上有三路串口,如下图:

今日我们就着手学习如何配置开通这些串口进行收发,这里不讲串口通信概念与基础,可以自行网上查找,本文直接开始介绍库函数与编程实现:

串口配置相关库函数介绍:

打开串口GPIO的时钟:

cpp 复制代码
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
/*
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
*/

打开串口外设的时钟:

cpp 复制代码
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
/*
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB1Periph_USART2            ((uint32_t)0x00020000)
#define RCC_APB1Periph_USART3            ((uint32_t)0x00040000)
#define RCC_APB1Periph_UART4             ((uint32_t)0x00080000)
#define RCC_APB1Periph_UART5             ((uint32_t)0x00100000)
*/

串口的初始化配置:

cpp 复制代码
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)
/*
USART1 USART2 USART3

*/

向量中断控制器组选择:

cpp 复制代码
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)

初始化配置NVIC:

cpp 复制代码
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)

串口接收:

cpp 复制代码
USART_ReceiveData(USART1)

串口配置编程:

首先创建好要用的几个文件.c 与.h,在添加进工程,别忘了添加路径~

串口的初始化:

以下是串口1的初始化以及配置中断优先级,中断优先级的配置分为主优先和子优先,有关中断优先级的配置这放在以后再说~~~,

测试工程文件我还编写了串口2,3的初始化,可以下载测试观察~

cpp 复制代码
#include "USART_init.h"


void Usart1_Init(unsigned int baud)
{
 
	GPIO_InitTypeDef gpio_initstruct;
	USART_InitTypeDef usart_initstruct;
	NVIC_InitTypeDef nvic_initstruct;
	
  // 打开串口GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	// 打开串口外设的时钟	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	
	//PA9	TXD	// 将USART Tx的GPIO配置为推挽复用模式
	gpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;
	gpio_initstruct.GPIO_Pin = GPIO_Pin_9;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio_initstruct);
	
	//PA10	RXD  // 将USART Rx的GPIO配置为浮空输入模式
	gpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	gpio_initstruct.GPIO_Pin = GPIO_Pin_10;
	gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &gpio_initstruct);
	
	usart_initstruct.USART_BaudRate = baud;                                 	      //配置波特率
	usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;		//无硬件流控	
	usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;						        //接收和发送	
	usart_initstruct.USART_Parity = USART_Parity_No;									              //无校验
	usart_initstruct.USART_StopBits = USART_StopBits_1;								              //配置停止位 1位停止位
	usart_initstruct.USART_WordLength = USART_WordLength_8b;							          //配置 针数据字长 8位数据位
	// 完成串口的初始化配置
	USART_Init(USART1, &usart_initstruct);

	USART_Cmd(USART1, ENABLE);														                           //使能串口
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);									                 //使能接收中断
	
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                  /* 嵌套向量中断控制器组选择 */
	nvic_initstruct.NVIC_IRQChannel = USART1_IRQn;                                   /* 配置USART为中断源 */
	nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;                                     /* 使能中断 */
	nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;                           /* 抢断优先级*/
	nvic_initstruct.NVIC_IRQChannelSubPriority = 2;                                  /* 子优先级 */
	
	NVIC_Init(&nvic_initstruct);                                                     /* 初始化配置NVIC */
 
}

串口中断服务函数的编写:

首先在启动文件找到三个串口的中断服务函数:

cpp 复制代码
void USART1_IRQHandler(void)
{
 
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
	{USART_ClearFlag(USART1, USART_FLAG_RXNE);}
	//返回收到的任意数据
	USART_SendData(USART1,USART_ReceiveData(USART1)); 
	
}

测试结果截图:

工程下载:

https://download.csdn.net/download/qq_64257614/88201777?spm=1001.2014.3001.5503

相关推荐
AOwhisky1 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
前端世界1 小时前
MySQL 基础入门(学习第4天)——约束与 DML 操作详解
数据库·学习·mysql
dear_bi_MyOnly1 小时前
【SpringBoot配置文件】
java·spring boot·后端·学习·spring·java-ee·学习方法
AOwhisky1 小时前
Python 学习笔记(第十四期)——运维自动化(下·中篇):远程文件传输——paramiko进阶篇
运维·python·学习·云原生·自动化·文件传输·paramiko
math_hongfan1 小时前
鸿蒙Flutter setState机制深入理解
学习·flutter·华为·harmonyos·鸿蒙
小李不困还能学2 小时前
基于 51 单片机的8 路抢答器设计教程
单片机·嵌入式硬件·mongodb·抢答器
其实防守也摸鱼2 小时前
补天SRC新手入门指南:从0到1的漏洞挖掘之路
网络·python·学习·安全·web安全·数据挖掘·挖洞
维基框架2 小时前
汽车座舱开发上云 Google的Arm实例解决了什么实际问题
arm开发·人工智能·汽车
萌动的小火苗2 小时前
嵌入式开发中的栈与队列:任务调度为什么依赖数据结构
数据结构·c++·单片机·嵌入式硬件
振浩微433射频芯片3 小时前
工业遥控器总在关键时刻“掉链子”?——433MHz芯片方案如何破局
网络·单片机·嵌入式硬件·物联网·工业遥控