使用STM32CubeMX进行JY62陀螺仪的联调
想用陀螺仪实时显示欧拉角
这是陀螺仪的官网
JY62产品规格书
通讯协议
JY62 WT61协议
一、JY62模块连串口看看
维特智能产品资料提供的程序不给力,不能直接用在STM32CubeMx的工程里,所以需要自己编。
先用TTL转USB的模块跟电脑连上,在串口助手里看看收发内容,此模块是一直发送的,有个休眠模式(就是发和接到休眠命令时刻一样的加速度和角度),再次解除休眠又实时变化了。
引脚这么接:
模块默认是115200波特率,所以串口助手也115200,接了一段数据大概是这样
可以看到和通讯协议上写的差不多,0x55开头,0x51加速度,0x52角速度,0x53角度
TYPE 备注
0x51 加速度
0x52 角速度
0x53 角度
也可以输入命令,
0xFF 0xAA 0x52 Z轴归零
0xFF 0xAA 0x60 休眠与解休眠
二、用STM32CubeMX生成
打算两个串口,透传的方式,来解析模块数据。USART1与电脑通讯,USART2与模块通讯,STM32中USART1与USART2互为收发目标。
2.1、选用STM32F103ZET6芯片
2.2、Sytem Core里SYS里头把No debug改成 Serial Wire,这样之后可以Debug来看数据。
2.3、Connectivity下,打开USART1和2,Mode选 Asynchronous ,波特率115200
在DMA Settings里,要添加两个DMA,Add之后会有固定通道分配
USART2也是这样配置
2.4、NVIC要勾选 global interrupt,中断里写程序
2.5、Clock Config,不知道为啥64M可以72说不匹配。。。。。
2.6、写工程名和 选工程开发工具
2.7、之后点击GENERATE CODE
三、在KeilV5改写
3.1、先把USART1的printf复写了,在stm32f1xx_it.c里
#include <stdlib.h>
#include <stdio.h>
int fputc(int ch, FILE *f)
{
/* 堵塞判断串口是否发送完成 */
while((USART1->SR & 0X40) == RESET);
/* 串口发送完成,将该字符发送 */
USART1->DR = (uint8_t)ch;
return ch;
}
还有在选项里勾选Use MicroLIB
3.2、对于USART1中断里,接到就发
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!= RESET)
{
//清除空闲标志位
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
uint8_t len = buffersize2-__HAL_DMA_GET_COUNTER(huart1.hdmarx);
HAL_UART_Receive_DMA(&huart1,buffer,buffersize2);
HAL_UART_Transmit_DMA(&huart2,buffer,len);
}
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
对于USART2按照通讯协议解析一下
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!= RESET)
{
//清除空闲标志位
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
HAL_UART_DMAStop(&huart2);
uint8_t len = buffersize2-__HAL_DMA_GET_COUNTER(huart2.hdmarx);
HAL_UART_Receive_DMA(&huart2,buffer2,buffersize2);
if(buffer2[0]-0x55==0)
{
if(buffer2[1]-0x51==0)// 加速度
{
// x
AxL=buffer2[2];
AxH=buffer2[3];
myff=(AxH<<8)|AxL;
acc[0]=myff/32768*16*9.8;
// y
AyL=buffer2[4];
AyH=buffer2[5];
myff=((AyH<<8)|AyL);
acc[1]=myff/32768*16*9.8;
// z
AzL=buffer2[6];
AzH=buffer2[7];
myff=((AzH<<8)|AzL);
acc[2]=myff/32768*16*9.8;
//printf("Acc:%.3f %.3f %.3f\r\n",acc[0],acc[1],acc[2]);
//HAL_UART_Transmit_DMA(&huart1,buffer2,len);
}
else if(buffer2[1]-0x52==0)// 角速度
{
// x
WxL=buffer2[2];
WxH=buffer2[3];
myff=(WxH<<8)|WxL;
anglSpeed[0]= myff/32768*2000;
// y
WyL=buffer2[4];
WyH=buffer2[5];
myff=((WyH<<8)|WyL);
anglSpeed[1]=myff/32768*2000;
// z
WzL=buffer2[6];
WzH=buffer2[7];
myff=((WzH<<8)|WzL);
anglSpeed[2]=myff/32768*2000;
//printf("Angle:%.3f %.3f %.3f\r\n",angl[0],angl[1],angl[2]);
//HAL_UART_Transmit_DMA(&huart1,buffer2,len);
}
else if(buffer2[1]-0x53==0)// 角度
{
// x
WxL=buffer2[2];
WxH=buffer2[3];
myff=(WxH<<8)|WxL;
angl[0]= myff/32768*180;
// y
WyL=buffer2[4];
WyH=buffer2[5];
myff=((WyH<<8)|WyL);
angl[1]=myff/32768*180;
// z
WzL=buffer2[6];
WzH=buffer2[7];
myff=((WzH<<8)|WzL);
angl[2]=myff/32768*180;
//printf("Angle:%.3f %.3f %.3f\r\n",angl[0],angl[1],angl[2]);
//HAL_UART_Transmit_DMA(&huart1,buffer2,len);
}
}
}
/* USER CODE END USART2_IRQn 0 */
/* USER CODE BEGIN USART2_IRQn 1 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE END USART2_IRQn 1 */
}
这里acc,anglSpeed,angl都是公有变量,main.c里头有他们的外部引用
3.3、整体文件程序main.c和stm32f1xx_it.c
main.c
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file : main.c
* @brief : Main program body
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* USER CODE END PTD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
DMA_HandleTypeDef hdma_usart1_rx;
DMA_HandleTypeDef hdma_usart1_tx;
DMA_HandleTypeDef hdma_usart2_rx;
DMA_HandleTypeDef hdma_usart2_tx;
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_USART2_UART_Init(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
const uint8_t buffersize=11;
uint8_t buffer[buffersize];
uint8_t buffer2[buffersize];
extern float angl[3];
extern float acc[3];
extern float anglSpeed[3];
#include <stdlib.h>
#include <stdio.h>
#include "string.h"
// Z轴角度归零
char myYAWCMD[3] = {0XFF,0XAA,0X52};
// 加计校准
char myACCCMD[3] = {0XFF,0XAA,0X67};
// 休眠与解休眠
char mySLEEPCMD[3] = {0XFF,0XAA,0X60};
// 串口模式
char myUARTMODECMD[3] = {0XFF,0XAA,0X61};
// I2C模式
char myIICMODECMD[3] = {0XFF,0XAA,0X62};
// 波特率115200
char myBAUD_115200[3] = {0XFF,0XAA,0X63};
// 波特率9600
char myBAUD_9600[3] = {0XFF,0XAA,0X64};
// 水平安装
char mySHUIPINGSET[3] = {0XFF,0XAA,0X65};
// 垂直安装
char myCHUIZHISET[3] = {0XFF,0XAA,0X66};
typedef unsigned char u8;
void SYN_FrameInfo2(u8 Music, u8 *HZdata);
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
//printf("正在进行加速度校准\r\n");
//sendcmd(ACCCMD);
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
//HAL_UART_Receive_DMA(&huart2,buffer,buffersize);
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE);
//
// HAL_UART_Receive_DMA(&huart1,buffer,buffersize);
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
HAL_UART_Transmit_DMA(&huart2,(uint8_t*)myYAWCMD,3);
HAL_UART_Transmit_DMA(&huart2,(uint8_t*)mySHUIPINGSET,3);
HAL_UART_Transmit_DMA(&huart2,(uint8_t*)myCHUIZHISET,3);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
printf("Acc:%.3f %.3f %.3f\r\n",acc[0],acc[1],acc[2]);
printf("AgSpd:%.3f %.3f %.3f\r\n",anglSpeed[0],anglSpeed[1],anglSpeed[2]);
printf("Angle:%.3f %.3f %.3f\r\n",angl[0],angl[1],angl[2]);
HAL_Delay(400);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
Error_Handler();
}
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
{
Error_Handler();
}
}
/**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
static void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
/* USER CODE END USART1_Init 2 */
}
/**
* @brief USART2 Initialization Function
* @param None
* @retval None
*/
static void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
/* USER CODE END USART2_Init 2 */
}
/**
* Enable DMA controller clock
*/
static void MX_DMA_Init(void)
{
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
/* DMA interrupt init */
/* DMA1_Channel4_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
/* DMA1_Channel5_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
/* DMA1_Channel6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
/* DMA1_Channel7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
}
/**
* @brief GPIO Initialization Function
* @param None
* @retval None
*/
static void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
}
/* USER CODE BEGIN 4 */
/* USER CODE END 4 */
/**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1)
{
}
/* USER CODE END Error_Handler_Debug */
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t *file, uint32_t line)
{
/* USER CODE BEGIN 6 */
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
stm32f1xx_it.c
/* USER CODE BEGIN Header */
/**
******************************************************************************
* @file stm32f1xx_it.c
* @brief Interrupt Service Routines.
******************************************************************************
* @attention
*
* Copyright (c) 2022 STMicroelectronics.
* All rights reserved.
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */
/* USER CODE END TD */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
const uint8_t buffersize2=11;
extern uint8_t buffer[buffersize2];
extern uint8_t buffer2[buffersize2];
#include <stdlib.h>
#include <stdio.h>
int fputc(int ch, FILE *f)
{
/* 堵塞判断串口是否发送完成 */
while((USART1->SR & 0X40) == RESET);
/* 串口发送完成,将该字符发送 */
USART1->DR = (uint8_t)ch;
return ch;
}
/* USER CODE END 0 */
/* External variables --------------------------------------------------------*/
extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart1_tx;
extern DMA_HandleTypeDef hdma_usart2_rx;
extern DMA_HandleTypeDef hdma_usart2_tx;
extern UART_HandleTypeDef huart1;
extern UART_HandleTypeDef huart2;
/* USER CODE BEGIN EV */
/* USER CODE END EV */
/******************************************************************************/
/* Cortex-M3 Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
* @brief This function handles Non maskable interrupt.
*/
void NMI_Handler(void)
{
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */
/* USER CODE END NonMaskableInt_IRQn 0 */
/* USER CODE BEGIN NonMaskableInt_IRQn 1 */
while (1)
{
}
/* USER CODE END NonMaskableInt_IRQn 1 */
}
/**
* @brief This function handles Hard fault interrupt.
*/
void HardFault_Handler(void)
{
/* USER CODE BEGIN HardFault_IRQn 0 */
/* USER CODE END HardFault_IRQn 0 */
while (1)
{
/* USER CODE BEGIN W1_HardFault_IRQn 0 */
/* USER CODE END W1_HardFault_IRQn 0 */
}
}
/**
* @brief This function handles Memory management fault.
*/
void MemManage_Handler(void)
{
/* USER CODE BEGIN MemoryManagement_IRQn 0 */
/* USER CODE END MemoryManagement_IRQn 0 */
while (1)
{
/* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
/* USER CODE END W1_MemoryManagement_IRQn 0 */
}
}
/**
* @brief This function handles Prefetch fault, memory access fault.
*/
void BusFault_Handler(void)
{
/* USER CODE BEGIN BusFault_IRQn 0 */
/* USER CODE END BusFault_IRQn 0 */
while (1)
{
/* USER CODE BEGIN W1_BusFault_IRQn 0 */
/* USER CODE END W1_BusFault_IRQn 0 */
}
}
/**
* @brief This function handles Undefined instruction or illegal state.
*/
void UsageFault_Handler(void)
{
/* USER CODE BEGIN UsageFault_IRQn 0 */
/* USER CODE END UsageFault_IRQn 0 */
while (1)
{
/* USER CODE BEGIN W1_UsageFault_IRQn 0 */
/* USER CODE END W1_UsageFault_IRQn 0 */
}
}
/**
* @brief This function handles System service call via SWI instruction.
*/
void SVC_Handler(void)
{
/* USER CODE BEGIN SVCall_IRQn 0 */
/* USER CODE END SVCall_IRQn 0 */
/* USER CODE BEGIN SVCall_IRQn 1 */
/* USER CODE END SVCall_IRQn 1 */
}
/**
* @brief This function handles Debug monitor.
*/
void DebugMon_Handler(void)
{
/* USER CODE BEGIN DebugMonitor_IRQn 0 */
/* USER CODE END DebugMonitor_IRQn 0 */
/* USER CODE BEGIN DebugMonitor_IRQn 1 */
/* USER CODE END DebugMonitor_IRQn 1 */
}
/**
* @brief This function handles Pendable request for system service.
*/
void PendSV_Handler(void)
{
/* USER CODE BEGIN PendSV_IRQn 0 */
/* USER CODE END PendSV_IRQn 0 */
/* USER CODE BEGIN PendSV_IRQn 1 */
/* USER CODE END PendSV_IRQn 1 */
}
/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
/******************************************************************************/
/* STM32F1xx Peripheral Interrupt Handlers */
/* Add here the Interrupt Handlers for the used peripherals. */
/* For the available peripheral interrupt handler names, */
/* please refer to the startup file (startup_stm32f1xx.s). */
/******************************************************************************/
/**
* @brief This function handles DMA1 channel4 global interrupt.
*/
void DMA1_Channel4_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel4_IRQn 0 */
/* USER CODE END DMA1_Channel4_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart1_tx);
/* USER CODE BEGIN DMA1_Channel4_IRQn 1 */
/* USER CODE END DMA1_Channel4_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel5 global interrupt.
*/
void DMA1_Channel5_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel5_IRQn 0 */
/* USER CODE END DMA1_Channel5_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart1_rx);
/* USER CODE BEGIN DMA1_Channel5_IRQn 1 */
/* USER CODE END DMA1_Channel5_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel6 global interrupt.
*/
void DMA1_Channel6_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel6_IRQn 0 */
/* USER CODE END DMA1_Channel6_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart2_rx);
/* USER CODE BEGIN DMA1_Channel6_IRQn 1 */
/* USER CODE END DMA1_Channel6_IRQn 1 */
}
/**
* @brief This function handles DMA1 channel7 global interrupt.
*/
void DMA1_Channel7_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Channel7_IRQn 0 */
/* USER CODE END DMA1_Channel7_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_usart2_tx);
/* USER CODE BEGIN DMA1_Channel7_IRQn 1 */
/* USER CODE END DMA1_Channel7_IRQn 1 */
}
/* USER CODE BEGIN 1 */
typedef unsigned char u8;
//extern void SYN_FrameInfo2(u8 Music, u8 *HZdata);
static float myff = 0;
float angl[3];
float anglSpeed[3];
uint16_t WxH;
uint16_t WxL;
uint16_t WyH;
uint16_t WyL;
uint16_t WzH;
uint16_t WzL;
uint16_t WxHL;
float acc[3];
uint16_t AxH;
uint16_t AxL;
uint16_t AyH;
uint16_t AyL;
uint16_t AzH;
uint16_t AzL;
/* USER CODE END 1 */
/**
* @brief This function handles USART2 global interrupt.
*/
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!= RESET)
{
//清除空闲标志位
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
HAL_UART_DMAStop(&huart2);
uint8_t len = buffersize2-__HAL_DMA_GET_COUNTER(huart2.hdmarx);
HAL_UART_Receive_DMA(&huart2,buffer2,buffersize2);
if(buffer2[0]-0x55==0)
{
if(buffer2[1]-0x51==0)// 加速度
{
// x
AxL=buffer2[2];
AxH=buffer2[3];
myff=(AxH<<8)|AxL;
acc[0]=myff/32768*16*9.8;
// y
AyL=buffer2[4];
AyH=buffer2[5];
myff=((AyH<<8)|AyL);
acc[1]=myff/32768*16*9.8;
// z
AzL=buffer2[6];
AzH=buffer2[7];
myff=((AzH<<8)|AzL);
acc[2]=myff/32768*16*9.8;
//printf("Acc:%.3f %.3f %.3f\r\n",acc[0],acc[1],acc[2]);
//HAL_UART_Transmit_DMA(&huart1,buffer2,len);
}
else if(buffer2[1]-0x52==0)// 角速度
{
// x
WxL=buffer2[2];
WxH=buffer2[3];
myff=(WxH<<8)|WxL;
anglSpeed[0]= myff/32768*2000;
// y
WyL=buffer2[4];
WyH=buffer2[5];
myff=((WyH<<8)|WyL);
anglSpeed[1]=myff/32768*2000;
// z
WzL=buffer2[6];
WzH=buffer2[7];
myff=((WzH<<8)|WzL);
anglSpeed[2]=myff/32768*2000;
//printf("Angle:%.3f %.3f %.3f\r\n",angl[0],angl[1],angl[2]);
//HAL_UART_Transmit_DMA(&huart1,buffer2,len);
}
else if(buffer2[1]-0x53==0)// 角度
{
// x
WxL=buffer2[2];
WxH=buffer2[3];
myff=(WxH<<8)|WxL;
angl[0]= myff/32768*180;
// y
WyL=buffer2[4];
WyH=buffer2[5];
myff=((WyH<<8)|WyL);
angl[1]=myff/32768*180;
// z
WzL=buffer2[6];
WzH=buffer2[7];
myff=((WzH<<8)|WzL);
angl[2]=myff/32768*180;
//printf("Angle:%.3f %.3f %.3f\r\n",angl[0],angl[1],angl[2]);
//HAL_UART_Transmit_DMA(&huart1,buffer2,len);
}
}
}
/* USER CODE END USART2_IRQn 0 */
/* USER CODE BEGIN USART2_IRQn 1 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE END USART2_IRQn 1 */
}
/**
* @brief This function handles USART1 global interrupt.
*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!= RESET)
{
//清除空闲标志位
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
HAL_UART_DMAStop(&huart1);
uint8_t len = buffersize2-__HAL_DMA_GET_COUNTER(huart1.hdmarx);
HAL_UART_Receive_DMA(&huart1,buffer,buffersize2);
HAL_UART_Transmit_DMA(&huart2,buffer,len);
//printf("Acc:%.3f %.3f %.3f\r\n",(float)stcAcc.a[0]/32768*16,(float)stcAcc.a[1]/32768*16,(float)stcAcc.a[2]/32768*16);
}
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART2_IRQn 1 */
/* USER CODE END USART2_IRQn 1 */
}
四、JY62与STM32连线
串口收发与针脚似乎有个顺序,至少USART1和2是这样的,比如USART1,A9发T,A10收R,USART2是A2发T,A3收R。先发后收,这样就不用每次都查 “STM32F103ZE核心板–原理图”了。
五、效果
目前我还存在个问题,就是角速度的值要么没有,要么是一个值不改变。很纠结。。。。看起来模块很好用,我主要用欧拉角。