STM32H750XB_RT-THREAD/41-RS485通信实验/User/main.c
2025-07-21 14:34:29 +08:00

185 lines
5.0 KiB
C
Raw Permalink 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.

/**
******************************************************************
* @file main.c
* @author fire
* @version V1.0
* @date 2019-xx-xx
* @brief RS485通信实验
******************************************************************
* @attention
*
* 实验平台:野火 STM32H750 开发板
* 论坛 :http://www.firebbs.cn
* 淘宝 :http://firestm32.taobao.com
*
******************************************************************
*/
#include "stm32h7xx.h"
#include "main.h"
#include "./led/bsp_led.h"
#include "./usart/bsp_debug_usart.h"
#include "./key/bsp_key.h"
#include "./485/bsp_485.h"
#include "./delay/core_delay.h"
extern FDCAN_HandleTypeDef hfdcan;
FDCAN_RxHeaderTypeDef RxHeader;
uint8_t RxData[12];
void Delay(__IO uint32_t nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
char *pbuf;
uint16_t len;
/* 使能指令缓存 */
SCB_EnableICache();
/* 使能数据缓存 */
SCB_EnableDCache();
/* 系统时钟初始化成480MHz */
SystemClock_Config();
_485_Config();
/* LED 端口初始化 */
LED_GPIO_Config();
LED_BLUE;
/* 配置串口1为115200 8-N-1 */
DEBUG_USART_Config();
/* 初始化独立按键 */
Key_GPIO_Config();
printf("\r\n 欢迎使用野火 STM32H750-挑战者 开发板。\r\n");
printf("\r\n 野火 STM32H750 485通讯实验例程\r\n");
printf("\r\n 实验步骤:\r\n");
printf("\r\n 1.使用导线连接好两个485通讯设备\r\n");
printf("\r\n 2.使用跳线帽连接好:5v --- C/4-5V,485-D --- PA2,485-R ---PA3 \r\n");
printf("\r\n 3.若使用两个野火开发板进行实验,给两个开发板都下载本程序即可。\r\n");
printf("\r\n 4.准备好后按下其中一个开发板的KEY1键会使用485向外发送0-255的数字 \r\n");
printf("\r\n 5.若开发板的485接收到256个字节数据会把数据以16进制形式打印出来。 \r\n");
while(1)
{
/*按一次按键发送一次数据*/
if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON)
{
uint16_t i;
LED_BLUE;
_485_TX_EN();
for(i=0;i<=0xff;i++)
{
_485_SendByte(i); //发送数据
}
/*加短暂延时保证485发送数据完毕*/
Delay(0xFFF);
_485_RX_EN();
LED_GREEN;
printf("\r\n发送数据成功!\r\n"); //使用调试串口打印调试信息到终端
}
else
{
LED_BLUE;
pbuf = get_rebuff(&len);
if(len>=256)
{
LED_GREEN;
printf("\r\n接收到长度为%d的数据\r\n",len);
_485_DEBUG_ARRAY((uint8_t*)pbuf,len);
clean_rebuff();
}
}
}
}
/**
* @brief System Clock 配置
* system Clock 配置如下:
* System Clock source = PLL (HSE)
* SYSCLK(Hz) = 480000000 (CPU Clock)
* HCLK(Hz) = 240000000 (AXI and AHBs Clock)
* AHB Prescaler = 2
* D1 APB3 Prescaler = 2 (APB3 Clock 120MHz)
* D2 APB1 Prescaler = 2 (APB1 Clock 120MHz)
* D2 APB2 Prescaler = 2 (APB2 Clock 120MHz)
* D3 APB4 Prescaler = 2 (APB4 Clock 120MHz)
* HSE Frequency(Hz) = 25000000
* PLL_M = 5
* PLL_N = 192
* PLL_P = 2
* PLL_Q = 2
* PLL_R = 2
* VDD(V) = 3.3
* Flash Latency(WS) = 4
* @param None
* @retval None
*/
/**
* @brief System Clock Configuration
* @retval None
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** 启用电源配置更新
*/
HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
/** 配置主内稳压器输出电压
*/
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
/** 初始化CPU、AHB和、APB总线时钟
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 5;
RCC_OscInitStruct.PLL.PLLN = 192;
RCC_OscInitStruct.PLL.PLLP = 2;
RCC_OscInitStruct.PLL.PLLQ = 2;
RCC_OscInitStruct.PLL.PLLR = 2;
RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
RCC_OscInitStruct.PLL.PLLFRACN = 0;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
}
/** 初始化CPU、AHB和、APB总线时钟
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
|RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
{
}
}
/****************************END OF FILE***************************/