#include "usart.h"
#include "key.h"
#include "trigger.h"
#include "eeprom.h"
#include "smg.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_exti.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_dma.h"
#include <string.h>
#include <stdlib.h>
extern void save_settings(void);
// 添加全局变量
// DMA缓冲区定义
#define TX_BUFFER_SIZE 128
#define RX_BUFFER_SIZE 128
// 确保DMA缓冲区正确对齐
__attribute__((aligned(4))) uint8_t dma_rx_buffer[RX_BUFFER_SIZE];
__attribute__((aligned(4))) uint8_t dma_tx_buffer[TX_BUFFER_SIZE];
volatile uint8_t rx_buffer[RX_BUFFER_SIZE];
volatile uint16_t rx_index = 0;
volatile uint8_t rx_complete = 0;
uint8_t usart_rx_buffer[MAX_CMD_LEN];
volatile uint8_t usart_rx_index = 0;
volatile uint8_t usart_cmd_ready = 0;
// DMA缓冲区
uint8_t dma_rx_buffer[RX_BUFFER_SIZE];
uint8_t dma_tx_buffer[TX_BUFFER_SIZE];
volatile uint8_t dma_rx_complete = 0;
// 协议状态机
typedef enum {
PROTOCOL_IDLE,
PROTOCOL_BINARY,
PROTOCOL_STRING
} ProtocolState;
volatile ProtocolState protocol_state = PROTOCOL_IDLE;
// 初始化DMA
void USART_DMA_Init(void) {
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// 使能DMA时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
// 配置DMA接收通道
DMA_DeInit(DMA1_Channel5); // USART1_RX
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)dma_rx_buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = RX_BUFFER_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
// 配置DMA发送通道
DMA_DeInit(DMA1_Channel4); // USART1_TX
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);/*
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)dma_tx_buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = 0; // 初始无数据
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; // 正常模式
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
*/
// 使能DMA中断 (只开启传输完成中断)
DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
// 配置DMA接收中断
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; // 最高优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能DMA
USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
DMA_Cmd(DMA1_Channel5, ENABLE);
}
// DMA中断处理
void DMA1_Channel5_IRQHandler(void) {
if (DMA_GetITStatus(DMA1_IT_TC5)) {
DMA_ClearITPendingBit(DMA1_IT_TC5);
dma_rx_complete = 1;
}
}
// 处理DMA接收数据
void process_dma_data(void) {
uint16_t i , index;
// uint16_t data_length;
uint8_t ch;
static uint16_t last_position = 0;
uint16_t current_position, data_length;
if (!dma_rx_complete) return;
// 计算当前DMA位置
current_position = RX_BUFFER_SIZE - DMA_GetCurrDataCounter(DMA1_Channel5);
// 计算接收数据长度
if (current_position >= last_position) {
data_length = current_position - last_position;
} else {
// 处理缓冲区回绕
data_length = (RX_BUFFER_SIZE - last_position) + current_position;
}
// 处理接收到的数据
for ( i = 0; i < data_length; i++) {
index = (last_position + i) % RX_BUFFER_SIZE;
ch = dma_rx_buffer[index];
// 调试输出:将接收到的字符原样发送回去
USART_SendChar(USART1, ch); // 回显接收到的字符
switch (protocol_state) {
case PROTOCOL_IDLE:
if (ch == '$') {
protocol_state = PROTOCOL_BINARY;
usart_rx_index = 0;
usart_rx_buffer[usart_rx_index++] = ch;
} else if (ch >= ' ' && ch <= '~') { // 可打印字符
protocol_state = PROTOCOL_STRING;
rx_index = 0;
rx_buffer[rx_index++] = ch;
}
break;
case PROTOCOL_BINARY:
if (usart_rx_index < MAX_CMD_LEN) {
usart_rx_buffer[usart_rx_index++] = ch;
}
if (usart_rx_index >= 8) {
usart_cmd_ready = 1;
protocol_state = PROTOCOL_IDLE;
}
break;
case PROTOCOL_STRING:
if (rx_index < RX_BUFFER_SIZE - 1) {
rx_buffer[rx_index++] = ch;
if (ch == '\r' || ch == '\n') {
rx_buffer[rx_index] = '\0';
rx_complete = 1;
protocol_state = PROTOCOL_IDLE;
}
} else {
// 缓冲区溢出
rx_index = 0;
protocol_state = PROTOCOL_IDLE;
}
break;
}
}
last_position = current_position;
dma_rx_complete = 0;
}
void USART1_Init(unsigned long ulBaud){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//NVIC_InitTypeDef NVIC_InitStructure;
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
//配置USART1 TX引脚工作模式
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);
//配置USART1 RX引脚工作模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//串口1工作模式配置
USART_InitStructure.USART_BaudRate = ulBaud;
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;
USART_Init(USART1, &USART_InitStructure);
/*
// 使能接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
// 配置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
*/
USART_Cmd(USART1, ENABLE);
// USART_ClearFlag(USART1, USART_FLAG_TC);
// 初始化DMA
USART_DMA_Init();
}
// 使用DMA发送数据
void USART1_DMASend(uint8_t* data, uint16_t len) {
// 等待上一次传输完成
while (DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET);
// 禁用DMA通道
DMA_Cmd(DMA1_Channel4, DISABLE);
// 清除所有标志
DMA_ClearFlag(DMA1_FLAG_GL4 | DMA1_FLAG_TC4 | DMA1_FLAG_TE4 | DMA1_FLAG_HT4);
// 配置传输数据
DMA1_Channel4->CNDTR = len; // 设置传输长度
DMA1_Channel4->CMAR = (uint32_t)data; // 设置内存地址
// 重新使能DMA
DMA_Cmd(DMA1_Channel4, ENABLE);
// 使能USART DMA传输
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
}
// 中断处理函数简化
void USART1_IRQHandler(void) {
// 保持为空或仅处理发送完成中断
if (USART_GetITStatus(USART1, USART_IT_TC) != RESET) {
USART_ClearITPendingBit(USART1, USART_IT_TC);
}
}
// 添加辅助函数
uint8_t hex_char_to_value(uint8_t c) {
if (c >= '0' && c <= '9') return c - '0';
if (c >= 'A' && c <= 'F') return c - 'A' + 10;
if (c >= 'a' && c <= 'f') return c - 'a' + 10;
return 0;
}
uint8_t hex_to_byte(uint8_t high, uint8_t low) {
return (hex_char_to_value(high) << 4) | hex_char_to_value(low);
}
uint8_t calculate_xor(uint8_t* data, uint8_t len) {
uint8_t i;
uint8_t result = 0;
for (i = 0; i < len; i++) {
result ^= data[i];
}
return result;
}
/*
void USART1_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
uint8_t ch = USART_ReceiveData(USART1);
// USART_SendChar(USART1, ch); // 回显接收到的字符
if (ch == '$' || usart_rx_index > 0) {
if (ch == '$') {
usart_rx_index = 0;
}
usart_rx_buffer[usart_rx_index] = ch;
usart_rx_index++;
// 检查是否收到完整命令 (8字节)
if (usart_rx_index >= 8) {
usart_cmd_ready = 1;
usart_rx_index = 0;
}
}
// 新增字符串协议处理
if (rx_index < RX_BUFFER_SIZE - 1) {
rx_buffer[rx_index] = ch;
rx_index++;
// 检测回车符作为结束标志
if (ch == '\r' || ch == '\n') {
rx_complete = 1;
rx_buffer[rx_index] = '\0'; // 添加字符串终结符
}
} else {
// 缓冲区溢出处理
rx_index = 0;
}
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
}
*/
void USART1_SendResponse(uint8_t* data, uint8_t len) {
uint8_t i;
for (i = 0; i < len; i++) {
USART_SendChar(USART1, data[i]);
}
}
void send_success_response(void) {
uint8_t response[] = {'$', '\r', '\n'};
USART1_DMASend(response, sizeof(response));
}
void send_failure_response(void) {
uint8_t response[] = {'&', '\r', '\n'};
USART1_DMASend(response, sizeof(response));
}
void send_brightness_response(uint8_t channel, uint8_t brightness) {
uint8_t response[16];
uint8_t len = sprintf((char*)response, "$%c:%03d\r\n", channel, brightness);
USART1_DMASend(response, len);
}
void process_binary_command(void) {
// 在函数开头声明所有变量
uint8_t* cmd = usart_rx_buffer;
uint8_t received_checksum, calculated_checksum;
uint8_t command, channel, data;
uint8_t param_high ,param_low,param_value;
int i;
if (!usart_cmd_ready) return;
received_checksum = hex_to_byte(cmd[6], cmd[7]); // 正确位置
// 计算前6字节的校验和($32038)
calculated_checksum = 0;
for (i = 0; i < 6; i++) {
calculated_checksum ^= cmd[i];
}
// 验证校验和
if (received_checksum != calculated_checksum) {
send_failure_response();
usart_cmd_ready = 0;
return;
}
command = cmd[1];
channel = cmd[2];
param_high = cmd[4]; // 参数高位ASCII
param_low = cmd[5]; // 参数低位ASCII
param_value = hex_char_to_value(param_high) << 4 |
hex_char_to_value(param_low);
// 处理命令
switch (command) {
case '1': // 打开通道
if (channel == '1') {
h1_state = H1_ON;
TIM_SetCompare1(TIM4, target_brightness);
// current_mode = BRIGHTNESS_MODE_L1;
} else if (channel == '2') {
h2_state = H2_ON;
TIM_SetCompare2(TIM4, target_brightness_2);//TIM_SetCompare2(TIM4, gamma_table[target_brightness_2]);
// current_mode = BRIGHTNESS_MODE_L2;
}else if (channel == '3') {
h3_state = H3_ON;
TIM_SetCompare3(TIM4, target_brightness_3);
// current_mode = BRIGHTNESS_MODE_L3;
}else if (channel == '4') {
h4_state = H4_ON;
TIM_SetCompare4(TIM4, target_brightness_4);
// current_mode = BRIGHTNESS_MODE_L4;
}else send_failure_response();
send_success_response();
break;
case '2': // 关闭通道
if (channel == '1') {
h1_state = H1_OFF;
TIM_SetCompare1(TIM4, 0);
} else if (channel == '2') {
h2_state = H2_OFF;
TIM_SetCompare2(TIM4, 0);
}else if (channel == '3') {
h3_state = H3_OFF;
TIM_SetCompare3(TIM4, 0);
}else if (channel == '4') {
h4_state = H4_OFF;
TIM_SetCompare4(TIM4, 0);
}else send_failure_response();
send_success_response();
break;
case '3': // 设置亮度
if (channel == '1') {
target_brightness = param_value;
if (h1_state == H1_ON) {
TIM_SetCompare1(TIM4, target_brightness);
// current_mode = BRIGHTNESS_MODE_L1;
}
} else if (channel == '2') {
target_brightness_2 = param_value;
if (h2_state == H2_ON) {
TIM_SetCompare2(TIM4, target_brightness_2);
//current_mode = BRIGHTNESS_MODE_L2;
}
}else if (channel == '3') {
target_brightness_3 = param_value;
if (h3_state == H3_ON) {
TIM_SetCompare3(TIM4, target_brightness_3);
//current_mode = BRIGHTNESS_MODE_L3;
}
}else if (channel == '4') {
target_brightness_4 = param_value;
if (h4_state == H4_ON) {
TIM_SetCompare4(TIM4, target_brightness_4);
// current_mode = BRIGHTNESS_MODE_L4;
}
}else send_failure_response();
save_settings();
send_success_response();
break;
case '4': // 读取亮度
if (channel == '1') {
send_brightness_response('1', target_brightness);
} else if (channel == '2') {
send_brightness_response('2', target_brightness_2);
} else if (channel == '3') {
send_brightness_response('3', target_brightness_3);
}else if (channel == '4') {
send_brightness_response('4', target_brightness_4);
}else send_failure_response();
break;
case '7': // 触发频闪
if (channel == '1' ) {
if(h1_state == H1_MS_FLASH || h1_state == H1_US_FLASH)
trigger_controls[0].status = TRIGGER_ACTIVE;//trigger_state =1;
} else if (channel == '2') {
if(h2_state == H2_MS_FLASH ||h2_state == H2_US_FLASH )
trigger_controls[1].status = TRIGGER_ACTIVE;//trigger_state_2 =1;
}else if (channel == '3' ) {
if(h3_state == H3_MS_FLASH || h3_state == H3_US_FLASH )
trigger_controls[2].status = TRIGGER_ACTIVE;//trigger_state_3 =1;
}else if (channel == '4' ) {
if(h4_state == H4_MS_FLASH || h4_state == H4_US_FLASH )
trigger_controls[3].status = TRIGGER_ACTIVE;//trigger_state_4 =1;
}else send_failure_response();
send_success_response();
break;
case '8': // 设置输出模式
if (channel == '1') {
data=param_value;
h1_state = (H1State)(data % 4);
// 根据新状态更新输出
switch (h1_state) {
case H1_OFF: TIM_SetCompare1(TIM4, 0); //current_mode = BRIGHTNESS_MODE_1H;
break;
case H1_ON: TIM_SetCompare1(TIM4, target_brightness);//current_mode = BRIGHTNESS_MODE_L1;
break;
case H1_MS_FLASH:
case H1_US_FLASH:
TIM_SetCompare1(TIM4, 0);//current_mode = BRIGHTNESS_MODE_1U;
break;
default: break;
}
} else if (channel == '2') {
data=param_value;
h2_state = (H2State)(data % 4);
switch (h2_state) {
case H2_OFF: TIM_SetCompare2(TIM4, 0); //current_mode = BRIGHTNESS_MODE_2H;
break;
case H2_ON: TIM_SetCompare2(TIM4, target_brightness_2); //current_mode = BRIGHTNESS_MODE_L2;
break;
case H2_MS_FLASH:
case H2_US_FLASH:
TIM_SetCompare2(TIM4, 0);//current_mode = BRIGHTNESS_MODE_2U;
break;
default: break;
}
}else if (channel == '3') {
data=param_value;
h3_state = (H3State)(data % 4);
switch (h3_state) {
case H3_OFF: TIM_SetCompare3(TIM4, 0);// current_mode = BRIGHTNESS_MODE_3H;
break;
case H3_ON: TIM_SetCompare3(TIM4, target_brightness_3);//current_mode = BRIGHTNESS_MODE_L3;
break;
case H3_MS_FLASH:
case H3_US_FLASH:
TIM_SetCompare3(TIM4, 0);//current_mode = BRIGHTNESS_MODE_3U;
break;
default: break;
}
}else if (channel == '4') {
data=param_value;
h4_state = (H4State)(data % 4);
switch (h4_state) {
case H4_OFF: TIM_SetCompare4(TIM4, 0); //current_mode = BRIGHTNESS_MODE_4H;
break;
case H4_ON: TIM_SetCompare4(TIM4,target_brightness_4);//current_mode = BRIGHTNESS_MODE_L4;
break;
case H4_MS_FLASH:
case H4_US_FLASH:
TIM_SetCompare4(TIM4, 0);//current_mode = BRIGHTNESS_MODE_4U;
break;
default: break;
}
}else send_failure_response();
save_settings();
send_success_response();
break;
case '9': // 设置频闪时间
if (channel == '1') {
if (h1_state == H1_MS_FLASH) flash_time = param_value;
else if (h1_state == H1_US_FLASH) flash_time = param_value;
// current_mode = E1_MODE;
} else if (channel == '2') {
if (h2_state == H2_MS_FLASH) flash_time_2 = param_value;
else if (h2_state == H2_US_FLASH) flash_time_2 = param_value;
// current_mode = E2_MODE;
}else if (channel == '3') {
if (h3_state == H3_MS_FLASH) flash_time_3 = param_value;
else if (h3_state == H3_US_FLASH) flash_time_3 = param_value;
// current_mode = E3_MODE;
}else if (channel == '4') {
if (h4_state == H4_MS_FLASH) flash_time_4 = param_value;
else if (h4_state == H4_US_FLASH) flash_time_4 = param_value;
//current_mode = E4_MODE;
}else send_failure_response();
save_settings();
send_success_response();
break;
default:
send_failure_response();
break;
}
usart_cmd_ready = 0;
}
void send_response(const char *response) {
USART_SendString(USART1, (uint8_t*)response);
USART_SendData(USART1, '\r');
USART_SendData(USART1, '\n');
}
void process_string_command(void) {
char *token = NULL;
int channel = 0;
int brightness = 0;
if (!rx_complete) return;
token = strtok((char*)(uint32_t)rx_buffer, ",");// token = strtok(rx_buffer, ",");
if (token == NULL) {
rx_index = 0;
rx_complete = 0;
return;
}
// 检查命令前缀
if (strcmp(token, "set") != 0) {
// send_response("error: invalid command");
rx_index = 0;
rx_complete = 0;
return;
}
// 获取子命令
token = strtok(NULL, ",");
if (token == NULL) {
send_response("error: missing subcommand");
rx_index = 0;
rx_complete = 0;
return;
}
// 处理不同子命令
if (strcmp(token, "step") == 0) {
// set,step,x,y
token = strtok(NULL, ",");
if (token == NULL) {
send_response("error: missing channel");
goto cleanup;
}
channel = atoi(token);
token = strtok(NULL, ",");
if (token == NULL) {
send_response("error: missing brightness");
goto cleanup;
}
brightness = atoi(token);
if (channel < 1 || channel > 4 || brightness < 0 || brightness > 255) {
send_response("error: invalid parameter");
goto cleanup;
}
// 设置指定通道亮度
switch (channel) {
case 1:
target_brightness = brightness;
TIM_SetCompare1(TIM4, gamma_table[target_brightness]);
h1_state = H1_ON;
break;
case 2:
target_brightness_2 = brightness;
TIM_SetCompare2(TIM4, gamma_table[target_brightness_2]);
h2_state = H2_ON;
break;
case 3:
target_brightness_3 = brightness;
TIM_SetCompare3(TIM4, gamma_table[target_brightness_3]);
h3_state = H3_ON;
break;
case 4:
target_brightness_4 = brightness;
TIM_SetCompare4(TIM4, gamma_table[target_brightness_4]);
h4_state = H4_ON;
break;
}
send_response("set,step,ok");
} else if (strcmp(token, "stepall") == 0) {
// set,stepall,x
token = strtok(NULL, ",");
if (token == NULL) {
send_response("error: missing brightness");
goto cleanup;
}
brightness = atoi(token);
if (brightness < 0 || brightness > 255) {
send_response("error: invalid brightness");
goto cleanup;
}
// 设置所有通道亮度
target_brightness = brightness;
target_brightness_2 = brightness;
target_brightness_3 = brightness;
target_brightness_4 = brightness;
TIM_SetCompare1(TIM4, gamma_table[target_brightness]);
TIM_SetCompare2(TIM4, gamma_table[target_brightness_2]);
TIM_SetCompare3(TIM4, gamma_table[target_brightness_3]);
TIM_SetCompare4(TIM4, gamma_table[target_brightness_4]);
h1_state = H1_ON;
h2_state = H2_ON;
h3_state = H3_ON;
h4_state = H4_ON;
send_response("set,stepall,ok");
} else if (strcmp(token, "on") == 0) {
// set,on,x
token = strtok(NULL, ",");
if (token == NULL) {
send_response("error: missing channel");
goto cleanup;
}
channel = atoi(token);
if (channel < 1 || channel > 4) {
send_response("error: invalid channel");
goto cleanup;
}
// 打开指定通道
switch (channel) {
case 1:
TIM_SetCompare1(TIM4, gamma_table[target_brightness]);
h1_state = H1_ON;
break;
case 2:
TIM_SetCompare2(TIM4, gamma_table[target_brightness_2]);
h2_state = H2_ON;
break;
case 3:
TIM_SetCompare3(TIM4, gamma_table[target_brightness_3]);
h3_state = H3_ON;
break;
case 4:
TIM_SetCompare4(TIM4, gamma_table[target_brightness_4]);
h4_state = H4_ON;
break;
}
send_response("set,on,ok");
} else if (strcmp(token, "off") == 0) {
// set,off,x
token = strtok(NULL, ",");
if (token == NULL) {
send_response("error: missing channel");
goto cleanup;
}
channel = atoi(token);
if (channel < 1 || channel > 4) {
send_response("error: invalid channel");
goto cleanup;
}
// 关闭指定通道
switch (channel) {
case 1:
TIM_SetCompare1(TIM4, 0);
h1_state = H1_OFF;
break;
case 2:
TIM_SetCompare2(TIM4, 0);
h2_state = H2_OFF;
break;
case 3:
TIM_SetCompare3(TIM4, 0);
h3_state = H3_OFF;
break;
case 4:
TIM_SetCompare4(TIM4, 0);
h4_state = H4_OFF;
break;
}
send_response("set,off,ok");
} else if (strcmp(token, "allon") == 0) {
// 打开所有通道
TIM_SetCompare1(TIM4, gamma_table[target_brightness]);
TIM_SetCompare2(TIM4, gamma_table[target_brightness_2]);
TIM_SetCompare3(TIM4, gamma_table[target_brightness_3]);
TIM_SetCompare4(TIM4, gamma_table[target_brightness_4]);
h1_state = H1_ON;
h2_state = H2_ON;
h3_state = H3_ON;
h4_state = H4_ON;
send_response("set,allon,ok");
} else if (strcmp(token, "alloff") == 0) {
// 关闭所有通道
TIM_SetCompare1(TIM4, 0);
TIM_SetCompare2(TIM4, 0);
TIM_SetCompare3(TIM4, 0);
TIM_SetCompare4(TIM4, 0);
h1_state = H1_OFF;
h2_state = H2_OFF;
h3_state = H3_OFF;
h4_state = H4_OFF;
send_response("set,alloff,ok");
} else {
send_response("error: unknown command");
}
cleanup:
rx_index = 0;
rx_complete = 0;
}
void process_uart_command(void) {
// 先处理DMA接收的数据
process_dma_data();
// 处理各种协议命令
process_binary_command();
process_string_command();
}
void USART2_Init(unsigned long ulBaud){
GPIO_InitTypeDef GPIO_InitStruct;//定义结构体(GPIO,USART,NVIC)
USART_InitTypeDef USART_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
// 允许GPIOA和USART2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
// PA2-TX2复用推挽输出(端口配置)
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// PA3-TX2浮空输入(复位状态,可以省略)
//GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
//GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//GPIO_Init(GPIOA, &GPIO_InitStruct);
// 初始化USART2(波特率ulBaud,允许Rx和Tx,默认8个数据位,1个停止位,无校验)
USART_InitStruct.USART_BaudRate = ulBaud;//波特率
USART_InitStruct.USART_WordLength = USART_WordLength_8b;//数据位
USART_InitStruct.USART_StopBits = USART_StopBits_1;//停止位
USART_InitStruct.USART_Parity = USART_Parity_No;//(校验位:无)
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//设置收发模式
USART_InitStruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None;//硬件流控制:无
USART_Init(USART2, &USART_InitStruct);//串口2初始化
USART_Cmd(USART2, ENABLE);//使能USART2
USART_ClearFlag(USART2,USART_FLAG_TC);//清除发送完成标志
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//开启USART2接受中断
NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;//主优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;//子优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//中断使能
NVIC_Init(&NVIC_InitStruct);//中断初始化
}
// 发送字符
unsigned char USART_SendChar(USART_TypeDef* USARTx, unsigned char ucChar){
while(!USART_GetFlagStatus(USARTx, USART_FLAG_TXE));
USART_SendData(USARTx, ucChar);
return ucChar;
}
// 发送字符串
void USART_SendString(USART_TypeDef* USARTx, unsigned char* pucStr){
while(*pucStr != '\0')
USART_SendChar(USARTx, *pucStr++);
}
// 非阻塞接收字符
unsigned char USART_ReceiveChar_NonBlocking(USART_TypeDef* USARTx){
if(USART_GetFlagStatus(USARTx, USART_FLAG_RXNE))
return USART_ReceiveData(USARTx);
else
return 0;
}
#define uart1 //注释掉该宏使用uart2
#ifdef uart1
//printf调用函数(使用MicroLIB)
int fputc(int ch, FILE *f)
{
return(USART_SendChar(USART1, ch));
}
#else
// printf调用函数(使用MicroLIB)
int fputc(int ch, FILE *f)
{
return(USART_SendChar(USART2, ch));
}
#endif
检查该代码不能实现通信功能的原因,并给出正确的代码
最新发布