FilmForge: RS485 data link (USART0+DE PA8) and NTC temp (PC5 ADC0)

This commit is contained in:
2026-10-09 19:13:15 +08:00
parent 8feba5e015
commit 24ddb7046e
12 changed files with 402 additions and 197 deletions
+6 -46
View File
@@ -10,20 +10,12 @@ void uart_init(void) {
rcu_periph_clock_enable(UART_GPIO_RCU);
rcu_periph_clock_enable(UART_RCU);
/* 配置 PA9 为 USART0_TX,PA10 为 USART0_RX(AF7) */
/* 配置 PA2 为 USART1_TX,PA3 为 USART1_RX(AF7),debug 口纯串口 */
gpio_af_set(UART_GPIO_PORT, GPIO_AF_7, UART_TX_PIN | UART_RX_PIN);
gpio_mode_set(UART_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, UART_TX_PIN | UART_RX_PIN);
gpio_output_options_set(UART_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, UART_TX_PIN | UART_RX_PIN);
#if RS485_MODE == CFG_ENABLE
/* 配置 RS485 DE 引脚为普通推挽输出(默认接收态) */
rcu_periph_clock_enable(RS485_DE_RCU);
gpio_mode_set(RS485_DE_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, RS485_DE_PIN);
gpio_output_options_set(RS485_DE_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RS485_DE_PIN);
gpio_bit_reset(RS485_DE_PORT, RS485_DE_PIN);
#endif
/* 配置波特率、数据位、停止位等 */
usart_deinit(UART_PHY);
usart_word_length_set(UART_PHY, USART_WL_8BIT);
@@ -47,40 +39,21 @@ void uart_rx_irq_resume(void) {
usart_interrupt_enable(UART_PHY, USART_INT_RBNE);
}
#if RS485_MODE == CFG_ENABLE
void rs485_de_set(void) {
gpio_bit_set(RS485_DE_PORT, RS485_DE_PIN); /* 发送态 */
void debug_uart_write(uint8_t byte) {
/* 等待发送缓冲区空后写入 debug 串口 */
while (RESET == usart_flag_get(DEBUG_UART, USART_FLAG_TBE)) {}
usart_data_transmit(DEBUG_UART, byte);
}
void rs485_de_clear(void) {
gpio_bit_reset(RS485_DE_PORT, RS485_DE_PIN); /* 接收态 */
}
#endif
/******************************************************************************/
/* 具体的中断处理函数实现 */
/******************************************************************************/
void usart0_irq_handler(void) {
// 处理USART0的接收中断
if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) {
uint8_t data = usart_data_receive(USART0);
// 使用原有的环形缓冲区处理逻辑
(void)uart_ring_buffer_put(data); // 缓冲满时丢弃,返回值可用于统计
}
// 处理USART0的空闲中断
if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE)) {
usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);
// 在这里添加空闲中断处理逻辑
}
}
void usart1_irq_handler(void) {
// 处理USART1的接收中断
if(usart_interrupt_flag_get(USART1, USART_INT_FLAG_RBNE)) {
uint8_t data = usart_data_receive(USART1);
(void)uart_ring_buffer_put(data);
(void)uart_ring_buffer_put(data); // 缓冲满时丢弃,返回值可用于统计
}
// 处理USART1的空闲中断
@@ -89,19 +62,6 @@ void usart1_irq_handler(void) {
}
}
void usart2_irq_handler(void) {
// 处理USART2的接收中断
if(usart_interrupt_flag_get(USART2, USART_INT_FLAG_RBNE)) {
uint8_t data = usart_data_receive(USART2);
(void)uart_ring_buffer_put(data);
}
// 处理USART2的空闲中断
if(usart_interrupt_flag_get(USART2, USART_INT_FLAG_IDLE)) {
usart_interrupt_flag_clear(USART2, USART_INT_FLAG_IDLE);
}
}
/* 调试串口初始化(与 uart_init 相同配置的独立入口,便于单独初始化打印口) */
void debug_usart_init(void)
{