欢迎来到天天文库
浏览记录
ID:38284104
大小:261.10 KB
页数:7页
时间:2019-06-07
《STM32学习笔记-USART程序解释(原子)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、USART程序分析一.H文件#ifndef__USART_H#define__USART_H#include#include"stdio.h"externu8USART_RX_BUF[64];//接收缓冲,最大63个字节.末字节为换行符externu8USART_RX_STA;//接收状态标记//如果想串口中断接收,请不要注释以下宏定义//#defineEN_USART1_RX使能串口1接收voiduart_init(u32pclk2,u32bound);#endif解
2、释:extern作用域:如果整个工程由多个文件组成,在一个文件中想引用另外一个文件中已经定义的外部变量时,则只需在引用变量的文件中用extern关键字加以声明即可。可见,其作用域从一个文件扩展到多个文件了。例子:文件a.c的内容:#includeintBASE=2;//变量定义intexe(intx);//外部函数提前声明intmain(intargc,char*agrv[]){inta=10;printf("%d^%d=%d",BASE,a,exe(a));return0;}文件
3、b.c的内容:#includeexternBASE;//外部变量声明intexe(intx){inti;intret=1;for(i=0;i4、rt.h"//加入以下代码,支持printf函数,而不需要选择useMicroLIB#if1#pragmaimport(__use_no_semihosting)//标准库需要的支持函数struct__FILE{inthandle;/*Whateveryourequirehere.Iftheonlyfileyouareusingis*//*standardoutputusingprintf()fordebugging,nofilehandling*//*isrequired.*/};/*FILEisty5、pedef’dinstdio.h.*/FILE__stdout;//定义_sys_exit()以避免使用半主机模式_sys_exit(intx){x=x;}解释:一些支持的函数。//重定义fputc函数intfputc(intch,FILE*f){while((USART1->SR&0X40)==0);//循环发送,直到发送完毕USART1->DR=(u8)ch;returnch;}#endif解释:最后这里就是定义printf的输出执行单元了,比如现在是串口1输出,如果你要串口2,那么设置USART16、为USART2即可。#ifdefEN_USART1_RX//如果使能了接收//串口1中断服务程序//注意,读取USARTx->SR能避免莫名其妙的错误u8USART_RX_BUF[64];//接收缓冲,最大64个字节.//接收状态//bit7,接收完成标志//bit6,接收到0x0d//bit5~0,接收到的有效字节数目u8USART_RX_STA=0;//接收状态标记voidUSART1_IRQHandler(void){u8res;if(USART1->SR&(1<<5))//接收到数据{res=U7、SART1->DR;if((USART_RX_STA&0x80)==0)//接收未完成{if(USART_RX_STA&0x40)//接收到了0x0d{if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始elseUSART_RX_STA8、=0x80;//接收完成了}else//还没收到0X0D{if(res==0x0d)USART_RX_STA9、=0x40;else{USART_RX_BUF[USART_RX_STA&0X3F]=res;USART_RX_STA++;if(US10、ART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收}}}}}#endif解释:voidUSART1_IRQHandler(void)函数是一个串口1中断响应函数,当串口1发生了相应的中断后,就会跳到该函数执行。这里我们设计了一个小小的接收协议:通过这个函数,配合一个数组USART_RX_BUF[64],一个接收状态寄存器USART_RX_STA实现对串口数据的接收管理。USART_RX_BUF的最大值为
4、rt.h"//加入以下代码,支持printf函数,而不需要选择useMicroLIB#if1#pragmaimport(__use_no_semihosting)//标准库需要的支持函数struct__FILE{inthandle;/*Whateveryourequirehere.Iftheonlyfileyouareusingis*//*standardoutputusingprintf()fordebugging,nofilehandling*//*isrequired.*/};/*FILEisty
5、pedef’dinstdio.h.*/FILE__stdout;//定义_sys_exit()以避免使用半主机模式_sys_exit(intx){x=x;}解释:一些支持的函数。//重定义fputc函数intfputc(intch,FILE*f){while((USART1->SR&0X40)==0);//循环发送,直到发送完毕USART1->DR=(u8)ch;returnch;}#endif解释:最后这里就是定义printf的输出执行单元了,比如现在是串口1输出,如果你要串口2,那么设置USART1
6、为USART2即可。#ifdefEN_USART1_RX//如果使能了接收//串口1中断服务程序//注意,读取USARTx->SR能避免莫名其妙的错误u8USART_RX_BUF[64];//接收缓冲,最大64个字节.//接收状态//bit7,接收完成标志//bit6,接收到0x0d//bit5~0,接收到的有效字节数目u8USART_RX_STA=0;//接收状态标记voidUSART1_IRQHandler(void){u8res;if(USART1->SR&(1<<5))//接收到数据{res=U
7、SART1->DR;if((USART_RX_STA&0x80)==0)//接收未完成{if(USART_RX_STA&0x40)//接收到了0x0d{if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始elseUSART_RX_STA
8、=0x80;//接收完成了}else//还没收到0X0D{if(res==0x0d)USART_RX_STA
9、=0x40;else{USART_RX_BUF[USART_RX_STA&0X3F]=res;USART_RX_STA++;if(US
10、ART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收}}}}}#endif解释:voidUSART1_IRQHandler(void)函数是一个串口1中断响应函数,当串口1发生了相应的中断后,就会跳到该函数执行。这里我们设计了一个小小的接收协议:通过这个函数,配合一个数组USART_RX_BUF[64],一个接收状态寄存器USART_RX_STA实现对串口数据的接收管理。USART_RX_BUF的最大值为
此文档下载收益归作者所有