历史上的今天
返回首页

历史上的今天

今天是:2025年06月09日(星期一)

正在发生

2018年06月09日 | STM32 串口中断总结

2018-06-09 来源:eefocus

本文以USART1为例,叙述串口中断的编程过程。

1、先来讲述一下在应用串口中断时涉及到的一些库文件。

首先对于STM32外设库文件的应用编程,misc.c和stm32f10x_rcc.c是肯定要添加到。

接下来就是我们要用到的相关外设了。毫无疑问,串口文件stm32f10x_usart.c是必须的。串口通信是对通用GPIO端口引脚的功能复用,所以还需要stm32f10x_gpio.c文件。另外,因为有中断的产生,所以中断文件stm32f10x_it.c也是必要的,当然这个文件一般和main.c放在一个文件夹下(一般习惯为User文件夹),因为我们的中断响应函数是要在里面自己编写的。

当然还有其他的基本必须文件如系统配置文件等在这地方就不说了,这个是创建一个工程应该知道的。

2、初始化

对于串口通信的初始化,不仅仅只是对串口的初始化(这个地方是比较烦人的,不像别的芯片那样简洁明了)。

l 首先时钟使能配置。STM32内部的时钟有很多,感兴趣的自己看看参考手册。此处以USART1为例说明。有USART1时钟、GPIOA时钟、GPIO复用(AFIO)时钟。由于此处USART1和GPIOA、AFIO均在APB2上,所以可以一次配置完成。如下:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1 ,ENABLE);

l 其次中断配置。主要有优先级组设定、USART1中断使能、该中断的优先级,中断初始化。程序如下:

void NVIC_Configuration(void)

{

  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//选择分组方式0

  

  /* 使能 USART1 中断 */

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;

  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);

}

l 然后GPIO复用功能配置。一般情况下我们使用原始的外设和GPIO端口引脚的映射关系,如果要改变其映射的话,请另外查看参考手册上关于GPIO重映射部分。对于GPIO的复用,其引脚的输入与输出模式都有要求,在参考手册上有详细说明。

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  /* 配置 USART1 Rx 作为浮空输入 */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);

  /* 配置 USART1 Tx 作为推挽输出 */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);

}

l 串口初始化配置。主要有串口基本参数配置(如波特率、数据位、工作方式等),串口中断使能,串口使能。

(1) 基本参数配置

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = 9600;//波特率

USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据长度

USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位

USART_InitStructure.USART_Parity = USART_Parity_No;//校验

USART_InitStructure.USART_HardwareFlowControl

=USART_HardwareFlowControl_None; //硬件流控制无

USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //发送与接受两种方式

USART_Init(USART1, &USART_InitStructure);//用配置的参数惊喜串口初始化

(2) 串口中断使能

USART_ITConfig(USARTy, USART_IT_RXNE, ENABLE);//使能接受中断,在接受移位 寄存器中有数据是产生

USART_ITConfig(USARTy, USART_IT_TXE, ENABLE);//使能发送中断,在发送完数据 后产生。

一般情况下,如果与PC通信的话,我们只用接受中断即可。

(3) 串口使能

USART_Cmd(USART1, ENABLE); //USART1使能

好了,经过以上不走之后呢,我们就可以进行数据的收发了。

3、发送数据

使用函数USART_SendData(USART1, char data),一次只能发送一个字符。当然我们可以用如下函数发送字符串。

void USART1_Puts(char * str) 

while(*str) 

USART_SendData(USART1, *str++);  //发送一个字符

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //等待发送完毕

}

当然我们也可以循环发送字符串数组

for(i = 0; TxBuf1 != '\0'; i++) // TxBuf1为定义好的字符串数组

{

USART_SendData(USART2 , TxBuf1);

while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);

}


4、接收数据

由于我们使用的是接受中断,所以当有数据需要接收时,会执相应的中断函数。此处我们USART1的中断函数在stm32f10x_it.c文件中。找到函数void USART1_IRQHandler(void),如果没有的话就自己加上吧,别忘了头文件中需要声明一下。当然你也可以在其他文件中写下该中断函数。当产生中断进入该函数之后,我们就可以进行自己的操作了。

