STM32H750XB_RT-THREAD/41-RS485通信实验/User/485/bsp_485.c

187 lines
4.5 KiB
C
Raw Permalink Normal View History

2025-07-21 06:34:29 +00:00
/**
******************************************************************************
* @file bsp_485.c
* @author fire
* @version V1.0
* @date 2019-xx-xx
* @brief 485<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
******************************************************************************
* @attention
*
* ʵ<EFBFBD><EFBFBD>ƽ̨:Ұ<EFBFBD><EFBFBD> STM32 H750 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>̳ :http://www.firebbs.cn
* <EFBFBD>Ա<EFBFBD> :http://fire-stm32.taobao.com
*
******************************************************************************
*/
#include "./485/bsp_485.h"
#include <stdarg.h>
static void Delay(__IO uint32_t nCount);
UART_HandleTypeDef Uart2_Handle;
/// <20><><EFBFBD><EFBFBD>USART<52><54><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
static void NVIC_Configuration(void)
{
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ȼ<EFBFBD><C8BC>ķ<EFBFBD><C4B7><EFBFBD> */
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
/*<2A>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ȼ<EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>Ϊ0*/
HAL_NVIC_SetPriority(_485_INT_IRQ, 1 ,1);
HAL_NVIC_EnableIRQ(_485_INT_IRQ);
}
/*
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>_485_Config
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>USART GPIO <EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void _485_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
_485_USART_RX_GPIO_CLK_ENABLE();
_485_USART_TX_GPIO_CLK_ENABLE();
_485_RE_GPIO_CLK_ENABLE();
/* ʹ<><CAB9> UART ʱ<><CAB1> */
_485_USART_CLK_ENABLE();
/**USART2 GPIO Configuration
PD5 ------> USART2_TX
PD6 ------> USART2_RX
*/
/* <20><><EFBFBD><EFBFBD>Tx<54><78><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ù<EFBFBD><C3B9><EFBFBD> */
GPIO_InitStruct.Pin = _485_USART_TX_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = _485_USART_TX_AF;
HAL_GPIO_Init(_485_USART_TX_GPIO_PORT, &GPIO_InitStruct);
/* <20><><EFBFBD><EFBFBD>Rx<52><78><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ù<EFBFBD><C3B9><EFBFBD> */
GPIO_InitStruct.Pin = _485_USART_RX_PIN;
GPIO_InitStruct.Alternate = _485_USART_RX_AF;
HAL_GPIO_Init(_485_USART_RX_GPIO_PORT, &GPIO_InitStruct);
/* 485<38>շ<EFBFBD><D5B7><EFBFBD><EFBFBD>ƹܽ<C6B9> */
GPIO_InitStruct.Pin = _485_RE_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(_485_RE_GPIO_PORT, &GPIO_InitStruct);
/* <20><><EFBFBD>ô<EFBFBD>485_USART ģʽ */
Uart2_Handle.Instance = _485_USART;
Uart2_Handle.Init.BaudRate = _485_USART_BAUDRATE;
Uart2_Handle.Init.WordLength = UART_WORDLENGTH_8B;
Uart2_Handle.Init.StopBits = UART_STOPBITS_1;
Uart2_Handle.Init.Parity = UART_PARITY_NONE;
Uart2_Handle.Init.Mode = UART_MODE_TX_RX;
Uart2_Handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
Uart2_Handle.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&Uart2_Handle);
/*<2A><><EFBFBD><EFBFBD>1<EFBFBD>жϳ<D0B6>ʼ<EFBFBD><CABC> */
NVIC_Configuration();
/*<2A><><EFBFBD>ô<EFBFBD><C3B4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD> */
__HAL_UART_ENABLE_IT(&Uart2_Handle,UART_IT_RXNE);
//Ĭ<>Ͻ<EFBFBD><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
HAL_GPIO_WritePin(_485_RE_GPIO_PORT,_485_RE_PIN,GPIO_PIN_RESET);
}
/***************** <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ַ<EFBFBD> **********************/
//ʹ<>õ<EFBFBD><C3B5>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>ǰҪʹ<D2AA>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD>ͺ<EFBFBD>Ҫʹ<D2AA>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD>
void _485_SendByte( uint8_t ch )
{
/* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD>ݵ<EFBFBD>USART2 */
HAL_UART_Transmit(&Uart2_Handle, (uint8_t *)&ch, 1, 0xFFFF);
while(__HAL_UART_GET_FLAG(&Uart2_Handle, UART_FLAG_TXE) == 0);
}
/***************** <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5>ַ<EFBFBD><D6B7><EFBFBD> **********************/
void _485_SendStr_length( uint8_t *str,uint32_t strlen )
{
unsigned int k=0;
_485_TX_EN() ;// ʹ<>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
do
{
_485_SendByte( *(str + k) );
k++;
} while(k < strlen);
/*<2A>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>֤485<38><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
Delay(0xFFF);
_485_RX_EN() ;// ʹ<>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/***************** <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> **********************/
void _485_SendString( uint8_t *str)
{
unsigned int k=0;
_485_TX_EN() ;// ʹ<>ܷ<EFBFBD><DCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
do
{
_485_SendByte( *(str + k) );
k++;
} while(*(str + k)!='\0');
/*<2A>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>֤485<38><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
Delay(0xFFF);
_485_RX_EN() ;// ʹ<>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//<2F>жϻ<D0B6><CFBB><EFBFBD><E6B4AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define UART_BUFF_SIZE 1024
volatile uint16_t uart_p = 0;
uint8_t uart_buff[UART_BUFF_SIZE];
void bsp_485_IRQHandler(void)
{
if(uart_p<UART_BUFF_SIZE)
{
if(__HAL_UART_GET_IT_SOURCE( &Uart2_Handle, UART_IT_RXNE ) != RESET)
{
HAL_UART_Receive(&Uart2_Handle, (uint8_t *)(&uart_buff[uart_p]),1 , 1000);
uart_p++;
}
}
else
{
clean_rebuff();
}
HAL_UART_IRQHandler(&Uart2_Handle);
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺͳ<DDBA><CDB3><EFBFBD>
char *get_rebuff(uint16_t *len)
{
*len = uart_p;
return (char *)&uart_buff;
}
//<2F><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
void clean_rebuff(void)
{
uint16_t i=UART_BUFF_SIZE+1;
uart_p = 0;
while(i)
uart_buff[--i]=0;
}
static void Delay(__IO uint32_t nCount) //<2F>򵥵<EFBFBD><F2B5A5B5><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
{
for(; nCount != 0; nCount--);
}