历史上的今天
返回首页

历史上的今天

今天是:2025年05月08日(星期四)

正在发生

2021年05月08日 | 通过学习USART1深入STM32F107VCT6的串口通信

2021-05-08 来源:eefocus

简介:STM32有数个串口,每个串口都有一个自己独立的波特率寄存器USART_BRR,通过设置该寄存器就可以达到配置不同波特率的目的,由于STM32采用分数波特率,所以STM32的串口波特率设置范围很宽,而且误差很小。


在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。


USART通过3个引脚与其他设备连接在一起,任何USART双向通信至少需要2个引脚:接受数据输入(RX)和发送数据输出(TX)。


RX: 接受数据串行输入。通过过采样技术来区别数据和噪音,从而恢复数据。


TX: 发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处处于高电平。在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。



一般有两种工作方式:查询和中断。


(1)查询:串口程序不断地循环查询,看看当前有没有数据要它传送。如果有,就帮助传送(可以从PC到STM32板子,也可以从STM32板子到PC)。


(2)中断:平时串口只要打开中断即可。如果发现有一个中断来,则意味着要它帮助传输数据——它就马上进行数据的传送。同样,可以从 PC到STM3板子,也可以从STM32板子到PC


注意:


发动和接受都需要配合标志等待。


只能对一个字节操作,对字符串等大量数据操作需要写函数


使用串口所需设置:RCC初始化里面打开RCC_APB2PeriphClockCmd


(RCC_APB2Periph_USARTx);GPIO里面管脚设定:串口RX(50Hz,IN_FLOATING);串口TX(50Hz,AF_PP);


printf函数重定义(不必理解,调试通过以备后用)


需要c标准函数:#include "stdio.h"


增加为putchar函数。


int putchar(int c) //putchar函数


{if (c == 'n'){putchar('r');} //将printf的n变成r


USART_SendData(USART1, c); //发送字符


while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} //等待发送结束


return c; //返回值


}


printf使用变量输出:%c字符,%d整数,%f浮点数,%s字符串,/n或/r为换行。注意:只能用于main.c中。


另外:


STM32支持三个串口,在usart1默认引脚被占用的情况下可以将usart1映射到PB0.6和PB0.7上。实现的方法 如下:


1、打开GPIO的AFIO时钟,使用stm32功能模块之前,必须开时钟;


2、使能USART1的映射,


3、配置USART1映射后的GPIO(PB0.6,PB0.7)


具体实现:


1、在set_systm函数中添加如下模块,打开AFIO时钟,使能USART1映射


#ifdef USB_TO_KLINE_USART1_REMAP


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);


GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);


#endif


2、在set_systm函数中添加如下模块,配置USART1映射后的GPIO


#ifdef USB_TO_KLINE_USART1_REMAP


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


GPIO_Init(GPIOB, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;


GPIO_Init(GPIOB, &GPIO_InitStructure);


#else


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;


GPIO_Init(GPIOA, &GPIO_InitStructure);


#endif


例:



#include "stm32f10x.h"


#include "stm32_eval.h"


#include


USART_InitTypeDef USART_InitStructure; //定义结构体类型变量


void GPIO_Configuration(void); //声明GPIO配置函数


#ifdef __GNUC__


#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) //此处定义为putchar应用


#else


#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)


#endif



int main(void)


{


SystemInit(); //配置系统时钟


RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_AFIO, ENABLE); //打开APB2功能时钟(UART1为连接在APB2上的高速外设)开启了串口时钟和复用功能时钟


GPIO_Configuration(); //调用GPIO配置函数


USART_InitStructure.USART_BaudRate = 115200; //设置USART传输波特率


USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置USART传输数据位一帧为8位


USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置USART传输每帧一个停止位


USART_InitStructure.USART_Parity = USART_Parity_No; //设置USART无奇偶校验


USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置USART无硬件流控制


USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//开启USART发送和接受功能


USART_Init(USART1, &USART_InitStructure); //初始化USART1设置


USART_Cmd(USART1, ENABLE); //开启USART1


printf("nr 李继超是个好人吗? nr");


printf("nr 回答:李继超是个大好人! nr");


printf("nr 菏泽是个是个美丽的地方! nr");


printf("nr 发生了什么?你是猴子请来的救兵吗? nr");


printf("nr 嗯!李继超的确是个大好人!!!你才魔道呢!哼!!! nr"); //配置输出数据


while (1)


{


}


}


void GPIO_Configuration(void)


{


GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量类型


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //打开GPIOA的功能时钟


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //选择GPIO引脚GPIO_Pin_9


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置GPIO速率


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置GPIO_pin_9为 复用功能 推挽输出


GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO_Pin_9设置






GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //选择GPIO引脚GPIO_Pin_10


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置GPIO_Pin_10浮空输入


GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIO_Pin_10设置


}


PUTCHAR_PROTOTYPE //重定义printf函数


{


USART_SendData(USART1, (uint8_t) ch); //发送字符串


while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)// 检测是否发送完成


{}


return ch;


}




#ifdef USE_FULL_ASSERT




void assert_failed(uint8_t* file, uint32_t line)


{


while (1)


{}


}


#endif


推荐阅读

史海拾趣

泽耀科技(Ashining)公司的发展小趣事

随着企业规模的扩大和影响力的提升,泽耀科技(Ashining)开始积极承担社会责任,推动可持续发展。公司注重环保和节能技术的应用,致力于生产环保型电子产品,减少生产过程中的能源消耗和环境污染。同时,泽耀科技还积极参与社会公益事业,为社会的发展贡献自己的力量。

