专注电子技术学习与研究
当前位置:单片机教程网 >> STM32 >> 浏览文章

stm32 USART 的学习

作者:simeto   来源:simeto的空间   点击数:  更新时间:2014年06月20日   【字体:

错误是最有效的学习了,不错我是没办法集中注意力去学习,虽然很简单,但是还是详细有条理的写一下找到错误,不能靠碰运气写程序,浪费时间精力。 

 

1.循环方式的USART 

1.1功能:仅实现不停向PC发送数据

 1.2实现步骤:

①首先确定串口,STM32的PA9和PA10对应的是 串口1 ,其中串口1时钟的打开函数为RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);可见串口1为高速外设时钟(APB2),具体的需要再参考数据手册 。

②配置程序包括:RCC配置 (不知道具体干什么的);GPIO配置;NVIC配置(中断配置,循环用不到);USART配置

③RCC配置 除了时钟配置需要修改,其他暂时没有发现不同,需要打开中断时钟,GPIO时钟,还有AFIO复用时钟(?,这个可以深入看一看,不太明白,功能是当外设用的复用IO就需要开启,这里应该是不需要的,参考http://blog.sina.com.cn/s/blog_5d9349d10100u9ni.html)

④GPIO配置 TX设置为复用推挽输出(GPIO_Mode_AF_PP)RX设置为悬空输入(GPIO_Mode_IN_FLOATING)

⑤ USART配置 这个写的是五花八门,问题多半出在这里,大分歧是需不需要进行时钟的配置,打开库文件,找到USART_ClockInitTypeDef结构体的定义:

typedef struct

{

uint16_t USART_Clock;

uint16_t USART_CPOL;

uint16_t USART_CPHA; //这个有问题,有两种配置方式USART_CPHA_1Edge和USART_CPHA_2Edge,不知道有没有影响

uint16_t USART_LastBit;

} USART_ClockInitTypeDef;

然后分别初始化时钟和串口,使能串口

⑥发送数据函数  这个从技术上出问题的概率不大,但从猜测的角度,我觉得很有可能是这里的问题,STM32库里有发送个数据的函数USART_SendData(串口,16位无符号整型数据),然后等待系统响应,判断系统相应的方法是通过判断USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET时,然后继续执行,找到该函数,主要是

 if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET)

{

bitstatus = SET;

}

else

{

bitstatus = RESET;

}返回bitstatus,这个我是不太看得懂,因为不知道USARTx->SR(状态寄存器)DR(数据寄存器)和USART_FLAG_TXE分别是如何操作的。但是有本书里提供了自己写的驱动,里面说STM32固件中的字符发送函数不带发送完成的判断就马上返回,所以会出现掉数据的现象,书中的函数应该问题不大,不过先试一试,我在做实验时,将一个灯绑在发送程序上,当发送时,灯被点亮,而复位后,灯一直在闪烁,这就是说程序正常执行了,也就是说while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET)这个判断一直可以通过,这是什么情况我就得搞懂库中的函数了。书里的代码也是按寄存器和位写的,搞懂也不容易啊。

 USART_FLAG_TC是发送完成标志位,USART_FLAG_TXE是发送数据寄存器空标志位,这一下清楚了,就是判断寄存器中数据为空 ->FLAG=1->库函数返回set->继续执行,和预想的是一样的,应该没问题,但这里为什么要先和状态寄存器先进行与运算就不太 清楚了

 

关闭窗口