/***************************************************************************
* 文件名: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. java面试多线程问题

    Java多线程面试问题 1. 进程和线程之间有什么不同? 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环 ...

  2. web.xml的加载过程配置详解

      一:web.xml加载过程 简单说一下,web.xml的加载过程.当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等).首先会去读取web.xml配置文件里的配置,当这一步骤没有 ...

  3. ABAP-IDOC配置

    转载路径: http://www.cnblogs.com/jiangzhengjun/p/4292135.html#_Toc411677431 https://wenku.baidu.com/view ...

  4. selenium 3.0变化

    Selenium3.0的变化 最大的变化应该是去掉了Selenium RC 了,这是必然的结果.Selenium RC 是Selenium1.0的产物,Selenium2.0以WebDriver为主, ...

  5. mybatis sql参考

    参考mybatis sql: <select id="xxx" resultType="com.xxxx.xxx.vo.xx.xx" parameterT ...

  6. Centos安装ffmpeg

    yum install -y ffmpeg 使用上面的命令安装却出现以下问题: Google后发现缺少一些扩展: wget https://download1.rpmfusion.org/free/e ...

  7. React Native在window下的环境搭建(一)

    React Native官方开发文档 以下是本人抄录的: 初次接触React Native感觉和React很像,却是有点类似,但不完全是,React Native有自己的组件对象,不过它也自定义的组件 ...

  8. 使用jQuery+huandlebars循环中索引(@index)使用技巧(访问父级索引)

    兼容ie8(很实用,复制过来,仅供技术参考,更详细内容请看源地址:http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html) & ...

  9. centos7下面添加htop工具

    htop下载wget http://sourceforge.net/projects/htop/files/latest/download 解压tar -zxf downloadcd htop-1.0 ...

  10. ES6中的let命令

    ES6新增了let命令,用于声明变量.其用法类似var,区别是使用let命令声明的变量只在当前代码块有效. for循环的计数器就很适合使用let命令. var arr= [1,2,3,4,5]; fo ...