/***************************************************************************
* 文件名: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. Android 开发 Handler的基本使用

    转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/72677227 深入理解Handler.Looper.Messagequeue ...

  2. boost安装缺少libboost_iostreams.so

    编译安装boost库: 1 ./bootstrap.sh 2 ./bjam 3 ./b2 install 但安装boosth后,发现缺少libboost_iostreams.so库,后发现boost库 ...

  3. 201772020113李清华《面向对象程序设计(java)》第八周学习总结

    实验六 接口的定义与使用 实验时间 2018-10-18 1.实验目的与要求 (1) 掌握接口定义方法: (2) 掌握实现接口类的定义要求: (3) 掌握实现了接口类的使用要求: (4) 掌握程序回调 ...

  4. 【FZSZ2017暑假提高组Day1】最大矩形

    [问题描述] 现在有n个宽度为1的矩形按如下图(左边的)所示的方式排在了一起: 用肉眼容易看出,在左图内部面积最大的矩形如右图绿色部分所标注. 现在我们考虑将其中一些宽度为1的矩形取出,按照原顺序再次 ...

  5. vue.js简单添加和删除

    这只是个简单的添加和删除,没有连接后台数据的 <%@ page language="java" contentType="text/html; charset=UT ...

  6. 初学JSON和AJAX心得透过解惑去学习

    虽然复制代码再改参数,也能正常运作.但是看懂里面语法,就可以客制成适合你自己程序.例如录制Excel巨集,会有一些赘句,这时候整合就是很重要工作. [大纲] 时间分配 AJAX Markdown教学及 ...

  7. cast

    https://blog.csdn.net/seabeam/article/details/47841539 在UVM中经常可以看到$cast的身影,这是SV的build-in task之一,当然它还 ...

  8. python note 04 list的应用及元组

    1,昨日内容 ascii:字母,数字,特殊字符:1个字节,8位 Unicode:16位 两个字节 升级 32 位 四个字节 utf-8:最少一个字节 8位表示. 英文字母 8位 1个字节 欧洲16位, ...

  9. [leetcode]39. Combination Sum组合之和

    Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), fin ...

  10. EF ++属性会更新实体

    var lastBaby = await _babyRepository.FirstOrDefaultAsync(); ++lastBaby.sort; -- sort原本为1 -- 最终会生成一条语 ...