完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
串口设置的一般步骤可以总结为如下几个步骤:
1) 串口时钟使能,GPIO时钟使能。 2) 设置引脚复用器映射:调用GPIO_PinAFConfig函数。 3) GPIO初始化设置:要设置模式为复用功能。 4) 串口参数初始化:设置波特率,字长,奇偶校验等参数。 5) 开启中断并且初始化NVIC,使能中断(如果需要开启中断才需要这个步骤)。 6) 使能串口。 7) 编写中断处理函数:函数名格式为USARTxIRQHandler(x对应串口号)。 我们通过USART3简单介绍下这几个与串口基本配置直接相关的几个固件库函数。这些函数和定义主要分布在stm32f4xx_usart.h和stm32f4xx_usart.c文件中。 1) 串口时钟和GPIO时钟使能。 串口是挂载在APB1下面的外设,所以使能函数为: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟 GPIO时钟使能,就非常简单,串口3对应着芯片引脚PB10,PB11。所以这里我们只需要使能GPIOB时钟即可: RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOB时钟 2) 设置引脚复用器映射 引脚复用器映射配置,调用函数为: GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); //PB10复用为USART3 GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);//PA11复用为USART3 因为串口使用到PB10,PB11,所以我们要把PB10和PB11都映射到串口3。所以这里我们要调用两次函数。 对于GPIO_PinAFConfig函数的第一个和第二个参数很好理解,就是设置对应的IO口,如果是PB10那么第一个参数是GPIOB,第二个参数就是GPIO_PinSource10。第二个参数,实际我们不需要去记忆,只需去相应的配置文件找到外设对应的AF配置宏定义标识符即可,串口3为GPIO_AF_USART3。 3) GPIO端口模式设置:PA9和PA10要设置为复用功能。 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //GPIOB10与GPIOB11 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10 4) 串口参数初始化:设置波特率,字长,奇偶校验等参数 串口初始化是调用函数USART_Init来实现的,具体设置方法如下: USART_InitStructure.USART_BaudRate = bound;//一般设置为9600; 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(USART3, &USART_InitStructure); //初始化串口 5) 使能串口 使能串口调用函数USART_Cmd来实现,具体使能串口3方法如下: USART_Cmd(USART3, ENABLE); //使能串口 6) 串口数据发送与接收。 STM32F4的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包 含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。 STM32库函数操作USART_DR寄存器发送数据的函数是: void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); 通过该函数向串口寄存器USART_DR写入一个数据。 STM32库函数操作USART_DR寄存器读取串口接收到的数据的函数是: uint16_t USART_ReceiveData(USART_TypeDef* USARTx); 通过该函数可以读取串口接受到的数据。 7) 开启中断并且初始化NVIC,使能相应中断 这一步如果我们要开启串口中断才需要配置NVIC中断优先级分组。通过调用函数 NVIC_Init来设置。 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //响应优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 同时,我们还需要使能相应中断,使能串口中断的函数是: void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) 这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是: USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断 我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是: USART_ITConfig(USART3,USART_IT_TC,ENABLE); 这里还要特别提醒,因为我们实验开启了串口中断,所以我们在系统初始化的时候需要先设置 系统的中断优先级分组,我们是在我们main函数开头设置的,代码如下: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 我们设置分组为2,也就是2位抢占优先级,2位响应优先级。 8) 获取相应中断状态 当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是: ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) 比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这 个函数来判断到底是否是串口发送完成中断,方法是: USART_GetITStatus(USART3, USART_IT_TC) 返回值是SET,说明是串口发送完成中断发生。 9) 中断服务函数 串口1中断服务函数为: void USART3_IRQHandler(void) ; 当发生中断的时候,程序就会执行中断服务函数。然后我们在中断服务函数中编写我们相应的逻辑代码即可 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9000 浏览 16 评论
4051 浏览 18 评论
1110浏览 3评论
572浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2302浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 17:15 , Processed in 1.215159 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号