历史上的今天
返回首页

历史上的今天

今天是:2024年10月13日(星期日)

正在发生

2021年10月13日 | 利用STM32 的串口来发送和接收数据实验

2021-10-13 来源:eefocus

0.目标

利用串口 1 不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。  

 

1.STM32 串口简介

串口设置的一般步骤可以总结为如下几个步骤:
1) 串口时钟使能, GPIO 时钟使能
2) 串口复位
3) GPIO 端口模式设置
4) 串口参数初始化
5) 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)
6) 使能串口
7) 编写中断处理函数 


注:对于复用功能的 IO,我们首先要使能 GPIO 时钟,然后使能复用功能时钟,同时要把 GPIO 模式设置为复用功能对应的模式。


查看手册《STM32 中文参考手册 V10》P110 的表格“8.1.11 外设的 GPIO 配置:

2 硬件设计

(1)LED0接PA0

(2)串口1

 

3.软件设计

新建工程:

其中SYSTEM下放置原子哥提供的三个文件夹delay、sys、uart(及其文件),HARDWARE下建LED文件夹,及其内建LED.C与LED.H文件。


uart中串口函数:


  1. void uart_init(u32 bound){

  2. //GPIO端口设置

  3. GPIO_InitTypeDef GPIO_InitStructure;

  4. USART_InitTypeDef USART_InitStructure;

  5. NVIC_InitTypeDef NVIC_InitStructure;

  6.  

  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟

  8. //USART1_TX PA.9

  9. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9

  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  11. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

  12. GPIO_Init(GPIOA, &GPIO_InitStructure);

  13.  

  14. //USART1_RX PA.10

  15. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

  16. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入

  17. GPIO_Init(GPIOA, &GPIO_InitStructure);

  18.  

  19. //Usart1 NVIC 配置

  20.  

  21. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  22. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3

  23. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3

  24. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能

  25. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器

  26.  

  27. //USART 初始化设置

  28.  

  29. USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;

  30. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式

  31. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位

  32. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位

  33. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制

  34. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

  35.  

  36. USART_Init(USART1, &USART_InitStructure); //初始化串口

  37. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断

  38. USART_Cmd(USART1, ENABLE); //使能串口

  39.  

  40. }

 

LED.c内容:


  1. #include "led.h"

  2.  

  3. //初始化PA0为输出口.并使能这个口的时钟

  4. //LED IO初始化

  5. void LED_Init(void)

  6. {

  7.  

  8. GPIO_InitTypeDef GPIO_InitStructure;

  9.  

  10. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟

  11.  

  12. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PA0 端口配置

  13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

  15. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA0

  16. GPIO_SetBits(GPIOA,GPIO_Pin_0); //PA0 输出高

  17. }

  18.  

led.h:
 

  1. #ifndef __LED_H

  2. #define __LED_H

  3. #include "sys.h"

  4.  

  5. #define LED0 PAout(0)// PA0

  6.  

  7. void LED_Init(void);//初始化

  8.  

  9. #endif


