/***************************************************************************
* 文件名: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. (7)linux文件常用操作命令

    ls / 查看根目录下的子节点(文件夹和文件)信息ls -al -a是显示隐藏文件 -l是以更详细的列表形式显示 **切换目录cd /home cd .. 返回上一级 **创建文件夹mkdir aaa ...

  2. 源码的excel导入导出

    获取所有数据,将数据进行有序切割,在进行遍历,将其导出. //设置header header("content-type:text/html;charset=utf-8"); // ...

  3. 29 _react-router说明

    一.SPA的理解 1.单页面web应用(single page web application ,SPA) 2.整个应用只有一个完整的页面 3.点击页面中的链接不会刷新页面,本身也不会向服务器发请求 ...

  4. 详解BOM用途分类及在汽车企业中的应用

    摘要:在整车企业中,信息系统的BOM是联系CAD.CAPP.PDM和ERP的纽带,按照用途划分产品要经过产品设计,工程设计.工艺制造设计.生产制造4个阶段,相应的在这4个过程中分别产生了名称十分相似但 ...

  5. ArcGIS自定义工具箱-字段合并

    ArcGIS自定义工具箱-字段合并 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:用指定字符合并两个字段 用例:湖南/长沙=>湖南省长沙市 数据源: 使 ...

  6. 微商城项目 请求接口封装中出现 callback && callback() 原理

    http://www.imooc.com/wenda/detail/522579 因为逻辑运算符&& ||通常具有短路求值的特性即,如果只求部分值就可以得到整个表达式的值,那么剩下的部 ...

  7. Django提交文件的方式

    以上传图片为列, 提交图片文件后能在不刷新页面的前提下显示图片 首先写出一个简单的提交文件的页面: <h>文件上传</h> 选择文件<input type="f ...

  8. 搭建EOS环境

    [搭建EOS环境] 1.Ubuntu 18.04 下安装eosio wget https://github.com/eosio/eos/releases/download/v1.4.4/eosio_1 ...

  9. 命名空间 extern的用法 static全局变量

    std是标准库中的命名空间: 关于extern的用法可以参考文献http://blog.163.com/sunjinxia%40126/blog/static/94984879201312145021 ...

  10. [leetcode]91. Decode Ways解码方法

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...