[feat] add addr and baudrate setting

This commit is contained in:
zhji 2024-07-14 18:44:05 +08:00
parent e743e09fbe
commit 9261aaa842
5 changed files with 42 additions and 14 deletions

View File

@ -31,7 +31,7 @@ void system_init(void)
led_init();
system_tick_init();
// lcd_init();
rs485_init();
// rs485_init();
dwin_init();
}

View File

@ -4,6 +4,7 @@
#include "stm32f4xx_dma.h"
#include "lark1s.h"
#include "dwin.h"
#include "rs485.h"
#define DWIN_TX_STREAM DMA1_Stream6
#define DWIN_RX_STREAM DMA1_Stream5
@ -11,6 +12,7 @@
#define DWIN_BUFF_RX_LEN (4096)
uint8_t dwin_buff_tx[DWIN_BUFF_TX_LEN] __attribute__((aligned(16)));
uint8_t dwin_buff_rx[DWIN_BUFF_RX_LEN] __attribute__((aligned(16)));
static int __attribute__((section(".bss_ccm"))) sm = 0;
extern uint32_t system_tick_cnt;
@ -105,10 +107,29 @@ static void dwin_endian_reverse_2byte(uint8_t *buffer, uint16_t val)
buffer[1] = (uint8_t)(val & 0xFF);
}
void dwin_rx_parse(uint8_t *buffer, uint16_t len)
{
uint32_t baudrate;
uint8_t *p = buffer;
sm++;
if (sm > 1) {
sm = 0;
}
if (p[0] != 0x5A || p[1] != 0xA5 || p[2] != 0x12 || p[3] != 0x83 || p[4] != 0x51 || p[5] != 0x00 || p[6] != 0x07) {
return;
}
rs485_mb_addr = p[16];
baudrate = (uint32_t)p[20];
baudrate |= (uint32_t)p[19] << 8;
baudrate |= (uint32_t)p[18] << 16;
baudrate |= (uint32_t)p[17] << 24;
rs485_baudrate = baudrate;
}
void dwin_loop(void)
{
static uint32_t ms = 0;
static int flag = 0;
uint16_t len;
uint16_t i;
@ -117,7 +138,7 @@ void dwin_loop(void)
}
ms = system_tick_cnt;
len = 0;
if (flag == 0) {
if (sm == 0) {
/* read control data */
dwin_buff_tx[len++] = 0x5A;
dwin_buff_tx[len++] = 0xA5; /* frame head */
@ -222,7 +243,6 @@ void dwin_loop(void)
len += 4;
}
dwin_send(len);
flag++;
}
void USART2_IRQHandler(void)
@ -249,9 +269,6 @@ void USART2_IRQHandler(void)
DMA_ClearFlag(DWIN_RX_STREAM, DMA_FLAG_TCIF5 | DMA_FLAG_HTIF5 | DMA_FLAG_TEIF5 | DMA_FLAG_DMEIF5 | DMA_FLAG_FEIF5);
len = DMA_GetCurrDataCounter(DWIN_RX_STREAM);
len = DWIN_BUFF_RX_LEN - len;
for (uint16_t i = 0; i < len; i++) {
dwin_buff_tx[i] = dwin_buff_rx[i] + 1;
}
dwin_send(len);
dwin_rx_parse(dwin_buff_rx, len);
}
}

View File

@ -14,7 +14,7 @@
#define DWIN_DATA_DISP_ADDR (0x5000)
#define DWIN_DATA_DISP_LENG (0x38)
#define DWIN_DATA_DISP_LENG (0x3A)
#define DWIN_DATA_CTRL_ADDR (0x5100)
#define DWIN_DATA_CTRL_LENG (0x07)

View File

@ -13,6 +13,8 @@
uint8_t rs485_buff_tx[RS485_BUFF_TX_LEN] __attribute__((aligned(16)));
uint8_t rs485_buff_rx[RS485_BUFF_RX_LEN] __attribute__((aligned(16)));
static int __attribute__((section(".bss_ccm"))) sm = 0;
uint32_t rs485_baudrate __attribute__((section(".bss_ccm"))) = 19200;
uint8_t rs485_mb_addr __attribute__((section(".bss_ccm"))) = 1;
char sn[16] __attribute__((section(".bss_ccm")));
struct lark1s_gas_info_s lark1s_gas_info __attribute__((section(".bss_ccm")));
@ -62,7 +64,7 @@ void rs485_init(void)
USART_DeInit(USART3);
USART_OverSampling8Cmd(USART3, ENABLE);
USART_InitStructure.USART_BaudRate = RS485_BAUDRATE;
USART_InitStructure.USART_BaudRate = rs485_baudrate;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
@ -107,12 +109,11 @@ void rs485_init(void)
USART_ReceiveData(USART3);
USART_ClearITPendingBit(USART3, USART_IT_IDLE);
USART_ClearITPendingBit(USART3, USART_IT_TC);
// rs485_send(15);
}
void rs485_send(uint16_t len)
{
USART_ITConfig(USART3, USART_IT_IDLE, DISABLE);
rs485_mode_tx();
DMA_SetCurrDataCounter(RS485_TX_STREAM, len);
DMA_Cmd(RS485_TX_STREAM, ENABLE);
@ -157,11 +158,21 @@ void rs485_state_machine_rx(int len)
void rs485_loop(void)
{
static uint32_t ms = 0;
static uint32_t baudrate = 0;
static uint8_t addr = 0;
if (system_tick_cnt < (ms + 200)) {
return;
}
ms = system_tick_cnt;
if (baudrate != rs485_baudrate) {
baudrate = rs485_baudrate;
rs485_init();
}
if (addr != rs485_mb_addr) {
addr = rs485_mb_addr;
lark1s_set_mb_address(addr);
}
rs485_state_machine_tx();
}

View File

@ -12,8 +12,8 @@
#define RS485_PIN_RX (GPIO_Pin_11)
#define RS485_PIN_DIR (GPIO_Pin_1)
#define RS485_BAUDRATE (115200)
#define RS485_MB_ADDR (9)
extern uint32_t rs485_baudrate;
extern uint8_t rs485_mb_addr;
void rs485_init(void);
void rs485_send(uint16_t len);