ZNKT-ST-M/BSP/Src/Usart.c
2025-01-15 16:02:53 +08:00

211 lines
5.2 KiB
C

#include "Usart.h"
#include "Include.h"
#include "string.h"
#include "user_queue.h"
#include "Timer.h"
uint16_t Usart1_ucRx_length = 0;//串口1接收长度
uint8_t usart1_rx_done = 0;//串口1接收完成标志
uint8_t Usart1_Rx_Buf[USART1_RX_BUFFER_SIZE]={0};//串口1接收数据
device_state_t device[MAX_SLAVE_NUMBER];//8个设备的状态、控制结构体
extern uint16_t usRec_Length; //网口接收数据长度
extern uint8_t ucRec_Buffer[1024*10]; //网口接收数据缓存
uint8_t usart1_tx_done = 0;//串口1发送完成标志
//BLE_USART_TX_e A9UsartTxState_e = A9_USART_TX_IDLE;
void ble_usart_init(uint32_t baudrate)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHB1PeriphClockCmd(BLE_USART_GPIO_CLK, ENABLE);
RCC_APB2PeriphClockCmd(BLE_USART_CLK, ENABLE);
GPIO_PinAFConfig(BLE_USART_GPIO_PORT, BLE_USART_TX_PinSource, BLE_GPIO_AF_USART);
GPIO_PinAFConfig(BLE_USART_GPIO_PORT, BLE_USART_RX_PinSource, BLE_GPIO_AF_USART);
GPIO_InitStructure.GPIO_Pin = BLE_USART_TX_GPIO_PIN | BLE_USART_RX_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度 50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(BLE_USART_GPIO_PORT, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式
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; //收发模式
USART_Init(BLE_USART, &USART_InitStructure); //初始化串口
NVIC_InitStructure.NVIC_IRQChannel = BLE_NVIC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 6;//抢占优先级 6
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(BLE_USART, USART_IT_RXNE, ENABLE);//开启中断
USART_ITConfig(BLE_USART, USART_IT_IDLE, ENABLE);//开启空闲中断
USART_Cmd(BLE_USART, ENABLE); //使能串口
}
void USART1_IRQHandler(void)
{
uint8_t temp;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
if(Usart1_ucRx_length >= USART1_RX_BUFFER_SIZE)
{
Usart1_ucRx_length = 0;
}
Usart1_Rx_Buf[Usart1_ucRx_length++] = USART_ReceiveData(USART1);
USART_ClearFlag(USART1, USART_IT_RXNE);
}
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
temp = USART1 ->SR;
temp = USART1 ->DR;
// ble_usart_send(Usart1_Rx_Buf, Usart1_ucRx_length);
// Usart1_ucRx_length = 0;
usart1_rx_done = 1;
}
}
//void ble_usart_send(uint8_t *ucpTx_Data,uint8_t ucTx_length)
//{
// uint8_t i;
// for(i=0;i<ucTx_length;i++)
// {
// USART_SendData(USART1,*(ucpTx_Data+i));
// while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
// }
//
//}
uint8_t ble_usart_send(uint8_t ucTx_length)
{
uint8_t i,temp;
uint8_t ucpTx_Data[ucTx_length];
OutQueue(&queue,&ucpTx_Data[0],ucTx_length);//出队
for(i=0;i<ucTx_length;i++)
{
USART_SendData(USART1,ucpTx_Data[i]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
}
return 2;
}
void net_received_data_analysis(void)
{
//通过串口发送至52832
// ble_usart_send(ucRec_Buffer, usRec_Length);
if(Analysis_data())//解析
{
if(EnterQueue(&queue,ucRec_Buffer,usRec_Length))//入队
{
}
}
if(tim_flag)//定时50ms之后发送
{
tim_flag = 0;
if(!IsEmptyQueue(&queue))
{
ble_usart_send(usRec_Length); //通过串口发送至52832
}
}
}
void parameters_init(void)
{
uint8_t i, j;
for(i = 0; i < MAX_SLAVE_NUMBER; i++)
{
device[i].channel1.EMG_data_mode = RMS_Data;
device[i].channel1.mode = ChannelModeAcquisition;
device[i].channel1.rate = AcquisitionRate4K;
device[i].channel1.state = TurnOff;
device[i].channel2.EMG_data_mode = RMS_Data;
device[i].channel2.mode = ChannelModeAcquisition;
device[i].channel2.rate = AcquisitionRate4K;
device[i].channel2.state = TurnOff;
device[i].output_current_mA = 0;
device[i].preinstall_state = TurnOff;
device[i].stimulate_state = TurnOff;
device[i].slice_state = SliceConnect;
device[i].slice_detect_state = TurnOff;
device[i].formwave_state = IdleState;
for(j = 0; j < MAC_ADDRESS_LENGTH; j++)
{
device[i].mac_address[j] = 0x00;
}
device[i].connection_state = BLE_Disconnect;
device[i].adapter_state = BatterySupply;
device[i].electric_quantity = 100;
device[i].reset_flag = Reset;
device[i].frequency_Hz = 0;
device[i].width_us = 0;
device[i].climb_time_ms = 0;
device[i].keep_time_ms = 0;
device[i].down_time_ms = 0;
device[i].rest_time_ms = 0;
}
}
uint8_t Analysis_data()
{
uint8_t bcc=0,i=0,bcc1=0,j=0;
while(ucRec_Buffer[i] != 0xAA)
{
i++;
if(i >= usRec_Length)
{
return 0;
}
}
bcc = ucRec_Buffer[ucRec_Buffer[++i]+2];//校验位 此时队首到了帧长的位置
for(j=2;j<ucRec_Buffer[i]+2;j++)
{
bcc1+=ucRec_Buffer[j] ;
}
if(bcc != bcc1)//判断校验
{
return 0;
}
if(ucRec_Buffer[ucRec_Buffer[i]+3]!=0x55)//判断帧尾
{
return 0;
}
return 1;
}