#include "./usart/usart.h"
static void NVIC_Config(void)
{
//定义内核中断结构体
NVIC_InitTypeDef NVIC_InitStructure;
//配置NVIC为第几分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//配置USART为中断源
NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ; //配置中断服务函数入口
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢断优先级设置为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //子优先级为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
//初始化中断寄存器
NVIC_Init(&NVIC_InitStructure);
}
void USART_Config(void)
{
//定义外设结构体
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//使能串口外设时钟
RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK | DEBUG_USART_TX_GPIO_CLK,ENABLE);
//使能USART时钟
RCC_APB2PeriphClockCmd(DEBUG_USART_CLK,ENABLE);
//初始化GPIO
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*由于USART1连接的是PA9、PA10,需要对引脚进行复用*/
//配置Tx引脚为复用功能
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN;
GPIO_Init(DEBUG_USART_TX_GPIO_PORT,&GPIO_InitStructure);
//配置Rx引脚为复用功能
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;
GPIO_Init(DEBUG_USART_RX_GPIO_PORT,&GPIO_InitStructure);
//连接PXX到USART_RX
GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,DEBUG_USART_RX_SOURCE,DEBUG_USART_RX_AF);
//连接PXX到USART_TX
GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,DEBUG_USART_TX_SOURCE,DEBUG_USART_TX_AF);
//配置串口DEBUG_USART模式
USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE; //波特率设置
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长(数据位+校验位)
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位:1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //校验位选择(不使用校验)
USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None; //硬件流控制:不使用硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //USART模式控制,同时使能接收和发送
//完成USART初始化配置
USART_Init(DEBUG_USART,&USART_InitStructure);
//嵌套NVIC 中断控制配置
NVIC_Config();
//使能串口接收中断
USART_ITConfig(DEBUG_USART,USART_IT_RXNE,ENABLE);
//使能串口
USART_Cmd(DEBUG_USART,ENABLE);
}
//发送一个字符的函数
void Usart_SendByte(USART_TypeDef * pUSARTx,uint8_t ch)
{
//发送一个字符到USART
USART_SendData(pUSARTx,ch);
//等待发送寄存器为空
while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TXE) == RESET);
}
//发送字符串的函数
void Usart_SendString(USART_TypeDef * pUSARTx,char *str)
{
unsigned int k=0;
do{
Usart_SendByte( pUSARTx, *(str + k) );
k++;
}while (*(str + k)!='\0');
//等待发送寄存器为空
while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC) == RESET)
{
}
}
//发送16位数字
void Usart_SendHalfWord(USART_TypeDef * pUSARTx,uint16_t ch)
{
uint8_t temp_h,temp_1;
temp_h = (ch&0XFF00)>>8; //取出高8位
temp_1 = ch&0XFF; //取出低8位
//发送高8位
USART_SendData(pUSARTx,temp_h);
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
//发送低8位
USART_SendData(pUSARTx,temp_1);
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
}
//重新定向printf函数到stm32单片机,使得printf函数可以使用
int fputc(int ch,FILE *f)
{
//发送一个字节数据到串口
USART_SendData(DEBUG_USART,(uint8_t)ch);
//等待发送完毕
while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_TXE) == RESET);
return (ch);
}
//重新定向scanf函数到stm32单片机,使得scanf、getchar函数可以使用
int fgetc(FILE *f)
{
//等待串口输入数据
while (USART_GetFlagStatus(DEBUG_USART, USART_FLAG_RXNE) == RESET);
return(int)USART_ReceiveData(DEBUG_USART);
}
stm32-407控制串口通信
需积分: 5 154 浏览量
2021-04-20
19:49:29
上传
评论
收藏 2KB ZIP 举报
菠萝赛西-
- 粉丝: 0
- 资源: 16
最新资源
- 基于stm32f103c单片机+MPU6050+0.96英寸OLED显示屏双柄遥控器硬件(原理图+PCB)工程文件.zip
- 整理的关于少儿编程的学习路径,以及如何在小升初,初升高和大学充分的利用起来编程经验的优势
- 足球比赛结果统计表2006-2011年大约28W场比赛
- 基于PHP+mysql的社区交流系统(源代码)
- yolov5,SSD 可能使用到的一些代码
- 一键批量生成多层次文件夹结构,使用Python脚本实现嵌套文件夹批量生成
- 基于c51单片机+DS1302+DHT11温湿度模块+LCD1602显示的万年历硬件原理图+BOM+软件程源码序+仿真图.zip
- NSGA2的MATLAB代码
- Messagepassingtest_GCN_DGL.py
- Sh,Docker 运维好帮手,一招通过 sh 脚本批量快速启动和重启多个Docker 容器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