趁着今天不是很忙,继续鼓捣下STM32F030 Nucleo64这块板子,这次我们来玩玩串口通信。咱们当码农电工的,往往在做项目调试代码的时候,想查看一些信息,但是呢,项目不需要LCD等显示模块,除了用软件仿真来查看外,串口也是一个经济实惠快捷的选择。
串口作为单片机和外部一个比较重要的通信接口,同时也是咱们码农调试代码的好工具,其重要性不言而喻了。STM32F030R8这颗芯片自带2路串口,咱们这次玩USART2,因为nucelo64这块板子板载虚拟串口,就是USART2。
串口的配置可以总结为以下几点:
(1)串口和GPIO的时钟使能
(2)串口复位
(3)GPIO模式设置
(4)串口参数初始化
(5)打开中断(也可以用查询方式,这里不讲)
(6)使能串口
(7)既然开了中断,那么就要写串口中断服务函数
下面,我们开始简单介绍下完成上面步骤的几个库函数,可以打开stm32f0xx_usart.c和stm32f0xx_usart.h这两个文件查看。
(1)使能对应外设时钟
相信这一点经过上一贴的描述,大家应该都可以完成,那么下面就直接贴代码了
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //使能USART2时钟
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
复制代码
(2)串口复位
在外设初始化的时候,可以考虑让外设重新复位,每一个相关的寄存器恢复到默认值,其实我个人做项目的时候也没用到复位,也没发现啥问题,各位也可以尝试下
- USART_DeInit(USART2); //复位串口2
复制代码
(3)GPIO模式配置
由于USART2是占用了PA2和PA3这两个IO,需要启动GPIO复用功能,采用GPIO_PinAFConfig这个函数来设置,可以参考STM32F030R8数据手册,如下图所示:
具体代码如下:
- /*
- USART2 GPIO Configuration
- PA2 ------> USART2_TX
- PA3 ------> USART2_RX
- */
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);
- GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //PA.2 PA.3
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
复制代码
(4)串口参数初始化
我们可以打开库函数stm32f0xx_usart.c和stm32f0xx_usart.h这两个文件,串口的初始化是由void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct)这个函数来实现的。
这个函数的第一个入口参数是指定初始化的串口标号,这里选择 USART2。
第二个入口参数是一个 USART_InitTypeDef 类型的结构体指针,这个结构体指针的成员变量用来设置串口的一些参数。我们可以打开库函数看看:
实现方式如下:
- //USART 初始化设置
- USART_InitStructure.USART_BaudRate = bound; //设置波特率
- USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
- 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(USART2, &USART_InitStructure);
复制代码 从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,硬件数据流控制,模式(收,发) 。
(5)打开中断
使能串口中断的函数是:
- USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//使能串口2接收中断
复制代码 千万不要忘记了还要配置中断通道、优先级等参数:- NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPriority = 3;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
复制代码
(6)使能串口
这个最简单  ,一个库函数搞掂~~~
- USART_Cmd(USART2, ENABLE); //使能串口2
复制代码
(7)编写中断服务函数
既然你打开了中断,那么中断响应之后,肯定得干些事情,这时候,就轮到中断服务函数出场了~~~
中断服务函数的名字不能随便定义,我们可以打开系统启动文件startup_stm32f030.s文件,在里面可以查看到这颗芯片所有外设的中断服务函数的名字
本次例程要实现的功能是串口的接收和发送,中断服务函数代码如下:
- void USART2_IRQHandler(void)
- {
- u8 ch;
-
- if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
- {
- ch = USART_ReceiveData(USART2);
- printf("%c", ch); //将接受到的数据直接返回打印
- }
-
- }
复制代码 从上面的函数可以看到,这里用到了printf函数,具体的配置方法可以看看我之前发过的帖子,这里就不重复介绍了
贴上工程代码:
STM32F030_USART2.rar
(1.75 MB, 下载次数: 121)
|