更新项目结构,修改自述文件

This commit is contained in:
2026-05-17 21:16:52 +08:00
parent bc5bd0c72e
commit a4ccd91c75
28 changed files with 129 additions and 50 deletions

145
00-Driver/BSP_USART.c Normal file
View File

@@ -0,0 +1,145 @@
#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);
}