新疆时时彩三开奖结果走势图

STM32串口知识分享

串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的MCU都会带有串口,STM32自然也不例外。 STM32F4的串口资源相当丰富的,功能也相当强劲。ALIENTEK探索者STM32F4开发板所使用的STM32F407ZGT6最多可提供6路串口,有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持LIN、支持调制解调器操作、智能卡协议和IrDA SIR ENDEC规范、具有DMA等。 5.3节对串口有过简单的介绍,大家看这个实验的时候记得翻过去看看。接下来我们将主要从库函数操作层面结合寄存器的描述,告诉你如何设置串口,以达到我们最基本的通信功能。本章,我们将实现利用串口1不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。探索者STM32F4开发板板载了1个USB串口和2个RS232串口,我们本章介绍的是通过USB串口和电脑通信。 在4.4.章节端口复用功能已经讲解过,对于复用功能的IO,我们首先要使能GPIO时钟,然后使能相应的外设时钟,同时要把GPIO模式设置为复用。这些准备工作做完之后,剩下的当然是串口参数的初始化设置,包括波特率,停止位等等参数。在设置完成只能接下来就是使能串口,这很容易理解。同时,如果我们开启了串口的中断,当然要初始化NVIC设置中断优先级别,最后编写中断服务函数。 串口设置的一般步骤可以总结为如下几个步骤:<p> </p> <p> </p> 1) 串口时钟使能,GPIO时钟使能。 <p> </p> 2) 设置引脚复用器映射:调用GPIO_PinAFConfig函数。 <p> </p> 3) GPIO初始化设置:要设置模式为复用功能。 <p> </p> 4) 串口参数初始化:设置波特率,字长,奇偶校验等参数。 <p> </p> 5) 开启中断并且初始化NVIC,使能中断(如果需要开启中断才需要这个步骤)。 <p> </p> 6) 使能串口。 <p> </p> 7) 编写中断处理函数:函数名格式为USARTxIRQHandler(x对应串口号)。 <p> </p> 下面,我们就简单介绍下这几个与串口基本配置直接相关的几个固件库函数。这些函数和定义主要分布在stm32f4xx_usart.h和stm32f4xx_usart.c文件中。 <p> </p> <p> </p> 1) 串口时钟和GPIO时钟使能。 串口是挂载在APB2下面的外设,所以使能函数为: <p> </p> RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟 <p> </p> GPIO时钟使能,就非常简单,因为我们使用的是串口1,串口1对应着芯片引脚PA9,PA10,所以这里我们只需要使能GPIOA时钟即可: <p> </p> RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟 <p> </p> <p> </p> 2) 设置引脚复用器映射 <p> </p> 引脚复用器映射配置方法在我们4.4小节讲解非常清晰,调用函数为: <p> </p> GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //PA9复用为USART1 <p> </p> GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);//PA10复用为USART1 <p> </p> 因为串口使用到PA9,PA10,所以我们要把PA9和PA10都映射到串口1。所以这里我们要调用两次函数。 <p> </p> 对于GPIO_PinAFConfig函数的第一个和第二个参数很好理解,就是设置对应的IO口,如果是PA9那么第一个参数是GPIOA,第二个参数就是GPIO_PinSource9。第二个参数,实际我们不需要去记忆,只需要根据我们4.7小节讲解的快速组织代码技巧里面,去相应的配置文件找到外设对应的AF配置宏定义标识符即可,串口1为GPIO_AF_USART1。 <p> </p> <p> </p> 3) GPIO端口模式设置:PA9和PA10要设置为复用功能。 <p> </p> GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10 <p> </p> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能 <p> </p> GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz <p> </p> GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 <p> </p> GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 <p> </p> GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10 <p> </p><p> </p> 4) 串口参数初始化:设置波特率,字长,奇偶校验等参数 <p> </p> 串口初始化是调用函数USART_Init来实现的,具体设置方法如下: <p> </p> USART_InitStructure.USART_BaudRate = bound;//一般设置为9600; <p> </p> USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 <p> </p> USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 <p> </p> USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 <p> </p> USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; <p> </p> USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式 <p> </p> USART_Init(USART1, &USART_InitStructure); //初始化串口 <p> </p> <p> </p> 5) 使能串口 <p> </p> 使能串口调用函数USART_Cmd来实现,具体使能串口1方法如下: <p> </p> USART_Cmd(USART1, ENABLE); //使能串口 <p> </p> <p> </p> 6) 串口数据发送与接收。 <p> </p> STM32F4的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。 <p> </p> STM32库函数操作USART_DR寄存器发送数据的函数是: <p> </p> void USART_SendData(USART_TypeDef* USARTx, uint16_t Data); <p> </p> 通过该函数向串口寄存器USART_DR写入一个数据。 <p> </p> STM32库函数操作USART_DR寄存器读取串口接收到的数据的函数是: <p> </p> uint16_t USART_ReceiveData(USART_TypeDef* USARTx); <p> </p> 通过该函数可以读取串口接受到的数据。 <p> </p> <p> </p> 7) 串口状态 <p> </p> 串口的状态可以通过状态寄存器USART_SR读取。USART_SR的各位描述如图9.1.1所示: <p> </p> 图9.1.1 USART_SR寄存器各位描述 <p> </p> 这里我们关注一下两个位,第5、6位RXNE和TC。 <p> </p> RXNE(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取USART_DR,通过读USART_DR可以将该位清零,也可以向该位写0,直接清除。 <p> </p> TC(发送完成),当该位被置位的时候,表示USART_DR内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读USART_SR,写USART_DR。2)直接向该位写0。 <p> </p> 状态寄存器的其他位我们这里就不做过多讲解,大家需要可以查看中文参考手册。 <p> </p> 在我们固件库函数里面,读取串口状态的函数是: <p> </p> FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); <p> </p> 这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如上面讲解的RXNE(读数据寄存器非空)以及TC(发送完成)。例如我们要判断读寄存器是否非空(RXNE),操作库函数的方法是: <p> </p> USART_GetFlagStatus(USART1, USART_FLAG_RXNE); <p> </p> 我们要判断发送是否完成(TC),操作库函数的方法是: <p> </p> USART_GetFlagStatus(USART1, USART_FLAG_TC); <p> </p> 这些标识号在MDK里面是通过宏定义定义的: <p> </p> #define USART_IT_PE ((uint16_t)0x0028) <p> </p> #define USART_IT_TC ((uint16_t)0x0626) <p> </p> #define USART_IT_RXNE ((uint16_t)0x0525) <p> </p> ……//(省略部分代码) <p> </p> #define USART_IT_NE ((uint16_t)0x0260) <p> </p> #define USART_IT_FE ((uint16_t)0x0160) <p> </p> <p> </p> 8) 开启中断并且初始化NVIC,使能相应中断 <p> </p> 这一步如果我们要开启串口中断才需要配置NVIC中断优先级分组。通过调用函数NVIC_Init来设置。 <p> </p> NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; <p> </p> NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3 <p> </p> NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //响应优先级3 <p> </p> NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 <p> </p> NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、 <p> </p> 同时,我们还需要使能相应中断,使能串口中断的函数是: <p> </p> void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState) <p> </p> 这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是: <p> </p> USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断 <p> </p> 我们在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是: <p> </p> USART_ITConfig(USART1,USART_IT_TC,ENABLE); <p> </p> 这里还要特别提醒,因为我们实验开启了串口中断,所以我们在系统初始化的时候需要先设置系统的中断优先级分组,我们是在我们main函数开头设置的,代码如下: <p> </p> NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 <p> </p> 我们设置分组为2,也就是2位抢占优先级,2位响应优先级。 <p> </p> <p> </p> 9) 获取相应中断状态 <p> </p> 当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是: <p> </p> ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT) <p> </p> 比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是: <p> </p> USART_GetITStatus(USART1, USART_IT_TC) <p> </p> 返回值是SET,说明是串口发送完成中断发生。 <p> </p> <p> </p> 10) 中断服务函数 <p> </p> 串口1中断服务函数为: <p> </p> void USART1_IRQHandler(void) ; <p> </p> 当发生中断的时候,程序就会执行中断服务函数。然后我们在中断服务函数中编写我们相应的逻辑代码即可。 <p> </p> 通过以上一些寄存器的操作外加一下IO口的配置,我们就可以达到串口最基本的配置了,关于串口更详细的介绍,请参考《STM32F4XX中文参考手册》第676页至720页,通用同步异步收发器这一章节。

 
新疆时时彩三开奖结果走势图
体育投注开户 pk10五码二期必中技巧 复式投注是什么意思 河内分分彩*方法技巧教程 时时彩怎麽稳赚 逆袭计划不能用了吗 500万彩票网电脑版官网 腾讯分分龙虎玩法技巧 浙江省十一选五走势图 红牛彩票快3