1011 lines
28 KiB
C
1011 lines
28 KiB
C
|
||
|
||
#include "basic.h"
|
||
|
||
/**
|
||
* @brief DEBUG_USART GPIO 配置,工作模式配置。115200 8-N-1 ,中断接收模式
|
||
* @param 无
|
||
* @retval 无
|
||
*/
|
||
|
||
|
||
//串口1中断初始化
|
||
static void NVIC_Configuration(void)
|
||
{
|
||
NVIC_InitTypeDef NVIC_InitStructure;
|
||
|
||
/* 嵌套向量中断控制器组选择 */
|
||
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
|
||
|
||
/* 配置USART为中断源 */
|
||
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
|
||
/* 抢断优先级为1 */
|
||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
|
||
/* 子优先级为1 */
|
||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
|
||
/* 使能中断 */
|
||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||
/* 初始化配置NVIC */
|
||
NVIC_Init(&NVIC_InitStructure);
|
||
|
||
}
|
||
|
||
//串口1初始化
|
||
void USART1_Config(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
USART_InitTypeDef USART_InitStructure;
|
||
|
||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
|
||
|
||
/* 使能 USART 时钟 */
|
||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
|
||
|
||
/* GPIO初始化 */
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||
|
||
/* 配置Tx引脚为复用功能 */
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 ;
|
||
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
|
||
/* 配置Rx引脚为复用功能 */
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
|
||
GPIO_Init(GPIOA, &GPIO_InitStructure);
|
||
|
||
/* 连接 PXx 到 USARTx_Tx*/
|
||
GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
|
||
|
||
/* 连接 PXx 到 USARTx__Rx*/
|
||
GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
|
||
|
||
/* 配置串DEBUG_USART 模式 */
|
||
/* 波特率设置:DEBUG_USART_BAUDRATE */
|
||
USART_InitStructure.USART_BaudRate = 115200;
|
||
/* 字长(数据位+校验位):8 */
|
||
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
||
/* 停止位:1个停止位 */
|
||
USART_InitStructure.USART_StopBits = USART_StopBits_1;
|
||
/* 校验位选择:不使用校验 */
|
||
USART_InitStructure.USART_Parity = USART_Parity_No;
|
||
/* 硬件流控制:不使用硬件流 */
|
||
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
||
/* USART模式控制:同时使能接收和发送 */
|
||
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
||
/* 完成USART初始化配置 */
|
||
USART_Init(USART1, &USART_InitStructure);
|
||
|
||
//配置串口接收中断
|
||
NVIC_Configuration();
|
||
|
||
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能串口中断
|
||
//USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//使能串口空闲中断
|
||
/* 使能串口 */
|
||
USART_Cmd(USART1, ENABLE);
|
||
|
||
}
|
||
|
||
//串口3RS485中断初始化
|
||
static void RS485_NVIC_Configuration(void)
|
||
{
|
||
NVIC_InitTypeDef NVIC_InitStructure;
|
||
/* 嵌套向量中断控制器组选择 */
|
||
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
|
||
/* 配置USART为中断源 */
|
||
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
|
||
/* 抢断优先级为1 */
|
||
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
||
/* 子优先级为1 */
|
||
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
|
||
/* 使能中断 */
|
||
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||
/* 初始化配置NVIC */
|
||
NVIC_Init(&NVIC_InitStructure);
|
||
}
|
||
|
||
#define UART_RX_LEN 10
|
||
volatile uint16_t com3_rx_len = 0; //接收帧数据的长度
|
||
volatile uint8_t com3_recv_end_flag = 0;//帧数据接收完成标志
|
||
uint8_t com3_rx_buffer[10]={0}; //接收数据缓存
|
||
uint8_t UART_Receive_flg;
|
||
uint8_t UART_Receive_len;
|
||
|
||
|
||
void RS485_DMA_Init()
|
||
{
|
||
DMA_InitTypeDef DMA_InitStructure;
|
||
/**
|
||
* 使用DMA1、数据流1、通道4
|
||
*/
|
||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
|
||
//
|
||
DMA_DeInit(DMA1_Stream1);
|
||
while (DMA_GetCmdStatus(DMA1_Stream1) != DISABLE); //等待DMA可配置
|
||
|
||
//通道0
|
||
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
|
||
//外设到内存
|
||
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
|
||
//数据量
|
||
DMA_InitStructure.DMA_BufferSize = UART_RX_LEN ;// 3*2
|
||
//循环模式
|
||
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
|
||
//优先级为中
|
||
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
|
||
|
||
//外设地址
|
||
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR;////((uint32_t)0x40012308)((u32)ADC1+0x4c);
|
||
//指针不递增
|
||
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
||
//外设数据大小
|
||
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
|
||
//单次突发
|
||
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
|
||
|
||
//内存地址
|
||
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)com3_rx_buffer;
|
||
//指针递增
|
||
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
||
//存储器数据大小
|
||
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;//存储器数据长度:8位
|
||
//单次突发
|
||
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
|
||
|
||
//禁止FIFO模式 参数可不配置
|
||
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
|
||
//由于禁止FIFO模式 参数可不配置
|
||
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
|
||
//初始化DMA
|
||
DMA_Init(DMA1_Stream1, &DMA_InitStructure);
|
||
|
||
|
||
//使能DMA2 Stream0
|
||
DMA_Cmd(DMA1_Stream1,ENABLE);
|
||
|
||
//DMA_ITConfig(DMA1_Stream1,DMA_IT_TC,ENABLE);
|
||
}
|
||
|
||
|
||
|
||
//串口3RS485初始化
|
||
void RS485_Config(void)
|
||
{
|
||
GPIO_InitTypeDef GPIO_InitStructure;
|
||
USART_InitTypeDef USART_InitStructure;
|
||
|
||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
|
||
|
||
/* 使能 USART3 时钟 */
|
||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
|
||
|
||
/* GPIO初始化 */
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||
|
||
/* 配置Tx引脚为复用功能 */
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 ;
|
||
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
|
||
/* 配置Rx引脚为复用功能 */
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
|
||
GPIO_Init(GPIOB, &GPIO_InitStructure);
|
||
|
||
/* 配置485使能引脚 */
|
||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
|
||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
|
||
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
|
||
GPIO_Init(GPIOE, &GPIO_InitStructure);
|
||
GPIO_SetBits(GPIOE, GPIO_Pin_15);
|
||
|
||
/* 连接 PXx 到 USARTx_Tx*/
|
||
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART1);
|
||
|
||
/* 连接 PXx 到 USARTx__Rx*/
|
||
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART1);
|
||
|
||
/* 配置串DEBUG_USART 模式 */
|
||
/* 波特率设置:DEBUG_USART_BAUDRATE */
|
||
USART_InitStructure.USART_BaudRate = 9600;
|
||
/* 字长(数据位+校验位):8 */
|
||
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
|
||
/* 停止位:1个停止位 */
|
||
USART_InitStructure.USART_StopBits = USART_StopBits_1;
|
||
/* 校验位选择:不使用校验 */
|
||
USART_InitStructure.USART_Parity = USART_Parity_No;
|
||
/* 硬件流控制:不使用硬件流 */
|
||
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
|
||
/* USART模式控制:同时使能接收和发送 */
|
||
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
|
||
/* 完成USART初始化配置 */
|
||
USART_Init(USART3, &USART_InitStructure);
|
||
|
||
//配置串口接收中断
|
||
RS485_NVIC_Configuration();
|
||
|
||
//USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//使能串口中断
|
||
USART_ITConfig(USART3,USART_IT_IDLE,ENABLE); //开启总线空闲中断
|
||
|
||
USART_DMACmd(USART3,USART_DMAReq_Rx,ENABLE); //使能串口3的DMA接收
|
||
/* 使能串口 */
|
||
USART_Cmd(USART3, ENABLE);
|
||
|
||
RS485_RECEIVE;//默认进入接收模式
|
||
}
|
||
|
||
void DealWith_UartData()
|
||
{
|
||
DMA_Cmd(DMA1_Stream1, DISABLE);
|
||
UART_Receive_flg = 1;
|
||
UART_Receive_len = UART_RX_LEN - DMA_GetCurrDataCounter(DMA1_Stream1);
|
||
com3_rx_buffer[UART_Receive_len] = 0;
|
||
DMA_SetCurrDataCounter(DMA1_Stream1,UART_RX_LEN);
|
||
DMA_ClearFlag(DMA1_Stream1, DMA_FLAG_TCIF2);
|
||
DMA_Cmd(DMA1_Stream1, ENABLE);
|
||
}
|
||
|
||
|
||
/***************** 发送一个字符 **********************/
|
||
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
|
||
{
|
||
/* 发送一个字节数据到USART */
|
||
USART_SendData(pUSARTx,ch);
|
||
|
||
/* 等待发送数据寄存器为空 */
|
||
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
|
||
}
|
||
|
||
/***************** 发送字符串 **********************/
|
||
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
|
||
{
|
||
unsigned int k=0;
|
||
do
|
||
{
|
||
Usart_SendByte( pUSARTx, *(str + k) );
|
||
k++;
|
||
} while(*(str + k)!='\0');
|
||
|
||
/* 等待发送完成 */
|
||
while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
|
||
{}
|
||
}
|
||
|
||
/***************** 发送一个16位数 **********************/
|
||
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
|
||
{
|
||
uint8_t temp_h, temp_l;
|
||
|
||
/* 取出高八位 */
|
||
temp_h = (ch&0XFF00)>>8;
|
||
/* 取出低八位 */
|
||
temp_l = ch&0XFF;
|
||
|
||
/* 发送高八位 */
|
||
USART_SendData(pUSARTx,temp_h);
|
||
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
|
||
|
||
/* 发送低八位 */
|
||
USART_SendData(pUSARTx,temp_l);
|
||
while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
|
||
}
|
||
|
||
///重定向c库函数printf到串口,重定向后可使用printf函数
|
||
int fputc(int ch, FILE *f)
|
||
{
|
||
/* 发送一个字节数据到串口 */
|
||
USART_SendData(USART1, (uint8_t) ch);
|
||
|
||
/* 等待发送完毕 */
|
||
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
|
||
|
||
return (ch);
|
||
}
|
||
|
||
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
|
||
int fgetc(FILE *f)
|
||
{
|
||
/* 等待串口输入数据 */
|
||
while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
|
||
|
||
return (int)USART_ReceiveData(USART1);
|
||
}
|
||
|
||
//串口3的发送函数
|
||
void Uart3_SendStr(u8* SendBuf,u8 len)
|
||
{
|
||
// u8 t;
|
||
RS485_SEND;//执行发数据是将其置位,485处于可以发送状态
|
||
|
||
while(len>0)
|
||
{
|
||
while((USART3->SR&0X40)==0);//等待发送完成
|
||
USART3->DR = (u8) *SendBuf;
|
||
SendBuf++;
|
||
len--;
|
||
}
|
||
while((USART3->SR&0X40)==0); //这个循环一定要有,确保最后一位数据发送出去,避免因为复位导致数据未全部发送,我就在这个地方找了好久
|
||
RS485_RECEIVE; //数据发送完毕将其复位,等待接收数据
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void usart_Init()
|
||
{
|
||
NVIC_Configuration();
|
||
USART1_Config();
|
||
RS485_NVIC_Configuration();
|
||
RS485_Config();
|
||
RS485_DMA_Init();
|
||
}
|
||
|
||
#define HD_VER 0001 //硬件版本
|
||
#define SW_VER 0001 //软件版本
|
||
|
||
#define TTL_SEND_BUFF_LEN 60 //发送数据长度
|
||
#define TTL_RECEIVE_BUFF_LEN 60 //接收数据长度
|
||
|
||
//----------------------------------------------------------------
|
||
//uart1用于接收usb转ttl的串口
|
||
//----------------------------------------------------------------
|
||
|
||
|
||
//存放发送的数据内容
|
||
unsigned char send_data[50];
|
||
unsigned char time_data[60];
|
||
unsigned char Fre_data[4];
|
||
|
||
//发送buff
|
||
unsigned char ttl_send_len = 0;
|
||
unsigned char ttl_send_buff[TTL_SEND_BUFF_LEN] = {0};
|
||
|
||
//接收buff
|
||
unsigned char ttl_receive_len = 0;
|
||
unsigned char ttl_receive_buff[TTL_RECEIVE_BUFF_LEN] = {0};
|
||
|
||
//接收超时
|
||
unsigned char ttl_receive_flag = 0;
|
||
unsigned char ttl_receive_cnt = 0;
|
||
unsigned char ttl_receive_interval = 0;
|
||
unsigned char send_flag = 0; //发送标志
|
||
|
||
#define DATA_LEN TTL_RECEIVE_BUFF_LEN //一般数据长度
|
||
#define UART_ORDER_SOF 0x05 //起始字
|
||
#define UART_ORDER_END 0x1B //结束字
|
||
#define FIXED_LEN 0x0B //固定长度 //取消RW
|
||
|
||
unsigned short SUR_DEVICE_ADDR = 0x00A1; //PC //0x00A1; //设备
|
||
unsigned short OBJ_DEVICE_ADDR = 0x00B1; //主板 //0x00B1; //PC群发 FFFF 0000
|
||
|
||
unsigned char get_time_flag = 0;
|
||
unsigned char order_flag = 0;
|
||
unsigned int checksum = 0, re_status = 0, rec_len = 0, data_len = 0, shouldaccept = 0;
|
||
|
||
char Rate_dis = 0; //额定距离:0-1mm 1-2mm 2-3mm 3-4mm
|
||
char Motor_Run = 0; //0 停止 1 运行 2 运行到起始点 3 运行到结束点
|
||
char Run_State = 0; //0 停止 1 运行
|
||
char Run_Mode = 0; //0 手动 1 自动
|
||
char Run_Dir = 0; //0 正转 1 反转
|
||
unsigned int Run_Step = 0; //电机运行步长
|
||
unsigned int Run_Inter = 0; //电机运行间隔时长
|
||
unsigned int Set_Vol = 820; //设定电压
|
||
unsigned int Motor_Fre = 0; //转动频率
|
||
unsigned int Mode_Flag = 1; //模式标志
|
||
unsigned int Speed = 0; //转速
|
||
unsigned int Set_dis = 0; //距离值
|
||
float dis = 0;
|
||
|
||
//单独发送
|
||
void UART1_SendData(unsigned char dat)
|
||
{
|
||
USART_SendData(USART1,dat);
|
||
}
|
||
|
||
//发送数据
|
||
void UART1_Send_Char(unsigned char dat)
|
||
{
|
||
USART_SendData(USART1,dat);
|
||
}
|
||
|
||
//初始化
|
||
void InitUart_Data(void)
|
||
{
|
||
//EXTI_CTRL(1);
|
||
order_flag = 0;
|
||
rec_len = 0;
|
||
re_status = 0;
|
||
shouldaccept = 0;
|
||
|
||
ttl_receive_flag = 0;
|
||
ttl_receive_cnt = 0;
|
||
|
||
checksum = 0;
|
||
|
||
for(data_len = 0; data_len < DATA_LEN; data_len++)
|
||
{
|
||
ttl_receive_buff[data_len] = 0;
|
||
}
|
||
|
||
data_len = 0;
|
||
|
||
// UART_Send_Char(0xdd);
|
||
}
|
||
|
||
|
||
|
||
/* Private function prototypes -----------------------------------------------*/
|
||
/* Private functions ---------------------------------------------------------*/
|
||
//----------------------------------------------------------------
|
||
//接收串口1
|
||
//----------------------------------------------------------------
|
||
/****************************************************************************************************
|
||
* @brief Download a file via serial port
|
||
* @param None
|
||
* @retval None
|
||
**************************************************************************************************/
|
||
void start_ttl_receive_timer(unsigned long ms)
|
||
{
|
||
if(ms == 0)
|
||
{
|
||
return;
|
||
}
|
||
|
||
ttl_receive_flag = 1;
|
||
ttl_receive_cnt = 0;
|
||
ttl_receive_interval = ms;
|
||
}
|
||
|
||
/****************************************************************************************************
|
||
* @brief Upload a file via serial port.
|
||
* @param None
|
||
* @retval None
|
||
**************************************************************************************************/
|
||
void over_ttl_receive_timer(void)
|
||
{
|
||
ttl_receive_flag = 0;
|
||
ttl_receive_cnt = 0;
|
||
ttl_receive_interval = 0;
|
||
|
||
InitUart_Data();
|
||
|
||
// UART2_Send_Char(0xed);
|
||
}
|
||
|
||
/****************************************************************************************************
|
||
* @brief Display the Main Menu on HyperTerminal
|
||
* @param None
|
||
* @retval None
|
||
**************************************************************************************************/
|
||
void clear_ttl_receive_timer(void)
|
||
{
|
||
uint16_t i = 0;
|
||
ttl_receive_len = 0;
|
||
ttl_receive_flag = 0;
|
||
ttl_receive_cnt = 0;
|
||
ttl_receive_interval = 0;
|
||
|
||
for(i = 0; i < TTL_RECEIVE_BUFF_LEN; i++)
|
||
{
|
||
ttl_receive_buff[i] = 0;
|
||
}
|
||
}
|
||
|
||
//返回串口屏应答是否接收完成的结果
|
||
//0:没超时 1:超时
|
||
unsigned char judge_ttl_receive_timer(void)
|
||
{
|
||
if(ttl_receive_flag == 2)
|
||
{
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
/****************************************************************************************************
|
||
* @brief Display the Main Menu on HyperTerminal
|
||
* @param None
|
||
* @retval None
|
||
**************************************************************************************************/
|
||
//放在大循环中的计时器里
|
||
void process_ttl_receive_timer(void)
|
||
{
|
||
if(ttl_receive_flag == 1)
|
||
{
|
||
ttl_receive_cnt++;
|
||
}
|
||
|
||
if((ttl_receive_interval > 0) && (ttl_receive_cnt >= ttl_receive_interval))
|
||
{
|
||
over_ttl_receive_timer();
|
||
}
|
||
}
|
||
|
||
#define TTL_OVER_TIME 10
|
||
/****************************************************************************************************
|
||
* @brief Display the Main Menu on HyperTerminal
|
||
* @param None
|
||
* @retval None
|
||
**************************************************************************************************/
|
||
//放串口中断内,接收数据
|
||
void receive_ttl_data(unsigned char rx_data)
|
||
{
|
||
//不能超过数组的最大长度
|
||
if(ttl_receive_len < TTL_RECEIVE_BUFF_LEN)
|
||
{
|
||
//开始计时
|
||
start_ttl_receive_timer(TTL_OVER_TIME);
|
||
|
||
//串口接收数据分析
|
||
Do_Receive_Uart_For_Module(rx_data);
|
||
}
|
||
else //超过上限则抛弃后面的数据
|
||
{
|
||
//超时处理
|
||
over_ttl_receive_timer();
|
||
|
||
InitUart_Data();
|
||
|
||
//UART_Send_Char(0xcc);
|
||
}
|
||
}
|
||
|
||
#define CRC_PRESET 0xFFFF
|
||
#define CRC_POLYNOM 0x4204
|
||
/*---------------------------------------------------------------------------
|
||
调用方式:unsigned int ModbusCRC16(unsigned char *data_value, unsigned char length)
|
||
函数说明:CRC校验
|
||
---------------------------------------------------------------------------*/
|
||
unsigned int ModbusCRC16(unsigned char *data_value, unsigned char length)
|
||
{
|
||
unsigned int crc_value = CRC_PRESET;
|
||
unsigned char i;
|
||
data_value++;
|
||
while(length-- != 0)
|
||
{//ModbusCRC16(PData, Num + FIXED_LEN - 3);
|
||
for(i = 0x01; i != 0; i <<= 1)
|
||
{
|
||
if((crc_value & 0x0001) != 0)
|
||
{
|
||
crc_value >>= 1;
|
||
crc_value ^= CRC_POLYNOM;
|
||
}
|
||
else
|
||
{
|
||
crc_value >>= 1;
|
||
}
|
||
|
||
if((*data_value & i) != 0)
|
||
{
|
||
crc_value ^= CRC_POLYNOM;
|
||
}
|
||
}
|
||
data_value++;
|
||
}
|
||
return(crc_value);
|
||
}
|
||
|
||
|
||
|
||
//发送延时
|
||
void Uart_Send_Delay(unsigned int delay)
|
||
{
|
||
unsigned int i = 0, j = 0;
|
||
|
||
for(i = 0; i < delay; i++)
|
||
{
|
||
for(j = 0; j < 125; j++);
|
||
}
|
||
}
|
||
|
||
//校验 + 0X1B
|
||
#define VERFIY_TYPE 0
|
||
|
||
/*
|
||
SOF: 1个字节 0x05 起始字节
|
||
Len: 2个字节 长度
|
||
Fou_adr: 2个字节 源地址
|
||
Com_adr: 2个字节 目标地址,0ff为广播地址
|
||
Cmd16: 2个字节 命令字
|
||
Request-data: N字节 数据
|
||
XOR: 2个字节 校验
|
||
END: 0x1B 结束字节
|
||
*/
|
||
|
||
//发送数据
|
||
void send_set_resp(unsigned int OrderNum, unsigned int addr, unsigned char Num, unsigned char sData[])
|
||
{
|
||
unsigned int xor_data = 0;
|
||
unsigned char PData[TTL_SEND_BUFF_LEN];
|
||
unsigned char i = 0;
|
||
|
||
PData[0] = UART_ORDER_SOF; //第一个字节
|
||
PData[1] = (Num + FIXED_LEN) / 0x100; //长度 高8位
|
||
PData[2] = (Num + FIXED_LEN) % 0x100; //长度 低8位
|
||
PData[3] = (addr >> 8) & 0xff; //源地址
|
||
PData[4] = addr & 0xff; //源地址
|
||
PData[5] = (SUR_DEVICE_ADDR >> 8) & 0xff; //目标地址
|
||
PData[6] = SUR_DEVICE_ADDR & 0xff; //目标地址
|
||
PData[7] = (OrderNum >> 8) & 0xff; //命令字 -1
|
||
PData[8] = OrderNum & 0xff; //命令字 -2
|
||
|
||
// PData[6] = RW_Flag; //读写标志
|
||
|
||
for(i = 0; i < Num; i++) //发送数据
|
||
{
|
||
PData[FIXED_LEN - 2 + i] = sData[i]; //数据
|
||
}
|
||
|
||
//校验
|
||
|
||
xor_data = ModbusCRC16(PData, Num + FIXED_LEN - 3);
|
||
PData[FIXED_LEN + Num - 2] = (xor_data) & 0xff;
|
||
PData[FIXED_LEN + Num - 1] = (xor_data >> 8) & 0xff;
|
||
|
||
PData[FIXED_LEN + Num] = UART_ORDER_END; // 末尾字节
|
||
|
||
//全部发送
|
||
for(i = 0; i < (Num + FIXED_LEN + 1); i++) //一次性发送所有数据
|
||
{
|
||
UART1_Send_Char(PData[i]);
|
||
//增加延时
|
||
Uart_Send_Delay(50);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//分析地址是否为本地址
|
||
unsigned char Check_Resive_Addr(unsigned short addr)
|
||
{
|
||
//确定是否为接收地址
|
||
if((OBJ_DEVICE_ADDR == addr) || (0xFFFF == addr) || (0x0000 == addr) || (0x00B1 == addr))
|
||
{
|
||
return 1;
|
||
}
|
||
else
|
||
{
|
||
InitUart_Data(); //2清数据
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
|
||
//接收数据判断(放置串口接收数据内)
|
||
void Do_Receive_Uart_For_Module(unsigned char ch)
|
||
{
|
||
switch(re_status)
|
||
{
|
||
case 0 : //0x05 1字节 起始字
|
||
{
|
||
if(ch == UART_ORDER_SOF)
|
||
{
|
||
EXTI->IMR &= ~(EXTI_Line6); //关闭了指定的外部中断
|
||
//EXTI_CTRL(0);
|
||
rec_len = 0;
|
||
ttl_receive_buff[rec_len] = ch;
|
||
re_status = 1;
|
||
shouldaccept = 0;
|
||
// UART2_Send_Char(0xaa);
|
||
}
|
||
}
|
||
break;
|
||
case 1: //长度 2字节
|
||
{
|
||
rec_len++;
|
||
ttl_receive_buff[rec_len] = ch;
|
||
|
||
if(rec_len >= 2)
|
||
{
|
||
re_status = 2;
|
||
shouldaccept = ttl_receive_buff[1] * 0x100 + ttl_receive_buff[2];
|
||
|
||
if(shouldaccept >= TTL_RECEIVE_BUFF_LEN - 1)
|
||
{
|
||
InitUart_Data();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case 2: //命令字 2个字节 05 00 0B 00 C1 00 A1 F0 01 87 1B
|
||
{
|
||
rec_len++;
|
||
|
||
if(rec_len >= TTL_RECEIVE_BUFF_LEN - 1)
|
||
{
|
||
InitUart_Data();
|
||
return;
|
||
}
|
||
|
||
ttl_receive_buff[rec_len] = ch; //接收
|
||
|
||
if(rec_len >= shouldaccept) //判断是否接收完成
|
||
{
|
||
|
||
int adr = ttl_receive_buff[5];
|
||
adr = adr << 8;
|
||
adr |= ttl_receive_buff[6];
|
||
if(Check_Resive_Addr(adr))
|
||
{
|
||
//命令字
|
||
unsigned int order = 0;
|
||
order = ttl_receive_buff[7];
|
||
order = order << 8;
|
||
order += ttl_receive_buff[8];
|
||
switch(order)
|
||
{
|
||
//=================== ===================================================
|
||
//设备接收数据
|
||
//======================================================================
|
||
case 0xF001 : //位移模式
|
||
{
|
||
order_flag = 1;
|
||
}
|
||
break;
|
||
|
||
case 0xF002 : //时间测试
|
||
{
|
||
order_flag = 2;
|
||
}
|
||
break;
|
||
|
||
//======================================================================
|
||
//设备信息
|
||
//======================================================================
|
||
case 0xF003 : //频率测试
|
||
{
|
||
order_flag = 3;
|
||
// UART2_Send_Char(0x33);
|
||
}
|
||
break;
|
||
|
||
//======================================================================
|
||
//设备信息
|
||
//======================================================================
|
||
case 0xF004 : //置零
|
||
{
|
||
order_flag = 4;
|
||
}
|
||
break;
|
||
case 0xF005 : //安全栅开关
|
||
{
|
||
order_flag = 5;
|
||
}
|
||
break;
|
||
|
||
//======================================================================
|
||
//
|
||
//======================================================================
|
||
default :
|
||
{
|
||
InitUart_Data();
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
InitUart_Data();
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
|
||
default :
|
||
InitUart_Data();
|
||
break;
|
||
}
|
||
}
|
||
|
||
//数据长度
|
||
unsigned char Get_Data_Len(void)
|
||
{
|
||
uint16_t Re_Len = 0;
|
||
Re_Len = (ttl_receive_buff[1] * 0x100 + ttl_receive_buff[2]) - FIXED_LEN;
|
||
return Re_Len;
|
||
}
|
||
|
||
//检查校验
|
||
unsigned char Check_VerfiyData(void)
|
||
{
|
||
// return 1; //调试期间,不用验证
|
||
// unsigned int CRC16 = 0;
|
||
// unsigned int Get_CRC16 = 0;
|
||
// CRC16 = ttl_receive_buff[shouldaccept];
|
||
// CRC16 = CRC16 << 8;
|
||
// CRC16 += ttl_receive_buff[shouldaccept - 1];
|
||
|
||
// Get_CRC16 = ModbusCRC16(ttl_receive_buff, shouldaccept - 2);
|
||
|
||
// if(CRC16 == Get_CRC16) //数据的完整性
|
||
// {
|
||
|
||
// }
|
||
// else
|
||
// {
|
||
// InitUart_Data();
|
||
// return 0;
|
||
// }
|
||
//
|
||
|
||
return 1;
|
||
}
|
||
|
||
|
||
|
||
|
||
//数据接收分析(放置大循环内)
|
||
void Deal_Uart_Data_For_Module(void)
|
||
{
|
||
if(order_flag) //有接收的指令
|
||
{
|
||
//校验
|
||
if(Check_VerfiyData() == 1) //测试
|
||
{
|
||
switch(order_flag)
|
||
{
|
||
//--------------------------------------------------------------------
|
||
//
|
||
//--------------------------------------------------------------------
|
||
case 1 : //数据解析
|
||
{
|
||
GPIO_SetBits(GPIOF,GPIO_Pin_11);
|
||
zero_flag = 2; //停止置零
|
||
uint8_t i = 0; //临时变量
|
||
uint8_t len = 0; //长度
|
||
uint8_t temp[DATA_LEN];
|
||
|
||
//发送标志
|
||
send_flag = 0;
|
||
|
||
//数据长度
|
||
len = Get_Data_Len();
|
||
|
||
//解析数据
|
||
for(i = 0; i < len; i++)
|
||
{
|
||
temp[i] = ttl_receive_buff[i + FIXED_LEN - 2];
|
||
}
|
||
|
||
//角行程 、直行程
|
||
// Travle_Flag = temp[0]; //0 直 1 角
|
||
Motor_Run = temp[0]; //0 停止 1 运行 2 运行到近点 3 运行到远点
|
||
Run_Mode = temp[1]; //0 点动 1 自动 2 回差 3 重复十次
|
||
Run_Dir = temp[2]; //0 正转 1 反转
|
||
|
||
Run_Step = temp[3]; //电机运行多少圈为一个步长
|
||
Run_Step <<= 8;
|
||
Run_Step += temp[4];
|
||
|
||
Run_Inter = temp[5]; //电机运行间隔时长
|
||
Run_Inter <<= 8;
|
||
Run_Inter += temp[6];
|
||
|
||
Set_Vol = temp[7]; //设定电压值
|
||
Set_Vol <<= 8;
|
||
Set_Vol += temp[8];
|
||
|
||
Mode_Flag = 1; //切换到模式1
|
||
EXTI->IMR &= ~(EXTI_Line6); //关闭了指定的外部中断
|
||
//EXTI_CTRL(0);
|
||
//ClrRunmotorStep();//清除电机标记
|
||
|
||
}
|
||
break;
|
||
|
||
case 2 : //
|
||
{
|
||
zero_flag = 2; //停止置零
|
||
Set_dis = ttl_receive_buff[FIXED_LEN - 2]; //距离值
|
||
dis = (float)Set_dis / 100.00f;
|
||
get_time_flag = 1; //时间测试开始标志
|
||
|
||
Mode_Flag = 2; //切换到模式2
|
||
EXTI->IMR &= ~(EXTI_Line6); //关闭了指定的外部中断
|
||
//EXTI_CTRL(0);
|
||
}
|
||
break;
|
||
|
||
//--------------------------------------------------------------------
|
||
//LED 控制
|
||
//--------------------------------------------------------------------
|
||
case 3 : //F111 05 00 0C 00 A1 00 C1 F1 01 05 03 50 87 1B
|
||
{
|
||
GPIO_SetBits(GPIOF,GPIO_Pin_11);
|
||
zero_flag = 2; //停止置零
|
||
//EXTI_CTRL(1);
|
||
EXTI->IMR |= EXTI_Line6; //开启指定的外部中断
|
||
Run_State = ttl_receive_buff[FIXED_LEN - 2]; //0 停止 1 运行
|
||
//电机转动速度
|
||
if(ttl_receive_buff[FIXED_LEN - 1] <= 0x64)
|
||
Speed = (110 + 80 * ttl_receive_buff[FIXED_LEN - 1]/100);//
|
||
else
|
||
Speed = 190;
|
||
Mode_Flag = 3; //切换到模式3
|
||
|
||
}
|
||
break;
|
||
|
||
//======================================================================
|
||
//
|
||
//======================================================================
|
||
case 4 : //
|
||
{
|
||
GPIO_SetBits(GPIOF,GPIO_Pin_11);
|
||
zero_flag = 0; //开启置零
|
||
Rate_dis = ttl_receive_buff[FIXED_LEN - 2]; //额定距离值
|
||
Mode_Flag = 1; //切换到模式1
|
||
EXTI->IMR &= ~(EXTI_Line6); //关闭了指定的外部中断
|
||
//EXTI_CTRL(0);
|
||
|
||
}
|
||
break;
|
||
|
||
//--------------------------------------------------------------------
|
||
//实时信息
|
||
//--------------------------------------------------------------------
|
||
case 5 : //
|
||
{
|
||
Mode_turn = ttl_receive_buff[FIXED_LEN - 2]; //切换标志
|
||
if(Mode_turn == 0)
|
||
{
|
||
GPIO_ResetBits(GPIOE,GPIO_Pin_14 | GPIO_Pin_13);//电流模式
|
||
}
|
||
else
|
||
{
|
||
GPIO_SetBits(GPIOE,GPIO_Pin_14 | GPIO_Pin_13);//安全栅模式
|
||
}
|
||
}
|
||
break;
|
||
case 6 : // 设置 地址 + 版本号 F1D3 05 00 0D 00 A1 00 00 F1 D3 00 C1 07 A9 1B
|
||
{
|
||
|
||
}
|
||
break;
|
||
case 7 : //更新程序
|
||
{
|
||
|
||
}
|
||
break;
|
||
|
||
//--------------------------------------------------------------------
|
||
//设备信息
|
||
//--------------------------------------------------------------------
|
||
case 10 : //F115 05 00 0A 00 C1 00 A1 F1 05 50 87 1B
|
||
{
|
||
|
||
|
||
}
|
||
break;
|
||
|
||
|
||
default :
|
||
{
|
||
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
//清空数据
|
||
InitUart_Data();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*********************************************END OF FILE**********************/
|