STM32F429标准输入输出实践教程

版权申诉
0 下载量 162 浏览量 更新于2024-10-20 收藏 13KB 7Z 举报
资源摘要信息:"STM32F429 STDIO 输入输出教程" 本资源涉及STM32F429微控制器的标准输入输出(STDIO)功能,主要是通过7z压缩包文件形式,提供给用户学习和开发使用。STM32F429是STMicroelectronics(意法半导体)生产的一款高性能ARM Cortex-M4微控制器,具有丰富的功能和较高的处理速度,广泛应用于嵌入式系统开发中。本资源将详细讲解如何使用STDIO进行输入和输出操作,这对于掌握STM32F系列微控制器的编程是非常关键的。 知识点一:STM32F429微控制器概述 STM32F429是STM32F4系列中的一员,该系列微控制器基于ARM Cortex-M4内核,拥有单精度浮点单元(FPU)和数字信号处理(DSP)单元。STM32F429具有高达180MHz的运行频率,具有丰富的片上资源,如多种通信接口(USB OTG, CAN, SPI, I2C等),大量的GPIO引脚,以及高性能的模拟功能(ADC, DAC等)。这些特性使得STM32F429非常适合于复杂的应用场景,如网络设备、医疗仪器、高端消费电子产品等。 知识点二:STDIO功能简介 STDIO指的是标准输入输出功能,是编程中一种通用的I/O接口。在C语言中,STDIO通常通过标准库函数(stdio.h)实现,为程序员提供了方便地进行屏幕打印输出和从控制台读取输入的方法。对于嵌入式系统来说,STDIO使得用户可以使用类似于在PC编程环境中的输入输出函数进行程序的调试和运行结果的监控。 知识点三:STM32F429 STDIO实现 在STM32F429上实现STDIO,通常需要借助于微控制器上的串口(USART)或者USB虚拟串口功能。串口是最常见的通信接口之一,它允许微控制器通过串行通信与PC机或其他设备进行数据交换。利用STM32F429的USART接口可以轻松地实现数据的发送和接收。此外,USB虚拟串口功能可以将STM32F429的USB接口模拟为一个COM端口,实现与PC机上的串口通信。 知识点四:程序设计与开发流程 在编写程序时,首先需要配置STM32F429的串口参数,包括波特率、数据位、停止位和校验位等。然后,需要初始化串口,包括时钟设置、GPIO复用、中断使能等。在程序中使用STDIO函数时,通常会包含头文件"stdio.h",并使用相关的函数如printf()进行数据的输出,使用scanf()函数或者getchar()函数进行数据的输入。为了能够在STM32F429上运行这些函数,需要实现相应的库函数,或者使用支持的开发环境,如Keil uVision、STM32CubeIDE等,它们提供了标准库的支持。 知识点五:调试与运行 在STM32F429的STDIO功能实现后,需要进行程序的调试和运行。调试过程中,可以使用开发环境自带的调试工具,比如ST-Link。通过串口调试助手或者其他终端程序,可以观察到STM32F429输出的数据和输入的信息。这对于验证程序逻辑、监测数据流和进行错误分析非常有帮助。 知识点六:压缩包子文件说明 7z格式是一种压缩文件格式,具有高压缩比和高效率的特点。本资源中的"41-STM32F429_STDIO_INPUT_OUTPUT.7z"文件表示了一个以"41-STM32F429_STDIO_INPUT_OUTPUT"命名的压缩包。在这个压缩包中,可能包含了相关的代码文件、文档说明、示例项目、库文件以及可能的图片、图表等辅助性材料。用户需要使用支持7z格式的解压缩软件来打开这个文件,并提取所需资源进行学习和开发。 总结而言,本资源对于想要学习STM32F429微控制器STDIO输入输出功能的开发者来说,提供了必要的基础知识和实践指南。通过本资源的学习,开发者可以了解STM32F429微控制器的相关特性和STDIO的具体实现方法,并能够利用相关工具进行程序的设计、调试与运行。

