使用串口编程的一般步骤:①串口时钟使能,GPIO时钟使能;②设置GPIO初始化结构体,设置GPIO引脚、复用模式等,调用GPIO_PinAFConfig函数初始化;③设置串口初始化结构体,设置波特率、字长、奇偶校验等参数,使用USART_Init函数初始化;④开启中断并且初始化NVIC,使能中断(如果需要开启中断才需要这个步骤);⑤使能串口;⑥编写中断服务函数,函数名格式为USARTxIRQHandler(x对应串口号)。
1.串口时钟使能
USART1要使用PA9与PA10作为TX与RX,USART1本身也使用APB2时钟,因此要打开这3个时钟,使用外设时钟使能函数。
PA9与PA10的时钟使能:
RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK|DEBUG_USART_TX_GPIO_CLK,ENABLE);
USART1的时钟使能:
RCC_APB2PeriphClockCmd(DEBUG_USART_CLK,ENABLE);
2.GPIO串口复用初始化
使用PA9与PA10引脚的复用作为TX与RX,因此要对此两引脚进行设置以及初始化:
3.串口初始化
设置好复用后,要对串口参数进行设置,首先设置串口初始化结构体USART_InitStructure,然后对结构体成员进行设置,最后使用USART_Init()函数进行设置。程序代码如下:
USART_Init(DEBUG_USART,& USART_InitStructure);
最后完成波特率8位数据位、不使用校验、1个停止位等这些参数的设置。
4.中断初始化
串口通信可以使用查询方式或中断方式。由于查询方式效率很低,我们不建议使用。要使用中断,必须先对中断初始化。中断初始化函数要放在串口配置函数前,函数代码如下:
这里设置了第二组,抢断优先级为1,子优先级为1。该函数在串口初始化后使用,即可完成串口中断初始化。
5.串口使能
使用串口需要对串口进行使能,用USART_Cmd函数;如果使用了串口中断,那么也需要串口中断使能,用USART_ITConfig函数。
这两个函数可在stm32f4xx_usart.c中找到。
图7-16 USART_ITConfig函数
USART_ITConfig函数如图7-16所示。该函数有三个形参:第一个形参USARTx是串口,x代表串口编号;第二个形参是USART_IT,指定使能的中断源的事件,事件列表如表7-6所示;第三个形参用于使能,可选择ENABLE或者DISABLE。(www.xing528.com)
表7-6 USART_IT参数含义
USART_IT这8个事件都可以通过使能选择用于触发串口中断。比较常用的事件有USART_IT_TC、USART_IT_RXNE,分别用来判断是否发送完毕与接收完毕。如果要设置USART1的接收中断使能,则函数形式为“USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);”。
串口使能函数USART_Cmd使用起来很简单,如图7-17所示。它只有两个形参,一个是USARTx,代表串口;另一个是使能,可选择ENABLE或者DISABLE。
图7-17 USART_Cmd函数说明
USART1串口使能的函数形式为USART_Cmd(USART1,ENABLE)。
最后的usart1.c源代码如下:
6.串口中断服务函数
中断服务函数可在stm32f4xx_it.c中修改,在最后面加入如下代码:
USART1的中断向量函数名称是USART1_IRQHandler,因此我们要在文件stm32f4xx_it.c中添加函数USART1_IRQHandler()定义。
串口中断事件是指串口接收到了数据,接收结束后产生中断。首先判断是否为接收中断,如果是接收中断,则将接收的数据送给一个缓冲变量Temp。所有与串口相关的函数都在stm32f4xx_usart.c中可以找到。
USART_GetITStatus函数用于判断是否为接收中断使用固件库函数。该函数用来检查中断标志,使用方法与串口中断使能USART_ITConfig函数类似,形参一样,函数的返回值为真则表示发生了相应的中断。
使用if(USART_GetITStatus(DEBUG_USART,USART_IT_RXNE)!=RESET)判断是否发生了接收中断。
固件库的发送与接收使用USART_SendData函数与USART_ReceiveData函数。
USART_SendData函数如图7-18所示。函数只有两个形参,第一个是串口数USARTx,代表串口1~8;第二个是需要发送的数据,是一个16位的无符号整型变量。从函数的内容看,发送函数只是将数据赋值给USART的DR寄存器。注意,赋值前做了与操作,保留了16位的形参低9位,正好与DR寄存器的有效位数的9位对齐(参考DR寄存器说明,实际设置中一般使用8位数据格式),即发送的形参虽然有16位,但发送内容只取低9位。
图7-18 USART_SendData函数
USART_ReceiveData函数如图7-19所示。该函数只有一个形参,即串口数USARTx,代表串口1~8,返回的内容是一个无符号16位的整型数据。从函数的内容看,它与USART_SendData函数类似,将DR寄存器的值做16位转换后返回数据。
图7-19 USART_ReceiveData函数
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。