错误是最有效的学习了,不错我是没办法集中注意力去学习,虽然很简单,但是还是详细有条理的写一下找到错误,不能靠碰运气写程序,浪费时间精力。
1.循环方式的USART
1.1功能:仅实现不停向PC发送数据
①首先确定串口,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;
然后分别初始化时钟和串口,使能串口
⑥发送数据函数
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}返回bitstatus,这个我是不太看得懂,因为不知道USARTx->SR(状态寄存器)DR(数据寄存器)和USART_FLAG_TXE分别是如何操作的。但是有本书里提供了自己写的驱动,里面说STM32固件中的字符发送函数不带发送完成的判断就马上返回,所以会出现掉数据的现象,书中的函数应该问题不大,不过先试一试,我在做实验时,将一个灯绑在发送程序上,当发送时,灯被点亮,而复位后,灯一直在闪烁,这就是说程序正常执行了,也就是说while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET)这个判断一直可以通过,这是什么情况我就得搞懂库中的函数了。书里的代码也是按寄存器和位写的,搞懂也不容易啊。