二级项目(嵌入式系统应用)题目:基于stm32的路检测学号:____20134823091__姓名:_____王秀峰____班级:13自动C1专业:自动化______学院:_工学部____入学时间:____2013级指导教师:王振华_日期:2015年7月9日目录1.线路及实现功能....................................................................................................................11.1线路图............................................................................................................................11.2功能要求........................................................................................................................12实现方法...............................................................................................................................22.1原理及思路....................................................................................................................22.2伪代码............................................................................................................................22.3代码实现........................................................................................................................23程序测试中出现的问题及解决方法...................................................................................53.1stm32通信问题..............................................................................................................53.2引脚输出电平选择及引脚模式选择............................................................................64测试结果与总结...................................................................................................................84.1测试结果........................................................................................................................84.2总结................................................................................................................................9附录.........................................................................................................................................10单片机引脚连接图.............................................................................................................10线路连接图.........................................................................................................................11程序.....................................................................................................................................11main.c..............................................................................................................................11gpio.c...............................................................................................................................13Gpio.h..............................................................................................................................14usart.c..............................................................................................................................14usart.h..............................................................................................................................1611.线路及实现功能1.1线路图1.2功能要求线路连接之后通过单片机检测线路连接是否正确,如果连接正确输出连接正确,如果连接不正确输出连接错误的点,并统计错误点的个数。22实现方法2.1原理及思路原理:当导线连接在一起时,信号是可以导通的,基于这点可以将电路中需要需要检测的点连接单片机的引脚,单片机引脚依次置位,并在其中一个引脚置位时检测其他引脚的电平,同为高电平说明两个引脚之间有导线连接,判断该导线连接是否正确。思路:将GPIOD口的0-11口依次置高电平,每次置高电平后以16位的形式读取GPIOD口的数值,之后对读取到的数据操作,判断是否有错误接线。2.2伪代码①令A=线路正确连接时的数据。②将第一个引脚置位,读取其他引脚的状态得到数据B。③将AB进行比较,如果A=B,则输出正确,如果A!=B,跳到第四步。④令B=A|B,得到正确与错误同时存在的数据,在令B=A^B,得到错误点的数据。⑤将B进行移位操作,得到最低位为1时,根据移位的次数判断哪个引脚对应的线连接错误,并输出错误的位置。⑥将a进行左移操作重复上述操作。2.3代码实现①uint16_tn[12]={3,3,140,140,48,48,832,140,832,832,3072,3072};代码分析:将正确的数据存入数组n[12]中。②uint16_ta=1;GPIO_Write(GPIOD,a);代码分析:声明变量a=1;,并将a的值写入GPIO的ODR寄存器中,如图13图1uint16_tReadValue;ReadValue=GPIO_ReadInputData(GPIOD);代码分析:声明变量ReadValue;通过GPIO_ReadInputData()函数读取GPIOD的数值。GPIO_ReadInputData()函数如图2图2③if(ReadValue==n[i]){USART_ClearFlag(USART1,USART_FLAG_TC);printf(the%dpointisRight\n,i);}代码分析:将ReadValue与n[i]进行比较,如果正确则输出。④uint16_tj,count;else{ReadValue=n[i]|ReadValue;ReadValue=ReadValue^n[i];for(j=0;j12;j++){4ReadValue=1;if(ReadValue&1){USART_ClearFlag(USART1,USART_FLAG_TC);printf(the%dpointiserror,j);count++;}}}代码分析:在第三步判断有错误的情况下,执行此过程,首先将ReadValue=n[i]|ReadValue;得到错误位与正确位同时存在的数据。ReadValue=ReadValue^n[i];异或之后变量ReadValue中只有错误位,通过循环移位,将错误的数据位找到并输出。Count统计错误的个数。53程序测试中出现的问题及解决方法3.1stm32通信问题在任务开始阶段,测试结果如图3图3测试程序USART1_Config();GPIOD_Config();//GPIOD_test();printf(12\n);printf(12\n);while(1);使用stm32f10x调试串口通信时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01,0x02,0x03,0x04.接收端收到的数据为:0x02,0x03,0x04,第一个数据丢失。查阅stm32f10x参考手册,找到这样一句话:TC:发送完成标记:当前字节帧发送完成后,由硬件将该位置位。如果USART_CR1中的6TCIE为1,则产生中断。由软件序列清除该位(先读USART_SR,然后写入USART_DR)。TC位也可以通过写入0来清除,只有在多缓存通讯中才推荐这种清除程序。0:发送还未完成;1:发送完成。注意到这一句:由软件序列清除该位(先读USART_SR,然后写入USART_DR)。也就是说,要先readUSART_SR,然后writeUSART_DR,才能完成TC状态位的清除。而硬件复位后,串口发送的首个数据之前没有readSR的操作,是直接writeDR,也就是说,TC没有被清除掉。硬件复位后,串口发送首个数据之前,先读取一下USART_SR,则能够保证首个数据发送时,不出现覆盖的情况。当然,也有别的方法,比如先清除TC状态位,USART_ClearFlag(USART1,USART_FLAG_TC);3.2引脚输出电平选择及引脚模式选择在程序测试中对a的赋值有两种,一种是置1,另一种是置零;引脚初始化时可选择为输出的有四种模式,分别为推挽输出模式、开漏输出模式、复用推挽输出模式和复用开漏输出模式。复用模式是根据GPIO的复用功能来选择的,如GPIO的引脚用作串口的输出,则使用复用推挽输出模式。所以对于本任务可选的只有前两种。下面是测试过程中的数据①模