STM32 串口中断总结

来源:互联网 发布:淘宝折扣团购网站 编辑:程序博客网 时间:2024/05/16 09:24

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

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

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

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

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

2、初始化

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

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

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1 ,ENABLE);

其次中断配置。主要有优先级组设定、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);

}

然后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);

}

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

(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);

5main函数

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()中添加一些发送指令之类的东西。

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




阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 空中网账号忘了怎么办 我注册过借贷宝怎么办 拍拍贷已注册过怎么办 拍拍贷评估额度0怎么办 用钱宝逾期未还怎么办 支付宝被冻结怎么办啊 借钱没借条不还怎么办 借贷宝换号码了怎么办 借贷宝还不起了怎么办 花钱如流水的人怎么办 手机贷登录不上怎么办 如果被网上追逃怎么办 5s指纹排线断了怎么办 苹果6s指纹坏了怎么办 苹果的指纹坏了怎么办 苹果7指纹坏了怎么办 苹果6指纹坏了怎么办 指纹浅打不了卡怎么办 我要贷款5万怎么办 拍拍贷一千不还怎么办 牙龈肿里面有脓怎么办 爱奇艺会员账号忘了怎么办 被私立医院坑了怎么办 在医院被坑了怎么办 流产后子宫内膜薄怎么办 人流后内膜过厚怎么办 子宫内膜薄月经量少怎么办 子宫内膜很薄该怎么办 月经量少子宫内膜薄怎么办 子宫内薄没月经怎么办 感冒20多天不好怎么办 皮肤干燥又痒怎么办了 眼周皮肤很干怎么办 产后掉头发很厉害怎么办 班上学生很吵怎么办 进了网贷黑名单怎么办 预约了挂号没去怎么办 吃完米索手心痒怎么办 三岁宝宝湿疹了怎么办 割完剥皮后水肿怎么办 微医预约挂号后怎么办