/***************************************************************************
* 文件名:USART.h *
* 编写人:离逝的风 *
* 更新时间:2018.10.6 *
* 说明:此文件属于开源,所有权对任何人开放 *
* 如有问题请联系邮箱:1477153217@qq.com *
* *
* USART使用步骤如下: *
* 1.使能USART,即设置USARTx_EN为1 *
* 2.设置波特率,即设置USARTx_BaudRate的值 *
* 3.在主函数中调用USARTx_Init()函数来初始化该串口 *
* 4.完成上面操作就可以使用函数对其进行发送或接受数据了,接受数据在缓存区中读取即可 *
***************************************************************************/
#ifndef __USART_H
#define __USART_H #include "stm32f10x.h" /**###########################文件配置,用户根据自己情况配置#########################*/
//需要使用则设置为1,否则为0
#define USART1_EN 1
#define USART2_EN 0
#define USART3_EN 0
#define UART4_EN 0
#define UART5_EN 0
/**###########################参数定义部分,按用户要求修改#########################*/ #define USART1_BaudRate 9600 //波特率设置,默认9600
#define USART2_BaudRate 9600 //波特率设置,默认9600
#define USART3_BaudRate 9600 //波特率设置,默认9600
#define UART4_BaudRate 9600 //波特率设置,默认9600
#define UART5_BaudRate 9600 //波特率设置,默认9600 /*#############################下面为USRAT1接口函数############################################*/
//备注:USART1引脚为PA9和PA10,使用USART1则这两个引脚无法用做别的
#if(USART1_EN==1)
void USART1_Init(void);
void USART1_PrintString( char *String);
unsigned char USART1_ReceiveByte(void);
void USART1_PrintNumber(unsigned long number);
extern char Receive1BUFF[];
#endif
/*#############################下面为USRAT2接口函数############################################*/
//备注:USART1引脚为PA3和PA2,使用USART2则这两个引脚无法用做别的
#if(USART2_EN==1)
void USART2_Init(void);
void USART2_PrintString( char *String);
unsigned char USART2_ReceiveByte(void);
void USART2_PrintNumber(unsigned long number);
extern char Receive2BUFF[];
#endif
/*#############################下面为USRAT3接口函数############################################*/
//备注:USART3引脚为PB11和PB10,使用USART3则这两个引脚无法用做别的
#if(USART3_EN==1)
void USART3_Init(void);
void USART3_PrintString( char *String);
unsigned char USART3_ReceiveByte(void);
void USART3_PrintNumber(unsigned long number);
extern char Receive3BUFF[];
#endif
/*#############################下面为URAT4接口函数############################################*/
//备注:UART4引脚为PC11和PC10,使用UART4则这两个引脚无法用做别的
#if(UART4_EN==1)
void UART4_Init(void);
void UART4_PrintString( char *String);
unsigned char UART4_ReceiveByte(void);
void UART4_PrintNumber(unsigned long number);
extern char Receive4BUFF[];
#endif /*#############################下面为URAT5接口函数############################################*/
//备注:UART5引脚为PC12和PD2,使用UART5则这两个引脚无法用做别的
#if(UART5_EN==1)
void UART5_Init(void);
void UART5_PrintString( char *String);
unsigned char UART5_ReceiveByte(void);
void UART5_PrintNumber(unsigned long number);
extern char Receive5BUFF[];
#endif #endif
/**************************************************************************
* 文件名:USART.c *
* 编写人:离逝的风 *
* 更新时间:2018.10.6 *
* 说明:此文件属于开源,所有权对任何人开放 *
* 如有问题请联系邮箱:1477153217@qq.com *
***************************************************************************/
//Example: USART1 bit rate: 9600,CRC: none ,stop bit: n bit #include "USART.h"
#if(USART1_EN==1)
char Receive1BUFF[]={};
unsigned char USART1_ReCoun=;
#endif
#if(USART2_EN==1)
char Receive2BUFF[]={};
unsigned char USART2_ReCoun=;
#endif
#if(USART3_EN==1)
char Receive3BUFF[]={};
unsigned char USART3_ReCoun=;
#endif
#if(UART4_EN==1)
char Receive4BUFF[]={};
unsigned char UART4_ReCoun=;
#endif
#if(UART5_EN==1)
char Receive5BUFF[]={};
unsigned char UART5_ReCoun=;
#endif /*##############################下面为USART1函数部分#################################################*/
#if(USART1_EN==1)
void USART1_Init(void)
{
unsigned int integer; //定义一个变量,存储整数部分
float decimal; //定义一个变量,存储小数部分
RCC->APB2ENR|=(<<)|(<<); //开启USART1时钟和GPIOA时钟
RCC->APB2RSTR|=(<<); //复位外设USART1
RCC->APB2RSTR&=(~(<<)); //停止复位 GPIOA->CRH&=0XFFFFF00F; //清除之前配置PA10和PA9
GPIOA->CRH|=0X000008B0; //配置PA10为上拉输入,配置PA9为复用推挽输出 USART1->CR1|=(<<); //使能USART模块
USART1->CR1|=(<<); //使能接收
USART1->CR1|=(<<); //开中断
USART1->CR1|=(<<); //使能发送 integer=**/(USART1_BaudRate*); //取出整数部分
decimal=(float)(**/(USART1_BaudRate*))-integer; //取出小数部分
USART1->BRR=(integer<<)|((unsigned int)decimal*); //将转换后的值赋给BRR寄存器 NVIC_SetPriorityGrouping(); //设置优先级分组1
NVIC_SetPriority(USART1_IRQn, NVIC_EncodePriority(,,)); //设置抢占优先级为1,子优先级为1
NVIC_EnableIRQ(USART1_IRQn); //使能USART中断 } void USART1_PrintNumber(unsigned long number)
{
unsigned char usart_save[]={};
unsigned char *usart_p;
unsigned char i=;
unsigned int num=;
num=number; while(num/)
{
num/=;
i++;
}
usart_p=usart_save;
for(;i>;i--)
{
usart_save[i-]=number%+;
number/=;
}
while(*usart_p)
{
USART1->DR=*usart_p;
while(!(USART1->SR&(<<)));
usart_p++;
} } void USART1_PrintString( char *String)
{
char *p;
p=String;
while(*p)
{
USART1->DR=*p;
while(!(USART1->SR&(<<)));
p++;
}
} unsigned char USART1_ReceiveByte(void)
{
unsigned char Receive=; //定义一个接受变量
Receive=USART1->DR; //将数据寄存器中的值赋给接受变量
return Receive;
} void USART1_IRQHandler(void)
{
while((USART1->SR&(<<))==0x20)
Receive1BUFF[USART1_ReCoun++]=USART1->DR;
if(USART1_ReCoun==)
USART1_ReCoun=;
}
#endif /*###############################下面为USART2函数部分#################################################*/
#if(USART2_EN==1)
void USART2_Init(void)
{
unsigned int integer; //定义一个变量,存储整数部分
float decimal; //定义一个变量,存储小数部分
RCC->APB2ENR|=(<<); //开启GPIOA时钟
RCC->APB1ENR|=(<<); //开启USART2时钟
RCC->APB1RSTR|=(<<); //复位外设USART2
RCC->APB1RSTR&=(~(<<)); //停止复位 GPIOA->CRL&=0XFFFFF00F; //清除之前配置PA3和PA2
GPIOA->CRL|=0X000008B0; //配置PA3为上拉输入,配置PA2为复用推挽输出 USART2->CR1|=(<<); //使能USART模块
USART2->CR1|=(<<); //使能接收
USART2->CR1|=(<<); //开中断
USART2->CR1|=(<<); //使能发送 integer=**/(USART2_BaudRate*); //取出整数部分
decimal=(float)(**/(USART2_BaudRate*))-integer; //取出小数部分
USART2->BRR=(integer<<)|((unsigned int)decimal*); //将转换后的值赋给BRR寄存器 NVIC_SetPriorityGrouping(); //设置优先级分组1
NVIC_SetPriority(USART2_IRQn, NVIC_EncodePriority(,,)); //设置抢占优先级为1,子优先级为2
NVIC_EnableIRQ(USART2_IRQn); //使能USART中断 } void USART2_PrintNumber(unsigned long number)
{
unsigned char usart_save[]={};
unsigned char *usart_p;
unsigned char i=;
unsigned int num=;
num=number; while(num/)
{
num/=;
i++;
}
usart_p=usart_save;
for(;i>;i--)
{
usart_save[i-]=number%+;
number/=;
}
while(*usart_p)
{
USART2->DR=*usart_p;
while(!(USART2->SR&(<<)));
usart_p++;
} } void USART2_PrintString( char *String)
{
char *p;
p=String;
while(*p)
{
USART2->DR=*p;
while(!(USART2->SR&(<<)));
p++;
}
} unsigned char USART2_ReceiveByte(void)
{
unsigned char Receive=; //定义一个接受变量
Receive=USART2->DR; //将数据寄存器中的值赋给接受变量
return Receive;
} void USART2_IRQHandler(void)
{
while((USART2->SR&(<<))==0x20)
Receive2BUFF[USART2_ReCoun++]=USART2->DR;
if(USART2_ReCoun==)
USART2_ReCoun=;
}
#endif /*##############################下面为USART3函数定义#################################################*/
#if(USART3_EN==1)
void USART3_Init(void)
{
unsigned int integer; //定义一个变量,存储整数部分
float decimal; //定义一个变量,存储小数部分
RCC->APB2ENR|=(<<); //开启GPIOB时钟
RCC->APB1ENR|=(<<); //开启USART3时钟
RCC->APB1RSTR|=(<<); //复位外设USART3
RCC->APB1RSTR&=(~(<<)); //停止复位 GPIOB->CRH&=0XFFFF00FF; //清除之前配置PB11和PB10
GPIOB->CRH|=0X00008B00; //配置PB11为上拉输入,配置PB10为复用推挽输出 USART3->CR1|=(<<); //使能USART模块
USART3->CR1|=(<<); //使能接收
USART3->CR1|=(<<); //开中断
USART3->CR1|=(<<); //使能发送 integer=**/(USART3_BaudRate*); //取出整数部分
decimal=(float)(**/(USART3_BaudRate*))-integer; //取出小数部分
USART3->BRR=(integer<<)|((unsigned int)decimal*); //将转换后的值赋给BRR寄存器 NVIC_SetPriorityGrouping(); //设置优先级分组1
NVIC_SetPriority(USART3_IRQn, NVIC_EncodePriority(,,)); //设置抢占优先级为1,子优先级为3
NVIC_EnableIRQ(USART3_IRQn); //使能USART中断 } void USART3_PrintNumber(unsigned long number)
{
unsigned char usart_save[]={};
unsigned char *usart_p;
unsigned char i=;
unsigned int num=;
num=number; while(num/)
{
num/=;
i++;
}
usart_p=usart_save;
for(;i>;i--)
{
usart_save[i-]=number%+;
number/=;
}
while(*usart_p)
{
USART3->DR=*usart_p;
while(!(USART3->SR&(<<)));
usart_p++;
} } void USART3_PrintString( char *String)
{
char *p;
p=String;
while(*p)
{
USART3->DR=*p;
while(!(USART3->SR&(<<)));
p++;
}
} unsigned char USART3_ReceiveByte(void)
{
unsigned char Receive=; //定义一个接受变量
Receive=USART3->DR; //将数据寄存器中的值赋给接受变量
return Receive;
} void USART3_IRQHandler(void)
{
while((USART3->SR&(<<))==0x20)
Receive3BUFF[USART3_ReCoun++]=USART3->DR;
if(USART3_ReCoun==)
USART3_ReCoun=;
} #endif /*##############################下面为UART4函数定义#################################################*/
#if(UART4_EN==1)
void UART4_Init(void)
{
unsigned int integer; //定义一个变量,存储整数部分
float decimal; //定义一个变量,存储小数部分
RCC->APB2ENR|=(<<); //开启GPIOC时钟
RCC->APB1ENR|=(<<); //开启USART4时钟
RCC->APB1RSTR|=(<<); //复位外设USART4
RCC->APB1RSTR&=(~(<<)); //停止复位 GPIOC->CRH&=0XFFFF00FF; //清除之前配置PC11和PC10
GPIOC->CRH|=0X00008B00; //配置PC11为上拉输入,配置PC10为复用推挽输出 UART4->CR1|=(<<); //使能USART模块
UART4->CR1|=(<<); //使能接收
UART4->CR1|=(<<); //开中断
UART4->CR1|=(<<); //使能发送 integer=**/(UART4_BaudRate*); //取出整数部分
decimal=(float)(**/(UART4_BaudRate*))-integer; //取出小数部分
UART4->BRR=(integer<<)|((unsigned int)decimal*); //将转换后的值赋给BRR寄存器 NVIC_SetPriorityGrouping(); //设置优先级分组1
NVIC_SetPriority(UART4_IRQn, NVIC_EncodePriority(,,)); //设置抢占优先级为1,子优先级为3
NVIC_EnableIRQ(UART4_IRQn); //使能USART中断 } void UART4_PrintNumber(unsigned long number)
{
unsigned char usart_save[]={};
unsigned char *usart_p;
unsigned char i=;
unsigned int num=;
num=number; while(num/)
{
num/=;
i++;
}
usart_p=usart_save;
for(;i>;i--)
{
usart_save[i-]=number%+;
number/=;
}
while(*usart_p)
{
UART4->DR=*usart_p;
while(!(UART4->SR&(<<)));
usart_p++;
} } void UART4_PrintString( char *String)
{
char *p;
p=String;
while(*p)
{
UART4->DR=*p;
while(!(UART4->SR&(<<)));
p++;
}
} unsigned char UART4_ReceiveByte(void)
{
unsigned char Receive=; //定义一个接受变量
Receive=UART4->DR; //将数据寄存器中的值赋给接受变量
return Receive;
} void UART4_IRQHandler(void)
{
while((UART4->SR&(<<))==0x20)
Receive4BUFF[UART4_ReCoun++]=UART4->DR;
if(UART4_ReCoun==)
UART4_ReCoun=;
} #endif /*##############################下面为UART5函数定义#################################################*/
#if(UART5_EN==1)
void UART5_Init(void)
{
unsigned int integer; //定义一个变量,存储整数部分
float decimal; //定义一个变量,存储小数部分
RCC->APB2ENR|=(<<); //开启GPIOC时钟
RCC->APB2ENR|=(<<); //开启GPIOD时钟
RCC->APB1ENR|=(<<); //开启USART4时钟
RCC->APB1RSTR|=(<<); //复位外设USART4
RCC->APB1RSTR&=(~(<<)); //停止复位 GPIOC->CRH&=0XFFF0FFFF; //清除之前配置PC12
GPIOC->CRH|=0X000B0000; //配置PC1为上拉输入,配置PC12为复用推挽输出
GPIOD->CRL&=0XFFFFF0FF; //清除之前配置PD2
GPIOD->CRL|=0X00000800; //配置PD2为上拉输入 UART5->CR1|=(<<); //使能USART模块
UART5->CR1|=(<<); //使能接收
UART5->CR1|=(<<); //开中断
UART5->CR1|=(<<); //使能发送 integer=**/(UART5_BaudRate*); //取出整数部分
decimal=(float)(**/(UART5_BaudRate*))-integer; //取出小数部分
UART5->BRR=(integer<<)|((unsigned int)decimal*); //将转换后的值赋给BRR寄存器 NVIC_SetPriorityGrouping(); //设置优先级分组1
NVIC_SetPriority(UART5_IRQn, NVIC_EncodePriority(,,)); //设置抢占优先级为1,子优先级为3
NVIC_EnableIRQ(UART5_IRQn); //使能USART中断 } void UART5_PrintNumber(unsigned long number)
{
unsigned char usart_save[]={};
unsigned char *usart_p;
unsigned char i=;
unsigned int num=;
num=number; while(num/)
{
num/=;
i++;
}
usart_p=usart_save;
for(;i>;i--)
{
usart_save[i-]=number%+;
number/=;
}
while(*usart_p)
{
UART5->DR=*usart_p;
while(!(UART5->SR&(<<)));
usart_p++;
} } void UART5_PrintString( char *String)
{
char *p;
p=String;
while(*p)
{
UART5->DR=*p;
while(!(UART5->SR&(<<)));
p++;
}
} unsigned char UART5_ReceiveByte(void)
{
unsigned char Receive=; //定义一个接受变量
Receive=UART5->DR; //将数据寄存器中的值赋给接受变量
return Receive;
} void UART5_IRQHandler(void)
{
while((UART5->SR&(<<))==0x20)
Receive5BUFF[UART5_ReCoun++]=UART5->DR;
if(UART5_ReCoun==)
UART5_ReCoun=;
} #endif

USART of STM32的更多相关文章

  1. 嵌入式单片机STM32应用技术(课本)

    目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...

  2. 第20章 USART—串口通讯

    本章参考资料:<STM32F76xxx参考手册>USART章节. 学习本章时,配合<STM32F76xxx参考手册>USART章节一起阅读,效果会更佳,特别是涉及到寄存器说明的 ...

  3. 第20章 USART—串口通讯—零死角玩转STM32-F429系列

    第20章      USART—串口通讯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fi ...

  4. 串口(USART)框图的讲解

    STM32 的 USART 简介 通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵 ...

  5. STM32—串口通讯详解

    串口通讯目录 物理层 协议层 USART简介 开发板与上位机的连接 代码讲解: 一.初始化结构体 二.NVIC配置中断优先级 三.USART配置函数讲解 四.传输数据的函数: 1.发送一个字节 2.发 ...

  6. (stm32f103学习总结)—USART串口通信

    一. USART简介 USART即通用同步异步收发器,它能够灵活地与外部设备进行全双工 数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求. UART即通用异步收发器,它是在USART基 ...

  7. stm32 usart 异步传输示例

    STM32F103xE的USART异步数据传输示例 USART全称Universal Synchronous/Asynchronous Receiver/Transmitter,是一种可以进行同步/异 ...

  8. STM32的USART中断死循环,形成死机。

    作者:观海  QQ:531622 直接说重点:我用的是 STM32F103 芯片 USART2_IRQHandler 总是中断,程序死循环. 1.出现问题: 原程序的中断处理程序是: void USA ...

  9. [stm32] NRF24L01+USART搞定有线和无线通信

    前言 一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法.这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据 ...

随机推荐

  1. 关于element-ui日期选择器disabledDate使用心得

    实现目的: 使用type="data"类型实现具备开始日期与结束日期组件(ps:element有自带的type="daterange"类型的组件可以实现此功能) ...

  2. Mysql相关问题集锦

    1:连接阿里云的服务器时,用navicate连接SSH时提示:或提示指到另一个IP从而进不去. SSH:expected key exchange group packet form server 解 ...

  3. Swift get和set方法以及只读属性(计算型属性,本身不保存数据,都是通过计算获得结果)

    import UIKit class Person: NSObject { private var _name: String? var name: String? { get { return _n ...

  4. python——列表入门

    学习列表先分析一段程序: list = ['zx', 'xkd', 1997, 2018] list1=list+[1,2,3]#列表拼接 list2=[list,list1] print('嵌套的列 ...

  5. 转: rem与px的转换

    rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个参考值,这个参考值设置为多少,完全可以根据您自己的需求来定.· 我们知道,浏览器默认的字号16px,来看一些px单 ...

  6. CSS表单3 光标样式 (每个位置鼠标放上去的样式不同)

    <!DOCTYPE html> <html>     <head>         <title>单选按钮对齐</title>        ...

  7. list中null或者空的区别

    1.list 空 默认值是空,即没有值 null 理解为没有对list集合分配内存空间,实际上压根就不存在. 也可以这样理解: null  未建立对象 空    建立对象未放入值 例如  我有一个空着 ...

  8. 人人开源框架使用 renren fast

    参考地址人人开源官网: https://www.renren.io/guide/ 1.介绍 1.1.项目描述 renren-fast 是一个轻量级的 Spring Boot 快速开发平台,能快速开发项 ...

  9. FortiGate路由模式--静态地址线路上网配置

    1.需求:外网接口使用专线,由运营商分配指定的静态地址,内网为192.168.1.0/24网段,实现基本上网功能. 运营商分配ip地址:202.1.1.10,网关地址:202.1.1.9, DNS:2 ...

  10. 536. Construct Binary Tree from String 从括号字符串中构建二叉树

    [抄题]: You need to construct a binary tree from a string consisting of parenthesis and integers. The ...