generated from hulk/gd32f4xx_template_cmake_vscode
FilmForge: RS485 data link (USART0+DE PA8) and NTC temp (PC5 ADC0)
This commit is contained in:
+37
-7
@@ -51,13 +51,44 @@
|
||||
|
||||
/* >>>>>>>>>>>>>>>>>>>>[RS485 MODE]<<<<<<<<<<<<<<<<<<<< */
|
||||
|
||||
#define RS485_MODE CFG_DISABLE // CFG_DISABLE: RS485 off; CFG_ENABLE: RS485 on
|
||||
#define RS485_MODE CFG_ENABLE // CFG_DISABLE: RS485 off; CFG_ENABLE: RS485 on
|
||||
/* GD32F4xx USART 无硬件 RS485 DE 驱动(E23x 特有),DE 引脚由 GPIO 手动控制 */
|
||||
|
||||
#if RS485_MODE == CFG_ENABLE
|
||||
#define RS485_DE_RCU RCU_GPIOA
|
||||
#define RS485_DE_PORT GPIOA
|
||||
#define RS485_DE_PIN GPIO_PIN_1 // 根据实际硬件修改 DE 引脚
|
||||
/* 数据口 RS485:USART0(PA9 TX / PA10 RX,AF7),DE 引脚 PA8(GPIO 手动切换收发) */
|
||||
#define RS485_RCU RCU_USART0
|
||||
#define RS485_PHY USART0
|
||||
#define RS485_IRQ USART0_IRQn
|
||||
#define RS485_GPIO_RCU RCU_GPIOA
|
||||
#define RS485_GPIO_PORT GPIOA
|
||||
#define RS485_TX_PIN GPIO_PIN_9
|
||||
#define RS485_RX_PIN GPIO_PIN_10
|
||||
#define RS485_BAUDRATE 115200U
|
||||
#define RS485_DE_RCU RCU_GPIOA
|
||||
#define RS485_DE_PORT GPIOA
|
||||
#define RS485_DE_PIN GPIO_PIN_8
|
||||
#endif
|
||||
|
||||
/* >>>>>>>>>>>>>>>>>>>>[NTC TEMPERATURE]<<<<<<<<<<<<<<<<<<<< */
|
||||
|
||||
#define NTC_MODE CFG_ENABLE // CFG_DISABLE: NTC off; CFG_ENABLE: NTC on
|
||||
|
||||
#if NTC_MODE == CFG_ENABLE
|
||||
/* 10K NTC 测温:PC5(ADC0_IN15),硬件 10K 上拉,NTC 接 GND 侧 */
|
||||
#define NTC_ADC_RCU RCU_ADC0
|
||||
#define NTC_GPIO_RCU RCU_GPIOC
|
||||
#define NTC_GPIO_PORT GPIOC
|
||||
#define NTC_GPIO_PIN GPIO_PIN_5
|
||||
#define NTC_ADC ADC0
|
||||
#define NTC_ADC_CHANNEL ADC_CHANNEL_15
|
||||
#define NTC_SAMPLETIME ADC_SAMPLETIME_480 /* 长采样时间(高阻 NTC 分压源) */
|
||||
#define NTC_SAMPLE_COUNT 16U /* 单次测温的采样次数(均值降噪) */
|
||||
#define NTC_VREF 3.3f /* ADC 参考电压 V */
|
||||
#define NTC_ADC_MAX 4095.0f /* 12bit ADC 满量程 */
|
||||
#define NTC_R_PULL 10000.0f /* 上拉电阻(硬件) */
|
||||
#define NTC_R25 10000.0f /* NTC 标称阻值 @25C */
|
||||
#define NTC_T25 298.15f /* 标称温度 K */
|
||||
#define NTC_B_VALUE 3950 /* B 值:3950 或 3435,按实测确认后修改 */
|
||||
#endif
|
||||
|
||||
/******************************************************************************/
|
||||
@@ -74,10 +105,9 @@
|
||||
#define UART_RX_PIN GPIO_PIN_3
|
||||
#define UART_BAUDRATE 115200U
|
||||
|
||||
/* USART中断处理函数声明 */
|
||||
void usart0_irq_handler(void);
|
||||
/* USART中断处理函数声明(USART0 的处理在 rs485.c,USART1 的处理在 uart.c) */
|
||||
void rs485_irq_handler(void);
|
||||
void usart1_irq_handler(void);
|
||||
void usart2_irq_handler(void);
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
#ifndef NTC_H
|
||||
#define NTC_H
|
||||
|
||||
#include "gd32f4xx.h"
|
||||
#include "board_config.h"
|
||||
|
||||
/**
|
||||
* @brief 初始化 NTC 测温(PC5 模拟输入 + ADC0 常规通道,软件触发单次转换)。
|
||||
*/
|
||||
void ntc_init(void);
|
||||
|
||||
/**
|
||||
* @brief 读取一次 NTC 温度(多次采样均值 + B 值公式换算)。
|
||||
* @details 分压关系:V = VREF * R_ntc / (R_PULL + R_ntc)(硬件上拉在 VREF 侧,
|
||||
* NTC 接 GND 侧),再由 B 值公式换算温度,单位摄氏度。
|
||||
* @return 温度值(摄氏度,float)
|
||||
*/
|
||||
float ntc_read_temperature(void);
|
||||
|
||||
#endif // NTC_H
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
#ifndef RS485_H
|
||||
#define RS485_H
|
||||
|
||||
#include "gd32f4xx.h"
|
||||
#include "board_config.h"
|
||||
|
||||
/* RS485 接收环形缓冲区容量(单位:字节),采用"预留一格"区分空/满策略 */
|
||||
#define RS485_RX_BUFFER_SIZE 128
|
||||
|
||||
/**
|
||||
* @brief 初始化 RS485 接口(USART0 PA9/PA10 + DE PA8)。
|
||||
* @details 配置 GPIO 复用、DE 引脚推挽输出(默认接收态)、USART 参数、
|
||||
* 接收非空中断(RBNE)与独立接收环形缓冲区。
|
||||
*/
|
||||
void rs485_init(void);
|
||||
|
||||
/**
|
||||
* @brief RS485 阻塞发送。
|
||||
* @details DE 置位进入发送态 → 逐字节发送(等待 TBE)→ 等待发送完成(TC)→
|
||||
* DE 清零回到接收态。
|
||||
* @param[in] data 待发送数据指针
|
||||
* @param[in] len 发送字节数
|
||||
*/
|
||||
void rs485_send(const uint8_t *data, uint16_t len);
|
||||
|
||||
/**
|
||||
* @brief RS485 主循环处理(拉通阶段:原样回显)。
|
||||
* @details 从接收环形缓冲取字节并回发到 RS485,同时转发到 debug 串口。
|
||||
* 在主循环中周期调用。
|
||||
*/
|
||||
void rs485_process(void);
|
||||
|
||||
/**
|
||||
* @brief 获取当前 RS485 接收环形缓冲区可读字节数。
|
||||
*/
|
||||
uint8_t rs485_rx_available(void);
|
||||
|
||||
/**
|
||||
* @brief 从 RS485 接收环形缓冲区读取一个字节。
|
||||
* @return 读取到的字节(0..255),或 -1 表示缓冲区为空。
|
||||
*/
|
||||
int rs485_rx_get(void);
|
||||
|
||||
/**
|
||||
* @brief USART0 接收中断处理(由 gd32f4xx_it.c 的 USART0_IRQHandler 调用)。
|
||||
*/
|
||||
void rs485_irq_handler(void);
|
||||
|
||||
#endif // RS485_H
|
||||
+5
-6
@@ -13,6 +13,11 @@
|
||||
void uart_init(void);
|
||||
void debug_usart_init(void);
|
||||
|
||||
/**
|
||||
* @brief debug 串口阻塞发送一个字节(printf 重定向亦走此通路)。
|
||||
*/
|
||||
void debug_uart_write(uint8_t byte);
|
||||
|
||||
/*!
|
||||
\brief pause UART RX interrupt (RBNE)
|
||||
\param[in] none
|
||||
@@ -29,10 +34,4 @@ void uart_rx_irq_pause(void);
|
||||
*/
|
||||
void uart_rx_irq_resume(void);
|
||||
|
||||
#if RS485_MODE == CFG_ENABLE
|
||||
/* RS485 DE 引脚手动控制(GD32F4xx USART 无硬件 DE 驱动) */
|
||||
void rs485_de_set(void);
|
||||
void rs485_de_clear(void);
|
||||
#endif
|
||||
|
||||
#endif // UART_H
|
||||
|
||||
Reference in New Issue
Block a user