主函数:

 

  1. #include "led.h"

  2. #include "delay.h"

  3. #include "sys.h"

  4. #include "usart.h"

  5. int main(void)

  6. {

  7. u8 t;

  8. u8 len;

  9. u16 times=0;

  10. delay_init(); //延时函数初始化

  11. NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级

  12. uart_init(9600); //串口初始化为9600

  13. LED_Init(); //LED端口初始化

  14. while(1)

  15. {

  16. if(USART_RX_STA&0x8000)

  17. {

  18. len=USART_RX_STA&0x3f;//得到此次接收到的数据长度

  19. printf("rn您发送的消息为:rnrn");

  20. for(t=0;t

  21. {

  22. USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据

  23. while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

  24. }

  25. printf("rnrn");//插入换行

  26. USART_RX_STA=0;

  27. }else

  28. {

  29. times++;

  30. if(times%5000==0)

  31. {

  32. printf("rn口袋里的超超 串口实验rn");

  33. printf("真JB帅rnrn");

  34. }

  35. if(times%200==0)printf("请输入数据,以回车键结束n");

  36. if(times%30==0)LED0=!LED0;//闪烁LED,提示系统正在运行.

  37. delay_ms(10);

  38. }

  39. }

  40. }

  41.  

4 下载验证

推荐阅读

史海拾趣

富满电子(FM)公司的发展小趣事

在电子行业中,富满电子(FM)公司的发展历程充满了创新与挑战,以下是五个与其发展紧密相关的事实性故事:

1. 市场需求驱动下的产能扩张

2016年至2017年间,随着智能手机等智能终端设备的出货量达到历史峰值,市场对芯片的需求急剧增加。富满电子抓住这一市场机遇,积极扩产以满足需求。这一时期的产能扩张不仅提升了公司的市场份额,也为其后续的技术研发和产品线拓展奠定了坚实基础。然而,随着市场需求的回落和行业内竞争加剧,富满电子也面临着产能过剩和价格下滑的挑战,这迫使公司更加注重技术创新和市场细分,以提升竞争力。

2. LED芯片设计领域的突破

富满电子早期主要从事电源管理芯片的设计与生产,但受限于完全竞争的市场环境和欧美企业的技术垄断,公司在该领域的发展空间有限。为了寻找新的增长点,富满电子将目光投向了LED芯片设计领域。通过不断的技术研发和产品创新,富满电子成功推出了多款应用于显示屏和通用照明等中低端市场的LED芯片产品。尽管面临激烈的市场竞争,但富满电子凭借其高性价比的产品逐渐在市场中占据了一席之地。

3. 电源管理芯片的多元化布局

在电源管理芯片领域,富满电子不仅继续深耕传统市场,还前瞻性地布局了快充等新兴市场。公司推出的USBPD系列芯片在快充市场展现了良好的先发优势,并逐渐获得市场的认可。此外,富满电子还通过“协议芯片+MOS+ACDC”模块化解决方案的推出,进一步提升了其在电源管理芯片市场的竞争力。这一多元化布局不仅为公司带来了新的增长点,也增强了其在行业内的整体实力。

4. 射频业务的拓展与前瞻布局

为了应对5G时代的到来,富满电子在2020年设立了射频公司,并开始布局5G射频开关、射频滤波器等产品的研发与生产。这一举措不仅展现了公司在技术前瞻性和市场敏感度方面的优势,也为其在未来无线通信领域的竞争中赢得了先机。通过不断的技术积累和市场拓展,富满电子有望在5G射频领域实现新的突破和发展。

5. 应对市场质疑与财务稳健发展

近年来,富满电子也面临过一些市场质疑和负面消息的影响,如被举报做假账等。然而,公司始终坚持以事实为依据,通过法律手段积极回应并澄清相关指控。同时,富满电子在财务管理上也保持了稳健的态度,严格按照相关法律法规进行会计核算和财务信息披露。这些措施不仅维护了公司的声誉和形象,也为其在复杂多变的市场环境中保持稳健发展提供了有力保障。

中环(Central)公司的发展小趣事

近年来,中环公司经历了混合所有制改革。2020年7月,TCL科技集团成为公司控股股东。这一改革不仅为公司带来了新的发展机遇和资源支持,也为其未来的发展注入了新的活力。在TCL科技的助力下,中环公司进一步聚焦主业,加速技术创新和产业升级,致力于成为光伏领域的领军企业。

以上五个故事涵盖了中环公司在电子行业里发展起来的不同阶段和方面。通过不断创新和拓展业务,中环公司在保持主业优势的同时,也实现了多元化发展,为其未来的发展奠定了坚实的基础。

台湾丰宾(CapXon)公司的发展小趣事

CapXon公司一直高度重视品质管理,建立了完善的质量管理体系和检测机制。公司严格把控原材料采购、生产过程、成品检验等各个环节,确保产品的品质符合国际标准和客户要求。同时,CapXon还不断优化生产流程,提高生产效率,降低生产成本,为客户提供更具竞争力的价格和服务。

B.B. Battery公司的发展小趣事

B.B. Battery公司成立之初,面临着资金短缺、市场竞争激烈等诸多挑战。然而,公司的创始人凭借对电池行业的深刻理解和敏锐的市场洞察力,带领团队不断探索和积累。他们深入调研市场需求,研发出适应市场需求的电池产品,并通过优化生产流程、降低成本等方式,逐步在市场上获得了一席之地。

兆易创新(GigaDevice)公司的发展小趣事

随着科技的不断发展,电池行业也在经历着深刻的变革。B.B. Battery公司紧跟时代步伐,不断加大技术创新力度。他们引进先进的生产设备和技术,研发出更高效、更环保的电池产品。同时,公司还注重与高校、科研机构的合作,共同推动电池技术的创新与发展。这些努力使得B.B. Battery公司的产品在市场上具有更强的竞争力。

Glow-Lite Corp公司的发展小趣事

面对日益严峻的环境问题,B.B. Battery公司积极响应国家绿色发展的号召,致力于推动绿色生产。他们引进环保型生产设备和技术,减少生产过程中的污染物排放。同时,公司还研发出多款环保型电池产品,为客户提供更加绿色、高效的能源解决方案。这些举措不仅提升了公司的社会责任感,也为公司的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

谁有 MEMORY STICK规范?

我正在研究memory stick和magicgate, 谁有规范, 有酬谢! 请联系cenuserwen@gmail.com…

查看全部问答>

$$$咨询:WINCE下手写软件的价格

    我公司一产品上使用了windows ce 4.2 net 版本, 处理器为ARM4VR,分辨率为240*320,现在想寻一款手写软件, 现咨询一下购买这种软件要多少钱?     胡先生   13320807449   QQ:562850914  &n ...…

查看全部问答>

新手上路,求助

本人是个新手,想自学单片机,但是不知道该怎么入手,有高手介绍下经验么?上网搜了,可是还是没有系统的认识,另外,现在学什么类型的,更容易上手,有知道的帮忙回答下,万分感谢~…

查看全部问答>

WINCE编译不了,说找不到recorder.exe

Warning: Found duplicate entry \'binfs.dll      NK               C:\\WINCE420\\PUBLIC\\11\\RelDir\\SAMSUN~1\\binfs.dll 00000007\' ... skipping Error: Could not ...…

查看全部问答>

Wince 是否支持大页nand flash?文件格式是dosfs吗?

Wince是否支持大页nand flash?文件格式是dosfs吗? Wince支持的Nand的大页模式和小页模式是同一个文件系统吗?…

查看全部问答>

Zstack学习经验点滴:如何使用OSAL的事件?

如何使用OSAL的事件?OSAL通过一个16位宽度的数组来管理事件,意味着OSAL最多可以支持16个事件,其中最高位(0x08000,SYS_EVENT_MSG)系统保留,用户可以使用的事件有15个。事件的使用很简单:1)需要找个地方定义事件的ID,实际上是指定该事件占 ...…

查看全部问答>

CAN一次最多发多少字节数据?

TxMessage.DLC最多是8字节,我一次要发24个。分三次发,发送程序如下TestStatus CAN_Polling(void){  u32 i = 0;  u8  m=0;  //每次发送的字节数  u8  n=0; ...…

查看全部问答>

交流群创建喽

本人非常之喜欢这个论坛,所以私自创建了一个群, 群号:168221728 大家可以加这个号,方便交流 …

查看全部问答>

uc/os求助

如何建立两个任务,一个检测两次按键的时间间隔,并将此值存放在全局变量KTime中,另一个任务按此时间间隔定时向电脑屏幕发出字符“M\"及该时间间隔信息??????????????…

查看全部问答>