这些故事展示了泽耀科技(Ashining)在电子行业中的发展历程和取得的成就,也体现了公司不断创新、追求卓越的精神。未来,泽耀科技将继续秉持这一精神,为电子行业的发展贡献更多的力量。

Eurosil Electronics Ltd公司的发展小趣事

作为一家有社会责任感的企业,Eurosil始终关注社会公益事业。公司积极参与各种公益活动,如捐赠教育设施、支持贫困地区发展等。通过这些活动,Eurosil不仅回馈了社会,也提升了企业的社会形象和品牌价值。同时,公司还鼓励员工参与志愿服务活动,培养员工的公益意识和社会责任感。

Advanced Optoelectronic Technology Corp公司的发展小趣事

随着产品线的不断扩展,AOTC开始进军国际市场。公司积极与各大电子厂商合作,将光电转换器集成到各类电子产品中,从而实现了市场份额的快速增长。同时,公司还不断投入研发,对产品进行升级迭代,以满足市场不断变化的需求。

Elekon Industries公司的发展小趣事

随着业务的不断发展,Elekon开始寻求更广阔的市场空间。公司制定了全球化战略,积极开拓国际市场。通过参加国际展会、建立海外销售网络等方式,Elekon成功将产品打入国际市场,并赢得了众多客户的青睐。同时,Elekon还与国际知名电子企业建立了合作关系,共同研发新产品、开拓新市场。

Base Two (2) Systems公司的发展小趣事

随着公司业务的不断发展壮大,Base Two (2) Systems开始实施国际化战略。公司积极拓展海外市场,与多个国家和地区的合作伙伴建立了合作关系。同时,公司还在海外设立了研发中心和生产基地,以便更好地服务全球客户。这一国际化战略的实施,使得公司的业务范围更加广泛,也为公司的未来发展打开了新的篇章。

这五个故事展示了Base Two (2) Systems在电子行业中的发展历程和取得的成就。通过技术创新、市场扩张、研发投入、品质管理和国际化战略的实施,公司逐渐发展成为电子行业中的佼佼者,为行业的发展做出了积极的贡献。

EETools公司的发展小趣事

随着技术的不断进步和市场的变化,EETools意识到必须不断创新才能保持竞争力。公司投入大量研发资源,对嵌入式开发工具进行技术升级和产品优化。经过数年的努力,EETools成功推出了一系列具有领先技术的嵌入式开发工具,如高性能的芯片编程器、智能调试器等。这些产品不仅提高了客户的工作效率,还降低了成本,赢得了市场的广泛认可。

问答坊 | AI 解惑

大家讨论一下电子技术课程设计的项目问题

本帖最后由 paulhyde 于 2014-9-15 09:26 编辑 如题,电子技术课程设计的项目问题一直困扰,想分三种类型,一种就是“合格”标准的题目,一种“良好”标准,一种“优秀”标准,可就是确定不了具体用什么项目,请各位大虾支招!谢谢!  …

查看全部问答>

一款不好找的word批量转txt

WORD格式的文章,没法在mp4上读!找到一个word文档批量转换工具,带注册机的。 …

查看全部问答>

Led 强大创意设计-有趣、时尚、另类的创意图片!不可不看!!!

replyreload += \',\' + 380871;Timson,如果您要查看本帖隐藏内容请回复把480个Led灯及光学感应器嵌在桌子里面, 只要你轻轻触碰到桌面,就如水面一样,会泛起led灯的涟漪效果,非常棒的效果。 LED 夹灯给夹子加上一个小小的led 灯,它的效果和功 ...…

查看全部问答>

Windows驱动难题请教,如何让UI层响应设备插入的事件

我给一个USB设备写了个驱动程序 这个设备每次在插入的时候,都需要在UI层进行一系列的配置工作,然后才能开始工作 考虑如果使用Coinstaller,只能在第一次安装的时候起作用,以后再插入就不行了 也不能使用服务或者其他随系统启动运行的扫描进程 ...…

查看全部问答>

串口接收的数据有部分乱码

各位好: 我用扫描枪读条码信息,怎么得到的内容有部分汉字是乱码啊?大部分是正常的~ 我用的.net 2.0的serialport类 代码如下:         private void m_com1_DataReceived(object sender, System.IO.Ports.Se ...…

查看全部问答>

【项目外包】基于FPGA的CCD图像采集系统

基于FPGA的CCD图像采集系统 项目预算:¥ 50,000~100,000 开发周期: 30 天 项目分类: 嵌入式 竞标要求: 项目标签: FPGA CCD v ...…

查看全部问答>

msp430 产生正弦波 DA转换的,谢谢

msp430 产生正弦波 DA转换的,谢谢…

查看全部问答>

初学者,请教下430中的pringtf怎么调试呢

我用的IAR,f5438开发板下面那个printf不知道打印到哪里去了?求指点; #include \"msp430x54x.h\" #include \"stdio.h\" //************************************************************* unsigned char *point; void main( void ) { ...…

查看全部问答>

LPC800基于模拟比较器的∑ -Δ ADC实现

500PCS开发板已经发出,为大家找些资料。 …

查看全部问答>

一年来学习MSP430的感触

从我开始接触430这个单片机到现在大约有一年了。开始由于条件制约,我只是从学校图书馆借书看,大约学了一个月左右,觉得没有什么收获,后来就跟老师申请买了一块开发板,不贵才一百多。通过光盘资料,我先是学习了视频资料,因为刚接触还是听听老 ...…

查看全部问答>