void USARTy_IRQHandler(void)

{

  if(USART_GetITStatus(USARTy, USART_IT_RXNE) != RESET)//如果寄存器中有数据

  {

    /* Read one byte from the receive data register */

    RxBuffer1[RxCounter1++] = USART_ReceiveData(USART1);

  }

 

  /*************************************************************

  if(USART_GetITStatus(USARTy, USART_IT_TXE) != RESET)

  {   

        USART_SendData(USARTy, TxBuffer1[TxCounter1++]);

  }    

//这个地方那个之所以把这个写出来主要是想说发送中断和接受中断其实是共用一个

//中断函数的,到底是那个中断发生了呢,这就需要我们读取中断状态标志来识别了。

*****************************************************************/

}

别忘了在接受完数据进行别的操作之前为了防止数据被覆盖最好先禁止一下接受中断 /* 禁止 USART1 接收中断 */

 USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

/* 禁止 USART1 发送中断 */

USART_ITConfig(USART1, USART_IT_TXE, DISABLE);

5、main函数

int main(void) //这个地方和特别,我们知道一般main函数是没有返回值的,但在STM32 //的编程中其返回类型为int。

{

  RCC_Configuration();

  NVIC_Configuration();

  GPIO_Configuration();

  USART_InitStructure.USART_BaudRate = 9600;

  USART_InitStructure.USART_WordLength = USART_WordLength_8b;

  USART_InitStructure.USART_StopBits = USART_StopBits_1;

  USART_InitStructure.USART_Parity = USART_Parity_No;

  USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None;

  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART1, &USART_InitStructure);

  

  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  //USART_ITConfig(USART1, USART_IT_TXE, ENABLE);

  USART_Cmd(USART1, ENABLE);

  while (1)//等待中断

  {

  }

}

当然你也可以在main()中添加一些发送指令之类的东西。

以上内容为个人总结,转载请注明出处。若有错误,本人概不负任何责任。


推荐阅读

史海拾趣

BAE Systems公司的发展小趣事

作为一个大型企业,BAE Systems公司不仅关注经济效益,也积极履行社会责任,推动可持续发展。公司注重环境保护和安全生产,严格遵守相关法律法规和行业标准。同时,公司也积极参与社会公益事业,为社区发展和员工福利做出了贡献。此外,公司还注重员工的培训和发展,为员工提供了广阔的职业发展空间和良好的工作环境。这些举措不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实的基础。

这五个故事只是BAE Systems公司在电子行业发展历程中的一部分,它们展示了公司的成长、创新、合作、应对挑战以及履行社会责任等方面的努力和成果。这些故事也充分说明了BAE Systems公司在电子行业中的重要地位和影响力。

Connection One公司的发展小趣事

在电子行业的初期,Connection One公司凭借其创始人对半导体技术的深刻理解,成功研发出一款具有划时代意义的芯片。这款芯片不仅性能卓越,而且功耗极低,立即在市场上引起了轰动。公司因此迅速积累了第一笔资金,为后续的研发和扩展打下了坚实基础。

GE Oil & Gas Digital Solutions公司的发展小趣事
在电子设备维修过程中,快速判断电阻的损坏情况或阻值变化。
DURACELL公司的发展小趣事

DURACELL公司自成立以来,一直致力于提供高品质的电池产品。公司不断投入研发资源,推动电池技术的创新。金霸王碱性电池以其“卓越品质,持久电力”的出众品质行销全球近百个国家和地区。此外,DURACELL公司还积极拓展产品线,生产和销售锂电池等高性能电池产品,以满足不同领域的需求。

EZchip Technologies Ltd公司的发展小趣事

在电子行业中,人才和研发实力是企业成功的关键。EZchip深知这一点,因此一直重视人才团队的建设和研发实力的提升。公司拥有一支由业内顶尖专家和学者组成的研发团队,他们具备丰富的行业经验和深厚的技术功底。同时,EZchip还注重人才培养和引进,通过提供良好的工作环境和福利待遇吸引了一批批优秀人才加入。正是这些优秀的人才和强大的研发实力,为EZchip的持续发展提供了有力保障。

