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就需要开启,这里应该是不需要的)
④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->继续执行,和预想的是一样的,应该没问题,但这里为什么要先和状态寄存器先进行与运算就不太 清楚了。