Files
25-sentry-chassis/A-Driver/BSP_USART.c
2026-05-17 21:07:34 +08:00

146 lines
3.5 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "BSP_USART.h"
#include "usart.h"
#include "main.h"
extern UART_HandleTypeDef huart1; //usart.c
extern DMA_HandleTypeDef hdma_usart1_tx; //usart.c
extern UART_HandleTypeDef huart3; //usart.c
extern DMA_HandleTypeDef hdma_usart3_rx; //usart.c
void UART2_TxDma_Init(void)
{
//enable the DMA transfer for the receiver request
SET_BIT(huart1.Instance->CR3, USART_CR3_DMAT);
}
void UART2_TxDma_Enable(uint8_t *data, uint16_t len)
{
//disable DMA
__HAL_DMA_DISABLE(&hdma_usart1_tx);
while(hdma_usart1_tx.Instance->CR & DMA_SxCR_EN)
{
__HAL_DMA_DISABLE(&hdma_usart1_tx);
}
//clear flag
__HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx, DMA_HISR_TCIF7);
__HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx, DMA_HISR_HTIF7);
//set data address
hdma_usart1_tx.Instance->M0AR = (uint32_t)(data);
//set data length
hdma_usart1_tx.Instance->NDTR = len;
//enable DMA
__HAL_DMA_ENABLE(&hdma_usart1_tx);
}
void UART2_SendByte(uint8_t Byte)
{
HAL_UART_Transmit(&huart1, &Byte, 1, 0xFFFF);
}
void UART2_SendArray(uint8_t *Array,uint16_t Length)
{
for(uint16_t i=0;i<Length;i++)
UART2_SendByte(Array[i]);
}
void UART2_SendString(char *String)
{
for(uint8_t i=0;String[i]!='\0';i++)
UART2_SendByte(String[i]);//依次发送字符串的每一位
}
void UART2_SendNumber(uint32_t Number,uint8_t Length)
{
for(uint8_t i=0;i<Length;i++)
UART2_SendByte(Number/USART_Pow(10,Length-i-1)%10+'0');//以文本形式发送数字每一位
}
void UART2_SendNumber_Sign(int32_t Number, uint8_t Length)
{
// 处理负数
if (Number < 0) {
UART2_SendByte('-');
Number = -Number; // 转为正数注意INT32_MIN 有边界问题,见下方说明)
}
// 发送每一位数字
for (uint8_t i = 0; i < Length; i++) {
// 计算当前位的除数10^(Length - i - 1)
uint32_t divisor = 1;
for (uint8_t j = 0; j < Length - i - 1; j++) {
divisor *= 10;
}
uint8_t digit = (Number / divisor) % 10;
UART2_SendByte(digit + '0');
}
}
void UART2_SendFloat_Sign(float value, uint8_t decimal_places)
{
char buffer[32]; // 足够容纳 -123456.789\0
// 安全格式化:防止缓冲区溢出
int len = snprintf(buffer, sizeof(buffer), "%.*f", decimal_places, value);
// 防止 snprintf 出错(返回负数或超长)
if (len < 0 || len >= (int)sizeof(buffer)) {
UART2_SendString("ERR_FLOAT");
return;
}
// 发送字符串
for (int i = 0; i < len; i++) {
UART2_SendByte(buffer[i]);
}
}
uint32_t USART_Pow(uint32_t X, uint32_t Y)
{
uint32_t Result = 1;
while(Y--)
{
Result *= X;
}
return Result;
}
void DBUS_DMA_Init(uint8_t *rx1_buf, uint8_t *rx2_buf, uint16_t dma_buf_num)
{
//enable the DMA transfer for the receiver request
SET_BIT(huart3.Instance->CR3, USART_CR3_DMAR);
//enalbe idle interrupt
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE);
//disable DMA
__HAL_DMA_DISABLE(&hdma_usart3_rx);
while(hdma_usart3_rx.Instance->CR & DMA_SxCR_EN)
{
__HAL_DMA_DISABLE(&hdma_usart3_rx);
}
hdma_usart3_rx.Instance->PAR = (uint32_t) & (USART3->DR);
//memory buffer 1
hdma_usart3_rx.Instance->M0AR = (uint32_t)(rx1_buf);
//memory buffer 2
hdma_usart3_rx.Instance->M1AR = (uint32_t)(rx2_buf);
//data length
hdma_usart3_rx.Instance->NDTR = dma_buf_num;
//enable double memory buffer
SET_BIT(hdma_usart3_rx.Instance->CR, DMA_SxCR_DBM);
//enable DMA
__HAL_DMA_ENABLE(&hdma_usart3_rx);
}