#include "main.h" #include "stdio.h" #include "string.h" #include "time.h" UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { time_t now = time(NULL); struct tm *timeinfo = localtime(&now); char time_str[9]; sprintf(time_str, "%02d:%02d:%02d", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); HAL_UART_Transmit(&huart1, (uint8_t *)time_str, strlen(time_str), HAL_MAX_DELAY); HAL_Delay(1000); } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { Error_Handler(); } } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, GPIO_PIN_RESET); /*Configure GPIO pin : PA9 */ GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } 在以上代码的基础上,编写代码以实现计算发送 hh:mm:ss到单片机,修改单片机时间

2023-05-30 上传

#include "bflb_adc.h" #include "bflb_mtimer.h" #include "board.h" struct bflb_device_s adc; #define TEST_ADC_CHANNELS 2 #define TEST_COUNT 10 struct bflb_adc_channel_s chan[] = { { .pos_chan = ADC_CHANNEL_2, .neg_chan = ADC_CHANNEL_GND }, { .pos_chan = ADC_CHANNEL_GND, .neg_chan = ADC_CHANNEL_3 }, }; int main(void) { board_init(); board_adc_gpio_init(); adc = bflb_device_get_by_name("adc"); / adc clock = XCLK / 2 / 32 */ struct bflb_adc_config_s cfg; cfg.clk_div = ADC_CLK_DIV_32; cfg.scan_conv_mode = true; cfg.continuous_conv_mode = false; cfg.differential_mode = true; cfg.resolution = ADC_RESOLUTION_16B; cfg.vref = ADC_VREF_3P2V; bflb_adc_init(adc, &cfg); bflb_adc_channel_config(adc, chan, TEST_ADC_CHANNELS); for (uint32_t i = 0; i < TEST_COUNT; i++) { bflb_adc_start_conversion(adc); while (bflb_adc_get_count(adc) < TEST_ADC_CHANNELS) { bflb_mtimer_delay_ms(1); } for (size_t j = 0; j < TEST_ADC_CHANNELS; j++) { struct bflb_adc_result_s result; uint32_t raw_data = bflb_adc_read_raw(adc); printf("raw data:%08x\r\n", raw_data); bflb_adc_parse_result(adc, &raw_data, &result, 1); printf("pos chan %d,neg chan %d,%d mv \r\n", result.pos_chan, result.neg_chan, result.millivolt); } bflb_adc_stop_conversion(adc); bflb_mtimer_delay_ms(100); } while (1) { } }根据以上代码对bl618程序的编写对以下stm32中代码#include "stm32f10x.h" #include "delay.h" #include "FSR.h" #include "usart.h" #include "adc.h" #define PRESS_MIN 20 #define PRESS_MAX 6000 #define VOLTAGE_MIN 150 #define VOLTAGE_MAX 3300 u8 state = 0; u16 val = 0; u16 value_AD = 0; long PRESS_AO = 0; int VOLTAGE_AO = 0; long map(long x, long in_min, long in_max, long out_min, long out_max); int main(void) { delay_init(); NVIC_Configuration(); uart_init(9600); Adc_Init(); delay_ms(1000); printf("Test start\r\n"); while(1) { value_AD = Get_Adc_Average(1,10); VOLTAGE_AO = map(value_AD, 0, 4095, 0, 3300); if(VOLTAGE_AO < VOLTAGE_MIN) { PRESS_AO = 0; } else if(VOLTAGE_AO > VOLTAGE_MAX) { PRESS_AO = PRESS_MAX; } else { PRESS_AO = map(VOLTAGE_AO, VOLTAGE_MIN, VOLTAGE_MAX, PRESS_MIN, PRESS_MAX); } printf("ADÖµ = %d,µçѹ = %d mv,ѹÁ¦ = %ld g\r\n",value_AD,VOLTAGE_AO,PRESS_AO); delay_ms(500); } } long map(long x, long in_min, long in_max, long out_min, long out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; }移植到bl618进行改写

2023-05-12 上传