陀螺仪程序---可直接用
目录
文章目录
前言
一、陀螺仪
二、使用步骤
1.性能参数
2.引脚说明
总结
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
一、陀螺仪
二、使用步骤
1.性能参数
2.引脚说明
#include "UARTs.h"u8 TxBuffer[256];
u8 TxCounter=0;
u8 count=0; void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USART1 Interrupt */NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 7;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}/**************************实现函数********************************************
*函数原型: void Initial_UART1(u32 baudrate)
*功 能: 初始化STM32-SDK开发板上的RS232接口
输入参数:u32 baudrate 设置RS232串口的波特率
输出参数:没有
*******************************************************************************/
void Initial_UART1(u32 baudrate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/* 使能 UART1 模块的时钟 使能 UART1对应的引脚端口PA的时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);/* 配置UART1 的发送引脚配置PA9 为复用输出 刷新频率50MHz*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); /* 配置UART1 的接收引脚配置PA10为浮地输入 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);/* UART1的配置:1.波特率为调用程序指定的输入 baudrate;2. 8位数据 USART_WordLength_8b;3.一个停止位 USART_StopBits_1;4. 无奇偶效验 USART_Parity_No ;5.不使用硬件流控制 USART_HardwareFlowControl_None;6.使能发送和接收功能 USART_Mode_Rx | USART_Mode_Tx;*/USART_InitStructure.USART_BaudRate = baudrate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//应用配置到UART1USART_Init(USART1, &USART_InitStructure); USART_ITConfig(USART1, USART_IT_TXE, DISABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_ClearFlag(USART1,USART_FLAG_TC);//启动UART1USART_Cmd(USART1, ENABLE);NVIC_Configuration();
}/**************************实现函数********************************************
*函数原型: void UART1_Put_Char(unsigned char DataToSend)
*功 能: RS232发送一个字节
输入参数:unsigned char DataToSend 要发送的字节数据
输出参数:没有
*******************************************************************************/
void UART1_Put_Char(char DataToSend)
{//将要发送的字节写到UART1的发送缓冲区//USART_SendData(USART1, (unsigned char) DataToSend);//等待发送完成//while (!(USART1->SR & USART_FLAG_TXE));TxBuffer[count++] = DataToSend; USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
}void UART1_Put_String(char *Str)
{//判断Str指向的数据是否有效.while(*Str){//是否是回车字符 如果是,则发送相应的回车 0x0d 0x0aif(*Str=='\r')UART1_Put_Char(0x0d);else if(*Str=='\n')UART1_Put_Char(0x0a);else UART1_Put_Char(*Str);Str++;}
}//------------------------------------------------------u8 chrTemp[250];void CopeSerialData(unsigned char ucData);
void USART1_IRQHandler(void)
{if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET){ USART_SendData(USART1, TxBuffer[TxCounter++]); if(TxCounter == count) {USART_ITConfig(USART1, USART_IT_TXE, DISABLE);// 全部发送完成}USART_ClearITPendingBit(USART1, USART_IT_TXE); }else if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){CopeSerialData((unsigned char)USART1->DR);//处理数据USART_ClearITPendingBit(USART1, USART_IT_RXNE);}USART_ClearITPendingBit(USART1,USART_IT_ORE);}//uart reicer flag
#define b_uart_head 0x80
#define b_rx_over 0x40// USART Receiver buffer
#define RX_BUFFER_SIZE 100u8 U2TxBuffer[258];
u8 U2TxCounter=0;
u8 U2count=0; void U2NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure; /* Enable the USART1 Interrupt */NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 8;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}/**************************实现函数********************************************
*函数原型: void Initial_UART2(u32 baudrate)
*功 能: 初始化STM32-SDK开发板上的RS232接口
输入参数:u32 baudrate 设置RS232串口的波特率
输出参数:没有
*******************************************************************************/
void Initial_UART2(u32 baudrate)
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/* 使能 UART2 模块的时钟 使能 UART2对应的引脚端口PA的时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2 | RCC_APB2Periph_GPIOA, ENABLE);/* 配置UART2 的发送引脚配置PA9 为复用输出 刷新频率50MHz*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); /* 配置UART2 的接收引脚配置PA10为浮地输入 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);/* UART2的配置:1.波特率为调用程序指定的输入 baudrate;2. 8位数据 USART_WordLength_8b;3.一个停止位 USART_StopBits_1;4. 无奇偶效验 USART_Parity_No ;5.不使用硬件流控制 USART_HardwareFlowControl_None;6.使能发送和接收功能 USART_Mode_Rx | USART_Mode_Tx;*/USART_InitStructure.USART_BaudRate = baudrate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//应用配置到UART2USART_Init(USART2, &USART_InitStructure); USART_ITConfig(USART2, USART_IT_TXE, DISABLE); USART_ClearFlag(USART2,USART_FLAG_TC);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //使能接收中断//启动UART2USART_Cmd(USART2, ENABLE);U2NVIC_Configuration();
}volatile unsigned char RC_Flag;
//------------------------------------------------------
void USART2_IRQHandler(void)
{unsigned char data;if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET){ /* Write one byte to the transmit data register */USART_SendData(USART2, U2TxBuffer[U2TxCounter++]); /* Clear the USART1 transmit interrupt */USART_ClearITPendingBit(USART2, USART_IT_TXE); if(U2TxCounter == U2count){/* Disable the USART1 Transmit interrupt */USART_ITConfig(USART2, USART_IT_TXE, DISABLE);} }else if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){data=USART_ReceiveData(USART2);/* Clear the USART1 transmit interrupt */USART_ClearITPendingBit(USART2, USART_IT_RXNE);}
}
//------------------End of File----------------------------
主程序模块
---------硬件上的引脚连接:----------
TTL接口:
PC(USB-TTL) STM32F103 JY-901
RX <--> PA9(UART1-TXD)
PA10(UART1-RXD) <--> TX
------------------------------------
---------硬件上的引脚连接:----------
TTL接口:
PC(USB-TTL) STM32F103 JY-901
RX <--> PA9(UART1-TXD)PA10(UART1-RXD) <--> TX
------------------------------------
*/#include "stm32f10x.h"
#include "UARTs.h"
#include "IOI2C.h"
#include "delay.h"
#include "JY901.h"
#include "string.h"struct STime stcTime;
struct SAcc stcAcc;
struct SGyro stcGyro;
struct SAngle stcAngle;
struct SMag stcMag;
struct SDStatus stcDStatus;
struct SPress stcPress;
struct SLonLat stcLonLat;
struct SGPSV stcGPSV;//CopeSerialData为串口中断调用函数,串口每收到一个数据,调用一次这个函数。
void CopeSerialData(unsigned char ucData)
{static unsigned char ucRxBuffer[250];static unsigned char ucRxCnt = 0; ucRxBuffer[ucRxCnt++]=ucData;if (ucRxBuffer[0]!=0x55) //数据头不对,则重新开始寻找0x55数据头{ucRxCnt=0;return;}if (ucRxCnt<11) {return;}//数据不满11个,则返回else{switch(ucRxBuffer[1]){case 0x50: memcpy(&stcTime,&ucRxBuffer[2],8);break;//memcpy为编译器自带的内存拷贝函数,需引用"string.h",将接收缓冲区的字符拷贝到数据共同体里面,从而实现数据的解析。case 0x51: memcpy(&stcAcc,&ucRxBuffer[2],8);break;case 0x52: memcpy(&stcGyro,&ucRxBuffer[2],8);break;case 0x53: memcpy(&stcAngle,&ucRxBuffer[2],8);break;case 0x54: memcpy(&stcMag,&ucRxBuffer[2],8);break;case 0x55: memcpy(&stcDStatus,&ucRxBuffer[2],8);break;case 0x56: memcpy(&stcPress,&ucRxBuffer[2],8);break;case 0x57: memcpy(&stcLonLat,&ucRxBuffer[2],8);break;case 0x58: memcpy(&stcGPSV,&ucRxBuffer[2],8);break;}ucRxCnt=0;}
}int main(void)
{char str[100];SystemInit(); /* 配置系统时钟为72M 使用外部8M晶体+PLL*/ SysTick_init(72,10); //延时初始化Initial_UART1(9600);delay_ms(1000);//等等JY-91初始化完成?while(1){ delay_ms(500);sprintf(str,"Time:20%d-%d-%d %d:%d:%.3f\r\n",stcTime.ucYear,stcTime.ucMonth,stcTime.ucDay,stcTime.ucHour,stcTime.ucMinute,(float)stcTime.ucSecond+(float)stcTime.usMiliSecond/1000);UART1_Put_String(str); delay_ms(10);//等待传输完成sprintf(str,"Acc:%.3f %.3f %.3f\r\n",(float)stcAcc.a[0]/32768*16,(float)stcAcc.a[1]/32768*16,(float)stcAcc.a[2]/32768*16);UART1_Put_String(str);delay_ms(10);//等待传输完成sprintf(str,"Gyro:%.3f %.3f %.3f\r\n",(float)stcGyro.w[0]/32768*2000,(float)stcGyro.w[1]/32768*2000,(float)stcGyro.w[2]/32768*2000);UART1_Put_String(str);delay_ms(10);//等待传输完成sprintf(str,"Angle:%.3f %.3f %.3f\r\n",(float)stcAngle.Angle[0]/32768*180,(float)stcAngle.Angle[1]/32768*180,(float)stcAngle.Angle[2]/32768*180);UART1_Put_String(str);delay_ms(10);//等待传输完成sprintf(str,"Mag:%d %d %d\r\n",stcMag.h[0],stcMag.h[1],stcMag.h[2]);UART1_Put_String(str); delay_ms(10);//等待传输完成sprintf(str,"Pressure:%ld Height%.2f\r\n",stcPress.lPressure,(float)stcPress.lAltitude/100);UART1_Put_String(str);delay_ms(10);//等待传输完成sprintf(str,"DStatus:%d %d %d %d\r\n",stcDStatus.sDStatus[0],stcDStatus.sDStatus[1],stcDStatus.sDStatus[2],stcDStatus.sDStatus[3]);UART1_Put_String(str);delay_ms(10);//等待传输完成sprintf(str,"Longitude:%ldDeg%.5fm Lattitude:%ldDeg%.5fm\r\n",stcLonLat.lLon/10000000,(double)(stcLonLat.lLon % 10000000)/1e5,stcLonLat.lLat/10000000,(double)(stcLonLat.lLat % 10000000)/1e5);UART1_Put_String(str);delay_ms(10);//等待传输完成sprintf(str,"GPSHeight:%.1fm GPSYaw:%.1fDeg GPSV:%.3fkm/h\r\n\r\n",(float)stcGPSV.sGPSHeight/10,(float)stcGPSV.sGPSYaw/10,(float)stcGPSV.lGPSVelocity/1000);UART1_Put_String(str);delay_ms(10);//等待传输完成}//主循环 end }
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
陀螺仪程序---可直接用相关推荐
- 聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包
聊天没有表情包被嘲讽,程序员直接用python爬取了十万张表情包 前言 分析页面 具体实现 解析页面 获取网页内容 解析网页内容 文件下载 多线程下载 成果 总结 前言 事情要从几天前说起,我有一个朋 ...
- DSP程序定制 F28335 F2812 简易变频器svpwm源码 简易变频器C语言源代码工程文件,直接用ccs3.3以上软件打开
DSP程序定制 F28335 F2812 简易变频器svpwm源码 简易变频器C语言源代码工程文件,直接用ccs3.3以上软件打开. 包括SVPWM核心代码,有运行频率设置.载波频率(2.5K~20K ...
- OMRON CP1H PLC脉冲控制三轴伺服, 码垛机,实际 项目,程序结构清析,有完整的注释,重复功能做成FB功能块,在其它项目可以导出直接用,MCGS触摸屏程序,有电气CAD图纸。
OMRON CP1H PLC脉冲控制三轴伺服, 码垛机,实际 项目,程序结构清析,有完整的注释,重复功能做成FB功能块,在其它项目可以导出直接用,MCGS触摸屏程序,有电气CAD图纸.
- 文件上传 java 完美,vue+java实现文件上传(excel等),会出现跨域问题,直接用form表单提交就不会有问题了(new FormData())...
vue+java实现文件上传(excel等),会出现跨域问题,直接用form表单提交就不会有问题了(new FormData()) 地址:https://www.cnblogs.com/muscles ...
- hibernate mysql autocommit_Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了?...
求大神讲解下 Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了? public class Main { public static void main(Stri ...
- java指令导出data文件_直接用 java 命令行动态生成jpg文件 (转)
直接用 java 命令行动态生成jpg文件 (转)[@more@] /** * jeruGraphics v 1.0 * * 看到一些动态生成图象的例子都是完成的, * 而且很长,觉得不是无论从实用性 ...
- C#中使用属性及get,set访问private字段和直接用public修饰字段的对比和理解
导语 本篇仅作为初学C#的随笔,内容较基础,适合初级水平开发者,浅谈主题中的话题,从两者的相同点,不同点,和如何选三个角度探讨,希望文章能起到抛砖引玉的作用,欢迎补充和纠正. 如果你并不想花费十分钟左 ...
- H5 vue-pdf 使用方法 复制粘贴直接用
H5 vue-pdf 使用方法 复制粘贴直接用 <!-- 如果印章不显示 全局搜索这行代码 然后注释掉 重新打包就可以了 _this3.setFlags(_util.AnnotationFlag ...
- FX3U PLC源代码,stm32芯片。 全套硬件,软件源码,可以直接用GX Works2编程直接写入。 带读保护版本
FX3U PLC源代码,stm32芯片. 全套硬件,软件源码,可以直接用GX Works2编程直接写入. 带读保护版本. 是以太网之前的最高版本. 产品功能描述:用梯形图语言编写应用程序,可以直接使用 ...
最新文章
- debugInit.c tomcat启动错误
- Java面试题整理,连续四年百度Java岗必问面试题
- ROS系统 常用可视化工具的使用
- 关于JAVA编译时找不到自定义包的问题
- [YTU]_1998( C语言实验——删除指定字符)
- Android --- 命名规范
- 中石油训练赛 - Bee Problem(dfs+连通块)
- 可视化太酷辽!一文了解排序和搜索算法在前端中的应用
- cesium js 路径_[CesiumJS]Cesium入门3 – Cesium目录框架结构
- L1-052 2018我们要赢 (5 分)—团体程序设计天梯赛
- selenium自动化之PO模型
- 2020中国云计算公司排名 哪家的云服务器最好用?
- InvokeRequired and Invoke
- 三种方法解决git拒绝连接问题fatal: unable to access xxxx: Failed to connect to xxxx : Connection refused
- 一个正方形截取四分之一后如何四等分
- 【社会调研】访谈个案案例分享
- 文献阅读 Learning Meta Face Recognition in Unseen Domains 2020 CVPR
- 药物研发早期预测细胞毒性的解决方案
- 如何查看本机IP地址(ipconfig命令)
- rockchip rk3368(px5)车载开发之路1,原生代码系统正常启动
热门文章
- linux用户的邮件存在哪里,在Linux系统中收发及查看邮件
- 社群团购到底有哪些优势?为什么社群团购很容易打造爆品?
- c语言函数大全表格形式,C语言函数大全[表格形式].doc
- 四舍五入VS银行家舍入 (四舍六入五取偶)
- 由index为timestamp的数据获取股票集合竞价数据
- 数据可视化查看2021全国各省份的GDP
- 波束赋形技术lms算法在matlab仿真,自适应波束成形算法LMS、RLS、VSSLMS分解
- 502 问题怎么排查?
- 2023首届大学生算法大赛——补题
- WebGL、ThreeJS、BabylonJS、SceneJS和Cesium框架对比及简介