Gamewell-FCI ( Honeywell )公司的发展小趣事

在电子行业中,人才和研发实力是企业成功的关键。EZchip深知这一点,因此一直重视人才团队的建设和研发实力的提升。公司拥有一支由业内顶尖专家和学者组成的研发团队,他们具备丰富的行业经验和深厚的技术功底。同时,EZchip还注重人才培养和引进,通过提供良好的工作环境和福利待遇吸引了一批批优秀人才加入。正是这些优秀的人才和强大的研发实力,为EZchip的持续发展提供了有力保障。

问答坊 | AI 解惑

M8与iPhone最大的区别 - 产品的灵魂

一个新企业、小企业,尤其是在中国,靠模仿起步几乎是无法避免的,魅族的第一款MP3,MX。毫无疑问可说是抄袭的韩国COWON一款产品CW300的,所以后来逐渐发展起来的魅族自己也很回避这一点,在介绍产品历史时几乎不会提及MX。 在魅族其后推出的产品 ...…

查看全部问答>

串口通信问题

at89S52  12M晶振 波特率为9600 发送为 1,2,3,4,5,6,7,8,9 串口助手显示为 81,82,83,84,85,86,87,88,89 请问各位赐教!…

查看全部问答>

U盤無法使用問題

前幾天買了一個netce 2G的優盤,在別的電腦上能用, 但在我的電腦上就不能用了,如下:      1、插入U盤,系統能正確安裝並提示已安裝可以使用了, 但隻能看到盤符,打開後是空白的,選擇右鍵的格式化後沒有任何反應。   ...…

查看全部问答>

来谈谈你对LED芯片厂商的看法吧

目前LED芯片厂商还是很多的,百度了一下:大陆LED芯片厂商:三安光电、上海蓝光、士兰明芯、大连路美、迪源光电、华灿光电、南昌欣磊、上海金桥大晨、河北立德、河北汇能、深圳奥伦德深圳世纪晶源、广州普光、扬州华夏集成、甘肃新天电公司东莞福地 ...…

查看全部问答>

有人研究过TI的BLDC3_1_280x_V322吗?

坛里有人研究过TI的BLDC3_1_280x_V322吗?…

查看全部问答>

南华大学黄智伟 备战2013电子设计竞赛 “ADC的选择时需要考虑的一些因素”

本帖最后由 paulhyde 于 2014-9-15 03:24 编辑 南华大学黄智伟 备战2013电子设计竞赛 “ADC的选择时需要考虑的一些因素” 在电子设计竞赛作品中,ADC几乎是一个不可缺少的部分之一。下面介绍ADC的选择时需要考虑的一些因素。 1. ADC的分类 ...…

查看全部问答>

网上哪里买元器件齐全

有很多元器件,哪里买比较齐全?…

查看全部问答>

易电源学习心得

全新 SIMPLE SWITCHER 易電源納米模塊在一個微小解決方案尺寸中 整合了易用性和高性能。納米模塊是目前市場上最小的 1A 封裝。該器件是 首款將 IC 安裝在電感上的集成電感解決方案,可以降低電路板空間要求 並提高性能,使之成為空間受限及負載 ...…

查看全部问答>

[题目]A题:四旋翼飞行器

本帖最后由 paulhyde 于 2014-9-15 02:57 编辑 2014年TI杯大学生电子设计竞赛题 A题:四旋翼飞行器 1. 任务 设计制作一架能够自主飞行的四旋翼飞行器。 2. 要求 四旋翼飞行器能够完成以下飞行动作: (1) 飞行器能够根据起飞前预置的指 ...…

查看全部问答>

DM642资源求助

论坛里有没有做DM642的,本人大学生一枚,因为要做创新性项目,想学学DM642的图像处理,之前没有任何dsp的基础,想找几个例程自己先看看,求好心人分享。邮箱1300588751@qq.com在此先行谢过。 …

查看全部问答>