STM32学习笔记-USART程序解释(原子).docx_第1页
STM32学习笔记-USART程序解释(原子).docx_第2页
STM32学习笔记-USART程序解释(原子).docx_第3页
STM32学习笔记-USART程序解释(原子).docx_第4页
STM32学习笔记-USART程序解释(原子).docx_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

USART程序分析一 .H文件#ifndef _USART_H#define _USART_H#include #include stdio.hextern u8 USART_RX_BUF64; /接收缓冲,最大63个字节.末字节为换行符 extern u8 USART_RX_STA; /接收状态标记/如果想串口中断接收,请不要注释以下宏定义/#define EN_USART1_RX 使能串口1接收void uart_init(u32 pclk2,u32 bound);#endif 解释:extern 作用域:如果整个工程由多个文件组成,在一个文件中想引用另外一个文件中已经定义的外部变量时,则只需在引用变量的文件中用extern关键字加以声明即可。可见,其作用域从一个文件扩展到多个文件了。例子:文件a.c的内容:#include int BASE=2;/变量定义int exe(int x); /外部函数提前声明int main(int argc, char *agrv) int a=10; printf(%d%d = %dn,BASE,a,exe(a); return 0;文件b.c的内容:#include extern BASE;/外部变量声明int exe(int x) int i; int ret=1; for(i=0;iSR&0X40)=0);/循环发送,直到发送完毕 USART1-DR = (u8) ch; return ch;#endif解释:最后这里就是定义printf的输出执行单元了,比如现在是串口1输出,如果你要串口2,那么设置USART1为USART2即可。#ifdef EN_USART1_RX /如果使能了接收/串口1中断服务程序/注意,读取USARTx-SR能避免莫名其妙的错误 u8 USART_RX_BUF64; /接收缓冲,最大64个字节./接收状态/bit7,接收完成标志/bit6,接收到0x0d/bit50,接收到的有效字节数目u8 USART_RX_STA=0; /接收状态标记 void USART1_IRQHandler(void)u8 res; if(USART1-SR&(1DR; if(USART_RX_STA&0x80)=0)/接收未完成if(USART_RX_STA&0x40)/接收到了0x0dif(res!=0x0a)USART_RX_STA=0;/接收错误,重新开始else USART_RX_STA|=0x80;/接收完成了 else /还没收到0X0Dif(res=0x0d)USART_RX_STA|=0x40;elseUSART_RX_BUFUSART_RX_STA&0X3F=res;USART_RX_STA+;if(USART_RX_STA63)USART_RX_STA=0;/接收数据错误,重新开始接收 #endif解释:void USART1_IRQHandler(void)函数是一个串口1 中断响应函数,当串口1 发生了相应的中断后,就会跳到该函数执行。这里我们设计了一个小小的接收协议:通过这个函数,配合一个数组USART_RX_BUF64,一个接收状态寄存器USART_RX_STA 实现对串口数据的接收管理。USART_RX_BUF 的最大值为64,也就是一次接收的数据最大不能超过64 个字节。USART_RX_STA 是一个接收状态寄存器其各的定义如下表:设计思路如下:当接收到从电脑发过来的数据,把接收到的数据保存在USART_RX_BUF 中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车(0X0D,0X0A)的第一个字节0X0D 时,计数器将不再增加,等待0X0A 的到来,而如果0X0A 没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到0X0A,则标记USART_RX_STA的第七位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到0X0D,那么在接收数据超过64 个了,则会丢弃前面的数据,重新接收。USART1-SR的第5位:USART1-DR通过上述分析,程序便可以理解。/初始化IO 串口1/pclk2:PCLK2时钟频率(Mhz)/bound:波特率/CHECK OK/091209void uart_init(u32 pclk2,u32 bound) float temp;u16 mantissa;u16 fraction; temp=(float)(pclk2*1000000)/(bound*16);/得到USARTDIVmantissa=temp; /得到整数部分fraction=(temp-mantissa)*16; /得到小数部分 mantissaAPB2ENR|=1APB2ENR|=1CRH&=0XFFFFF00F; GPIOA-CRH|=0X000008B0;/IO状态设置 RCC-APB2RSTR|=1APB2RSTR&=(1BRR=mantissa; / 波特率设置 USART1-CR1|=0X200C; /1位停止,无校验位.#ifdef EN_USART1_RX /如果使能了接收/使能接收中断USART1-CR1|=1CR1|=1BRR的值,反过来,我们得到USART1-BRR的值,也可以推导出USARTDIV的值。但我们更关心的是如何从USARTDIV的值得到USART_BRR的值,因为一般我们知道的是波特率,和PCLKx的时钟,要求的就是USART_BRR的值。下面我们来介绍如何通过USARTDIV得到串口USART_BRR寄存器的值。假设我们的串口1要设置为9600的波特率,而PCLK2的时钟为72M。这样,我们根据上面的公式有:USARTDIV=72000000/(9600*16)=468.75那么得到:DIV_Fraction=16*0.75=12=0X0C;DIV_Mantissa= 468=0X1D4;这样,我们就得到了USART1-BRR的值为0X1D4C。只要设置串口1的BRR寄存器值为0X1D4C就可以得到9600的波特率。当然,并不是任何条件下都可以随便设置串口波特率的,在某些波特率和PCLK2频率下,还是会存在误差的,具体可以参考STM32参考手册的第525页的表176。接下来,我们就可以初始化串口了,需要注意的是这里初始化串口是按8位数据格式,1位停止位,无奇偶校验位的。RCC-APB2ENR|=1CRH&=0XFFFFF00F; GPIOA-CRH|=0X000008B0;/IO状态设置IO设置成上啦或下拉模式,一个输入一个输出。RCC-APB2RSTR|=1APB2RSTR&=(1APB2RSTR寄存器的定义。USART1-CR1|=0X200C; /1位停止,无校验位.USART1-CR1|=1CR1|=15; /接收缓冲区非空中断使能参考控制寄存器1(USART

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论