营销型网站建设风格设定包括哪些方面?,公司视频广告拍摄,网站建设合同通用范本,wordpress的数据库主机名嵌入式开发学习之STM32F407串口#xff08;USART#xff09;收发数据#xff08;三#xff09; 开发涉及工具一、选定所使用的串口二、配置串口1.配置串口的I/O2.配置串口参数属性3.配置串口中断4.串口中断在哪里处理5.串口如何发送字符串 三、封装串口配置库文件1.创建头文… 嵌入式开发学习之STM32F407串口USART收发数据三 开发涉及工具一、选定所使用的串口二、配置串口1.配置串口的I/O2.配置串口参数属性3.配置串口中断4.串口中断在哪里处理5.串口如何发送字符串 三、封装串口配置库文件1.创建头文件.h文件2.创建源文件.c文件 四、功能实现 此次实现目的 1.芯片上电启动时发送“Hello Word” 2.发送给芯片的数据芯片又通过串口发送回来 有工程实例链接在最底部。
开发涉及工具
开发环境IDEIAR-ARM8.32.4 开发板STM32_F4VE_V2.0 下载器J-Link 串口调试软件XCOM_V2.6 固件库版本STM32F4xx_DSP_StdPeriph_Lib_V1.8.0 一、选定所使用的串口
1.我使用的开发板是STM32F407VE芯片芯片提供有6个串口。在开发板上可以看到其单独引出了串口针脚那么我们就需要通过原理图来确认这个针脚是连接的哪一个串口如下图所示从原理图中我们不难看出收发引脚是接在芯片的PA9和PA10上面的。 2.我们翻看芯片数据手册的引脚定义表可以发现PA9对应芯片USART1_TXPA10对应USART1_RX。现在我们就可以开始配置串口1来达到数据收发的效果。 3.注意若我们是自己设计电路则步骤相反。先确认要使用的串口编号然后确认串口对应的引脚最后才将其引出针脚
二、配置串口
我们依旧可以在固件库里面去找到关于配置USART的例程在前面配置GPIO的时候我有提到过这里不再赘述直接上配置代码
1.配置串口的I/O
这里值得注意的就是要将端口设置成复用模式其他配置相同
void USART1_IO_Conf(void)
{GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//IO口用作串口引脚要配置复用模式GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_StructInit(GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin GPIO_Pin_9;//TX引脚GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF;//IO口用作串口引脚要配置复用模式GPIO_InitStructure.GPIO_Speed GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_UP;GPIO_Init(GPIOA,GPIO_InitStructure);GPIO_StructInit(GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin GPIO_Pin_10;//RX引脚GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_UP;GPIO_Init(GPIOA,GPIO_InitStructure);
}2.配置串口参数属性
这里值得注意的还有里面调用了一个配置串口中断的函数USART1_NVICConf()解释一下什么是中断中断就是有一个事件发生了我需要打断CPU现在的工作转而来处理现在发生的事件用在这里结合此句USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);的意思是配置的数据接收中断比如说别的设备给我发送了字符那么CPU你现在啥都别忙干先来看看这个字符是什么。
void USART1_Conf(uint32_t baud)//配置函数定义一个形参用于配置波特率
{USART_InitTypeDef USART_InitStructure;//定义配置串口的结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//开启串口1的时钟USART_DeInit(USART1);//大概意思是解除此串口的其他配置USART_StructInit(USART_InitStructure);USART_InitStructure.USART_BaudRate baud;//设置波特率USART_InitStructure.USART_WordLength USART_WordLength_8b;//字节长度为8bitUSART_InitStructure.USART_StopBits USART_StopBits_1;//1个停止位USART_InitStructure.USART_Parity USART_Parity_No ;//没有校验位USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx;//将串口配置为收发模式USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; //不提供流控 USART_Init(USART1,USART_InitStructure);//将相关参数初始化给串口1USART1_NVICConf();//配置串口的中断USART_ClearFlag(USART1,USART_FLAG_RXNE);//初始配置时清除接受置位USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//初始配置接收中断USART_Cmd(USART1,ENABLE);//开启串口1
}3.配置串口中断
那要如何配置串口的中断呢其方法如下
void USART1_NVICConf(void)
{NVIC_InitTypeDef NVIC_InitStructure;//中断控制结构体变量定义NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn;//中断通道指定为USART1NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0;//主优先级为0NVIC_InitStructure.NVIC_IRQChannelSubPriority 1;//次优先级为1NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//确定使能NVIC_Init(NVIC_InitStructure);//初始化配置此中断通道
}4.串口中断在哪里处理
那么问题来了我产生了事件我CPU要在哪里来查看呢这就需要中断服务函数来实现中断服务函数不能随意命名但对其原来的名字进行重定义也可以中断服务函数的名称我们在中断向量表中查找我使用的此版固件在stm32f40_41xx.s大概120行的中断向量表里面找然后如下编写
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) SET)//判断是不是真的有中断发生{USART_SendData(USART1,USART_ReceiveData(USART1));//又将数据发回去USART_ClearITPendingBit(USART1, USART_IT_RXNE); //已经处理就清楚标志位 }
}5.串口如何发送字符串
我们写一个通过串口发送字符串的函数可如下编写
void Usart_SendString(USART_TypeDef* USARTx,uint8_t *data,uint32_t dataLen)
{uint32_t i;for(i 0;i dataLen;i ){USART_SendData(USARTx,data[i]);//发送数据while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) RESET);//等待发送完成}
}三、封装串口配置库文件
由于我们配置串口和使用串口的功能函数比较多放在一个源文件里面比较杂乱那么我们可以直接将关于使用串口的文件封装成库文件通过导入头文件就可使用方法如下
1.创建头文件.h文件
在IAR新建一个空白文件保存为usart.h如何新建文件和保存文件我在《嵌入式开发学习之STM32F407芯片IAR环境搭建空白工程一》有提到不做赘述然后语法格式如下
#ifndef _USART_H//.h文件三要素之一
#define _USART_H//.h文件三要素之一#include stm32f4xx.h//依据自身工程情况导入头文件//外部可调用函数的声明
void USART1_IO_Conf(void);
void USART1_Conf(uint32_t baud);
void Usart_SendString(USART_TypeDef* USARTx,uint8_t *data,uint32_t dataLen);#endif//.h文件三要素之一2.创建源文件.c文件
在IAR新建一个空白文件保存为usart.h然后语法格式如下
#include usart.hvoid USART1_IO_Conf(void)
{GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);//IO口用作串口引脚要配置复用模式GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);GPIO_StructInit(GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin GPIO_Pin_9;//TX引脚GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF;//IO口用作串口引脚要配置复用模式GPIO_InitStructure.GPIO_Speed GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_UP;GPIO_Init(GPIOA,GPIO_InitStructure);GPIO_StructInit(GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin GPIO_Pin_10;//RX引脚GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_UP;GPIO_Init(GPIOA,GPIO_InitStructure);
}void USART1_NVICConf(void)
{NVIC_InitTypeDef NVIC_InitStructure;//中断控制结构体变量定义NVIC_InitStructure.NVIC_IRQChannel USART1_IRQn;//中断通道指定为USART1NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0;//主优先级为0NVIC_InitStructure.NVIC_IRQChannelSubPriority 1;//次优先级为1NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE;//确定使能NVIC_Init(NVIC_InitStructure);//初始化配置此中断通道
}void USART1_Conf(uint32_t baud)//配置函数定义一个形参用于配置波特率
{USART_InitTypeDef USART_InitStructure;//定义配置串口的结构体变量RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//开启串口1的时钟USART_DeInit(USART1);//大概意思是解除此串口的其他配置USART_StructInit(USART_InitStructure);USART_InitStructure.USART_BaudRate baud;//设置波特率USART_InitStructure.USART_WordLength USART_WordLength_8b;//字节长度为8bitUSART_InitStructure.USART_StopBits USART_StopBits_1;//1个停止位USART_InitStructure.USART_Parity USART_Parity_No ;//没有校验位USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx;//将串口配置为收发模式USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; //不提供流控 USART_Init(USART1,USART_InitStructure);//将相关参数初始化给串口1USART1_NVICConf();//配置串口的中断USART_ClearFlag(USART1,USART_FLAG_RXNE);//初始配置时清除接受置位USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//初始配置接受中断USART_Cmd(USART1,ENABLE);//开启串口1
}/******** 串口1 中断服务函数 ***********/
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_RXNE) SET)//判断是不是真的有中断发生{USART_SendData(USART1,USART_ReceiveData(USART1));//又将数据发回去USART_ClearITPendingBit(USART1, USART_IT_RXNE); //已经处理就清楚标志位 }
}void Usart_SendString(USART_TypeDef* USARTx,uint8_t *data,uint32_t dataLen)
{uint32_t i;for(i 0;i dataLen;i ){USART_SendData(USARTx,data[i]);//发送数据while(USART_GetFlagStatus(USARTx,USART_FLAG_TXE) RESET);//等待发送完成}
}四、功能实现
功能实现时我们在主函数中调用配置函数即可编写如下
#include stm32f4xx.h
#include delay.h
#include usart.hvoid main()
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//使用了中断则这一句必须要有USART1_IO_Conf();//配置串口的IOUSART1_Conf(115200);//串口配置成波特率115200Usart_SendString(USART1,Hello Word!\r\n,13);//发送字符串while(1){}
}
实验结果 工程实例链接https://download.csdn.net/download/qq_45100839/88425993