潘多拉STM32L4 96 IoT开发板(HAL库) 6.通过USART1串口完整实现信息接收与发送

STM32L475潘多拉开发板RT Thread实验程序下载以及实验1_LED_BLINK 作为一名STM32嵌入式学习的新人,我希望把我学习STM32潘多拉开发板的一些实验经历和学习经历记录下来,最好能够给大家一点点帮助。 阅读详情

学习目标:

        整合资源,通过USART1串口完整实现信息的接收和发送


学习内容:

1.事实上可以将USART.h和USART.c存储起来,封装为串口的驱动文件。
这里,我们把它们另存为usart1.h和usart1.c

2.改写main.c文件实现代码的重构

3.通过XCOM V2.2串口调试助手来验证代码运行正确性


学习时间:

2026.1.7


工程创建:

1.在项目工程文件MDK-RAM文件夹下新建Devices/usart1文件夹

新建usart1.c和usart1.h文件,并对其编程。

        usart1.c

#include "usart1.h"
#include "stm32l4xx_hal.h"

// Global variable definitions
uint8_t USART_RX_BUF[USART_REC_LEN];  // Receive buffer
uint16_t USART_RX_STA = 0;            // Receive status flag
UART_HandleTypeDef huart1;            // UART handle

#if 1
#pragma import(__use_no_semihosting)
// Support functions required by the standard library
struct __FILE
{
    int handle;
};
FILE __stdout;

/**
 * @brief Define _sys_exit() to avoid using semihosting mode
 *
 * @param  x (Unused parameter)
 *
 * @return  void
 */
void _sys_exit(int x)
{
    x = x; // Prevent unused parameter warning
}

/**
 * @brief Redefine fputc function for printf redirection
 *
 * @param  ch  Character to send
 * @param  f   File pointer (unused)
 *
 * @return  The character sent
 */
int fputc(int ch, FILE *f)
{
    // Wait until the transmit data register is empty
    while((USART1->ISR & 0X40) == 0);
    // Write the character to the transmit data register
    USART1->TDR = (uint8_t)ch;
    return ch;
}
#endif

/**
 * @brief USART1 initialization function
 *
 * @param bound  UART baud rate
 *
 * @return void
 */
void uart1_init(uint32_t bound)
{
    // UART initialization settings
    huart1.Instance = USART1;                     // USART1
    huart1.Init.BaudRate = bound;                 // Set baud rate
    huart1.Init.WordLength = UART_WORDLENGTH_8B;  // 8-bit data format
    huart1.Init.StopBits = UART_STOPBITS_1;       // One stop bit
    huart1.Init.Parity = UART_PARITY_NONE;        // No parity
    huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;  // No hardware flow control
    huart1.Init.Mode = UART_MODE_TX_RX;           // Transmit and receive mode
    HAL_UART_Init(&huart1);                       // HAL_UART_Init() will enable USART1

    __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE);  // Enable receive interrupt
    HAL_NVIC_EnableIRQ(USART1_IRQn);              // Enable USART1 interrupt channel
    HAL_NVIC_SetPriority(USART1_IRQn, 3, 3);      // Preemption priority 3, subpriority 3
}

/**
 * @brief HAL library UART low-level initialization (clock enable, pin configuration, interrupt configuration)
 *
 * @param huart  Pointer to UART handle
 *
 * @return void
 */
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    // GPIO port settings
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    if (huart->Instance == USART1)  // If it is USART1, perform USART1 MSP initialization
    {
        __HAL_RCC_GPIOA_CLK_ENABLE();   // Enable GPIOA clock
        __HAL_RCC_USART1_CLK_ENABLE();  // Enable USART1 clock

        GPIO_InitStruct.Pin = GPIO_PIN_9;             // PA9 (TX)
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;       // Alternate function push-pull output
        GPIO_InitStruct.Pull = GPIO_PULLUP;           // Pull-up
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // High speed
        GPIO_InitStruct.Alternate = GPIO_AF7_USART1;  // Alternate function USART1
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       // Initialize PA9

        GPIO_InitStruct.Pin = GPIO_PIN_10;            // PA10 (RX)
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);       // Initialize PA10
    }
}

#if EN_USART1_RX  // If reception is enabled
/**
 * @brief USART1 interrupt service routine
 * @remark The code writes the interrupt control logic directly inside the ISR.
 *         Note: Using HAL library processing logic, efficiency is not high.
 *
 * @param void
 * @return void
 */
void USART1_IRQHandler(void)
{
    uint8_t Res;
    
    if ((__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET))  // Receive interrupt (received data must end with 0x0d 0x0a)
    {
        HAL_UART_Receive(&huart1, &Res, 1, 1000);
        if ((USART_RX_STA & 0x8000) == 0)  // Reception not completed
        {
            if (USART_RX_STA & 0x4000)  // Already received 0x0d
            {
                if (Res != 0x0a)
                    USART_RX_STA = 0;        // Receive error, restart
                else
                    USART_RX_STA |= 0x8000;  // Reception completed
            }
            else  // Has not received 0x0D yet
            {
                if (Res == 0x0d)
                    USART_RX_STA |= 0x4000;
                else
                {
                    USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res;
                    USART_RX_STA++;
                }
                if (USART_RX_STA > (USART_REC_LEN - 1))
                    USART_RX_STA = 0;  // Receive data error, restart reception
            }
        }
    }
    HAL_UART_IRQHandler(&huart1);
}
#endif

        usart1.h

#ifndef _USART_H
#define _USART_H
#include "stm32l4xx.h"
#include "stdio.h"
#define USART_REC_LEN 200 // Define maximum received bytes as 200
#define EN_USART1_RX 1    // Enable (1) / Disable (0) USART1 reception
extern uint8_t USART_RX_BUF[USART_REC_LEN]; // Receive buffer, maximum USART_REC_LEN bytes. Last byte is newline character
extern uint16_t USART_RX_STA;               // Receive status flag
extern UART_HandleTypeDef huart1;           // UART handle
#define RXBUFFERSIZE 1                      // Buffer size
extern uint8_t aRXBuffer[RXBUFFERSIZE];     // HAL library USART receive buffer
// If you want to use USART interrupt reception, do not comment the following macro definition
void uart1_init(uint32_t bound);
#endif

2.将保存好的usart1.c和usart1.h文件复制一份至Hardwares文件夹下

3.在项目管理窗口中,添加usart1.c,包含usart1路径。

4.当确定Hardware中已经包含usart1.c文件,需要将系统自动生成的usart文件删除。

5.在main.c对usart1进行初始化

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2026 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
//#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include "key.h"
#include "Led.h"
#include "Beep.h"
#include "usart1.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t KEY_Scan(uint8_t mode);
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
// GPIO????(??????????)
#define KEY0_Pin         GPIO_PIN_10
#define KEY0_GPIO_Port   GPIOD
#define KEY1_Pin         GPIO_PIN_9
#define KEY1_GPIO_Port   GPIOD
#define KEY2_Pin         GPIO_PIN_8
#define KEY2_GPIO_Port   GPIOD
#define WK_UP_Pin        GPIO_PIN_13
#define WK_UP_GPIO_Port  GPIOC

#define LED_R_Pin        GPIO_PIN_7
#define LED_R_GPIO_Port  GPIOE
#define LED_G_Pin        GPIO_PIN_8
#define LED_G_GPIO_Port  GPIOE
#define LED_B_Pin        GPIO_PIN_9
#define LED_B_GPIO_Port  GPIOE

#define BEEP_Pin         GPIO_PIN_2
#define BEEP_GPIO_Port   GPIOB
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
// ????????????
extern uint8_t USART_RX_BUF[200];
extern uint16_t USART_RX_STA;
extern UART_HandleTypeDef huart1;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  //MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	
	// ?????
	KEY_Init();
	BEEP_Init();
	LED_Init();
	uart1_init(115200);  // ?????1,???115200
	
	uint8_t len;
	uint32_t times = 0;  // ???times??
	uint8_t key_value;  // ????????
	
	// ??????
	printf("\r\n");
	printf("===============================================\r\n");
	printf("     STM32 IoT Development Board Test Program\r\n");
	printf("===============================================\r\n");
	printf("Serial Port: COM14 @115200bps\r\n");
	printf("Press Enter key to start testing...\r\n");
	printf("===============================================\r\n\r\n");
	
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		// ???????LED/???????
		key_value = KEY_Scan(1);
		
		switch (key_value){
			case 1:// KEY0??
			HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin); //????LED??
			break;
			case 2:// KEY1??
			HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin); //????LED??
			break;
			case 3: // KEY2??
			HAL_GPIO_TogglePin(LED_B_GPIO_Port, LED_B_Pin); //????LED??
			break;
			case 4: // WK_UP??
			HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);//???????
			break;
			
			default:

			break;
		}
		
		// ??10ms,??CPU???
		HAL_Delay(10);
		
		// ??LED????
		
		// LED????
		HAL_GPIO_TogglePin(LED_R_GPIO_Port,LED_R_Pin);
		HAL_Delay(500);
		HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_RESET);
		HAL_Delay(500);
		HAL_GPIO_WritePin(LED_G_GPIO_Port,LED_G_Pin,GPIO_PIN_SET);
		HAL_Delay(500);
		HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_RESET);
		HAL_Delay(500);
		HAL_GPIO_WritePin(LED_B_GPIO_Port,LED_B_Pin,GPIO_PIN_SET);
		HAL_Delay(500);
		
		// ?????
		HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_SET);//?????
		HAL_Delay (500);
		HAL_GPIO_WritePin(BEEP_GPIO_Port,BEEP_Pin,GPIO_PIN_RESET);//?????
		
		
		// ??????????
		
		// ??HAL_UART_Transmit??????
		const char *message ="USART1_test\r\n";
		HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), HAL_MAX_DELAY);
		
		// ??printf()?????????
		printf("Hello, IoT\r\n");
		printf("QLU\r\n");
		printf("2026Y1M5D Bo Wang\r\n");
		
		// ??printf()??JSON????
		float temperature = 25.5; //??
		int humidity = 60; //??
		printf("{\"temperature\": %.1f, \"humidity\": %d}\n", temperature, humidity);
		printf("\r\n");
		
		
		// ?????????????
		uint8_t key = KEY_Scan(0);	//????,mode=0???????
			switch (key)
			{
			case WKUP_PRES:	//WK_UP????
				HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);  // ??:??HAL_GPIO_TogglePin??
				printf("WKUP_PRES\r\n");
				break;

			case	KEY2_PRES:	//KEY2????,????LED
				HAL_GPIO_TogglePin(LED_B_GPIO_Port, LED_B_Pin);  // ??:??HAL_GPIO_TogglePin??
				printf("KEY2_PRES\r\n");
				break;
					
			case	KEY1_PRES:	//KEY1????,????LED
				HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin);  // ??:??HAL_GPIO_TogglePin??
				printf("KEY1_PRES\r\n");
				break;
			
			case	KEY0_PRES:	//KEY0????,????LED
				HAL_GPIO_TogglePin(LED_R_GPIO_Port, LED_R_Pin);  // ??:??HAL_GPIO_TogglePin??
				printf("KEY0_PRES\r\n");
				break;
		default:
				break;
		}
		
		// ????????
		if (USART_RX_STA & 0x8000) // ???????(bit15=1),??????
		{
			len = USART_RX_STA & 0x3fff; // ??????(?14?)
			printf("\r\nYour notice is:\r\n"); // ????,???????????
			HAL_UART_Transmit(&huart1, (uint8_t *)USART_RX_BUF, len, 1000); // ???????????
			// ????:
			// &huart1:????,??UART1
			// (uint8_t *)USART_RX_BUF:????????
			// len:???????
			// 1000:????(??:ms)
			while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != SET); // ??????
			// __HAL_UART_GET_FLAG():???????,UART_FLAG_TC ????????
			// ??????????,????????
			printf("\r\n\r\n"); // ?????,????,????????
			USART_RX_STA = 0; // ????????,???????
		} 
		else // ???????
		{
			times++; // ????1,????LED???????????
			
			if (times % 500 == 0) // ?5??????
			{
				printf("\r\n<IoT Engineering Practice and Management>Usart_Test\r\n"); // ??????
				printf("QLU\r\n\r\n\r\n"); // ??????
			}
			
			if (times % 200 == 0) // ?2??????
			{
				printf("Send data and finish with Enter key.\r\n"); // ??????
			}
			
			// ??LED_B????
			if (times % 30 == 0) HAL_GPIO_TogglePin(LED_B_GPIO_Port, LED_B_Pin); // ?300ms????LED_B???
			// HAL_GPIO_TogglePin:?? LED ????(?/?),???????????
			
			HAL_Delay(10); // ?? 10 ms,?CPU????
		}
	}
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
  {
    Error_Handler();
  }

  /** 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.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = 1;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  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_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
uint8_t KEY_Scan(uint8_t mode){
	// ????????,???????
	if (HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == GPIO_PIN_RESET){
		HAL_Delay(20);//????
		if (HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == GPIO_PIN_RESET){
			while (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET);//??????
			return 1;//??KEY0??
		}
	}
	//??KEY1?(?????)
	if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){
		HAL_Delay(20);//????
		if (HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == GPIO_PIN_RESET){
			while (HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET);//??????
			return 2;//??KEY1??
		}
	}
	if (HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET){
		HAL_Delay(20);//????
		if (HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == GPIO_PIN_RESET){
			while (HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET);//??????
			return 3;//??KEY2??
		}
	}
	//??WK_UP?(?????)
	if (HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == GPIO_PIN_SET) {
		HAL_Delay(20);//????
		if (HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == GPIO_PIN_SET){
			while (HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == GPIO_PIN_SET); //??????
			return 4;//??WK_UP??
		}
	}
	return 0;//?????
}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

6.编译用下载文件至开发板,接收按键指令后自动发送预存的信息。

STM32L496 UART通信HAL库实现实战 微控制器(MCU)是嵌入式系统设计的核心,它集成了处理器核心、内存、外设和输入输出接口。STM32L496微控制器是STMicroelectronics(意法半导体)推出的高性能超低功耗系列中的一员,属于Cortex-M4内核。它的运算速度快,低功耗,丰富的功能模块和高度的集成度使其广泛应用于物联网、医疗、消费电子等领域。在设计高效能的嵌入式系统时,理解STM32L496的功能特性是十分必要的。在本章中,我们将探讨STM32L496微控制器的主要特点和优势,并概述其架构。 阅读详情

相关推荐

STM32L496 KIT.zip

STM32L496ZGTx KIT STM32L496RETx 开发板光盘资料(所有文档),欢迎下载!

STM32L475潘多拉开发板RT Thread实验3_按键输入例程

STM32L475潘多拉开发板 RT Thread 实验2,按键功能的实现。

Whisper_0102的博客 763

STM32L431 HAL库开发例程.rar

STM32L431 HAL库开发例程 ,包括GPIO-Exti/FLASH/ADC/Sleep/ShutDown/LpRun 例程,以上代码已应用于项目,正确无误。

基于正点原子潘多拉STM32L496开发板的简易示波器

基于正点原子潘多拉STM32L496开发板的简易示波器

努力写BUG的博客 3446

STM32L496实现基于TF卡的文件系统【RT-Thread工程,支持STM32L4系列单片机】.zip

STM32L496驱动程序,基于RT-Thread操作系统实现。 支持STM32L4系列单片机编译和运行。 项目代码可顺利编译运行~

CH32V307 FreeRTOS任务挂起与恢复【支持CH32系列处理器】

CH32V307驱动程序,支持移植到CH32系列单片机。 一分价钱一分货,项目代码可顺利编译运行~

STM32L4

IoT Board是正点原子、RT-Thread联合推出的一款基于ARM Cortex-M4内核的开发板,最高主频为80MHz,该开发板具有丰富的板载资源,可以充分发挥STM32L475的芯片性能。MCU:STM32L475,主频80MHz,512KB FLASH,128KB SRAM。外部FLASH:W25Q128(SPI,128M)

Caramel_biscuit的博客 1362

史上最全面的STM32L496G-DISCO资料整理-电路方案

广大的蝴蝶粉们,要想能愉快的玩耍,首先肯定得要熟悉ST推出的的STM32L496G-DISCO这款开发板啦!偶然的机会在网上看到一个好心的网友整理的STM32L496G-DISCO的资料大礼包,几乎整理了这个板子的所有资源,堪称比官网还全面啊,借电路城的平台,将这个资料包分享给更多的网友,再也不用费力去搜索STM32L496G-DISCO的资料啦! L496G-DISCO 是ST推出的一款基于Cortex-M4内核微控制器的综合演示和开发平台,主控STM32L496AGI6 不但拥有优秀的的低功耗特性而且在性能方面也丝毫不落下风,这样的配置使STM32L49x可应用于音频、视频播放,功耗敏感但对处理器性能有一定需求的产品上。 想了解更多资料的直接下载附件咯! 附件部分内容截图:

潘多拉 STM32L475 VE——开发板学习

首先就是开发板的各个硬件的介绍: ◆ MCU:STM32L475VET6,LQFP100,SRAM:128K,FLASH:512K ◆ 外扩 SPI FLASH:W25Q128,16M 字节 ◆ 1 个电源指示灯(蓝色) ◆ 1 个 RGB 状态指示灯(红、绿、蓝三色) ◆ 4 个功能按钮,其中 WK_UP 兼具唤醒功能 ◆ 1 个启动模式配置选择接口 ◆ 1 个复位按钮 ◆ 1 个红外接收头,并配备一款小巧的红外遥控器 ◆ 1 个红外发射头 ◆...

m0_52249955的博客 7570

从工艺到器件:用Silvaco ATLAS仿真PIN二极管击穿电压的保姆级指南

本文详细介绍了使用Silvaco ATLAS仿真PIN二极管击穿电压的全流程指南,从工艺仿真基础搭建到器件结构构建,再到击穿特性仿真和结果分析。通过Silvaco工具链,工程师可以在设计阶段精准预测器件性能,优化击穿电压,提升研发效率。

weixin_34259816的博客 356

异步复位同步释放:如何确保复位信号的可靠性与时序安全

本文深入探讨了异步复位同步释放技术在数字电路设计中的关键作用,详细分析了复位信号的可靠性与时序安全问题。通过对比异步复位与同步复位的本质区别,揭示异步复位的优势与潜在风险,并提供了标准的Verilog实现方案。文章还涵盖了多时钟域下的复位同步策略、复位网络时序约束方法以及实际工程中的经验教训,为数字系统设计者提供了全面的复位信号处理指南。

weixin_29213655的博客 402

STM32L475潘多拉开发板RT Thread实验4_电机和蜂鸣器

STM32L475潘多拉开发板RT Thread嵌入式系统实验4,电机和蜂鸣器的实现。

Whisper_0102的博客 987

ANSYS APDL实战:手把手教你搞定电磁-热耦合分析(附完整命令流)

本文通过一个工业感应加热线圈的实战案例,手把手教你使用ANSYS APDL完成电磁-热耦合分析。内容涵盖从几何建模、材料定义、网格划分到加载求解及后处理的完整流程,重点讲解了使用PLANE13单元进行双向耦合场分析的方法与命令流调试技巧,助力工程师快速掌握这一核心仿真能力。

weixin_29284201的博客 427

潘多拉STM32L4 96 IoT开发板(HAL库) 5.利用中断机制实现串口的收发信息

本文介绍了Java串口通信中的中断机制实现方法。主要内容包括:1)采用双缓冲接收机制,设计了200字节的静态缓冲区和单字节中断缓冲区;2)使用状态寄存器USART_RX_STA实现状态机同步机制,包含接收完成标志、错误标志和字节数信息;3)在中断服务程序中实现数据接收和状态更新,主循环中进行数据处理和状态复位;4)通过多级任务调度实现LED指示、用户提示等功能。该系统通过中断与主循环的协同工作,在有限资源下实现了可靠的串口通信,体现了嵌入式系统设计的核心思想。

Dodger_code的博客 864

深度学习中的编码器-解码器架构

解码的作用:转换为人类可理解的形式,解码器的任务是将编码器生成的中间表示(上下文向量)转换回人类可理解的输出形式(如翻译后的文本、生成的图像描述等)。解码器通过逐步生成输出序列,使得最终的输出符合人类的理解和需求。编码的作用:转换为机器可理解的形式,编码器将输入数据(如文本、图像等)转换为一种机器更容易处理和理解的形式,即上下文向量或编码。在深度学习中,编码器(Encoder)解码器(Decoder)是常见的神经网络架构,通常用于处理序列到序列(seq2seq)任务,如机器翻译、文本摘要和图像描述等。

xxk1323的博客 1093

使用 Mid360 从零开始搭建实物机器人入门级导航系统 —— 基于 Fast_Lio 和 Move_Base

本文详细介绍了如何使用Mid360机器人从零开始搭建一个基于Fast_Lio和Move_Base的入门级导航系统。通过配置 ROS2、集成激光雷达、IMU、Fast_Lio、Move_Base 等模块,我们成功构建了一个能够实现自动导航的机器人系统。在实际开发中,随着需求的变化,你可以不断调整参数、优化路径规划算法、增加新的传感器等,逐步提升机器人的智能与功能。

小蜗牛的珍贵百宝箱 3567

潘多拉STM32L4 96 IoT开发板(HAL库) 2.串口通信实验

掌握USART串口 入门知识。

Dodger_code的博客 661

拆开一个烧坏的IGBT模块,手把手教你识别过压、过流、过温的“案发现场”

本文详细解析了IGBT模块失效分析的实战技巧,通过观察铝层熔化纹路、焊锡溢出形态等物理痕迹,手把手教你识别过压、过流、过温的典型失效模式。文章提供了从基础工具包到现场快速诊断的完整流程,帮助工程师精准定位IGBT模块失效的根本原因。

weixin_30655569的博客 427

潘多拉STM32L4 96 IoT开发板(HAL库) 1.点亮三色RGB

6.进入Project Manager对文件名称,文件位置进行保存,生成初始文件并自动跳转到keil。按照下图对三个引脚的GPIO进行配置。4.根据芯片原理图找到RGB灯的引脚分别为PE7、PE8、PE9。8.编译文件并下载到开发板上,以下是运行效果图。1.启动stm32cubeMX,创建工程。设置GPIO为output。3.修改时钟配置,修改时钟为外部时钟。2.搜索stm32L496 芯片。

Dodger_code的博客 416

【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇1(附项目源码)

生存和射击游戏一直是我的最爱,说起3D最普遍的应该就是射击系统了,你可以在任何情况下加入射击功能,所以我写下了这篇FPS开发记录。希望对你有帮助。在这个项目中,你将学习如何设计和实现射击系统、武器系统、玩家控制、场景设计等方面的内容。通过这个项目,你将深入了解游戏开发中的许多核心概念和技术,并且在实践中不断提升自己。本项目将带你从零开始逐步实现一个完整的第一人称射击游戏,并且会逐步引入一些高级功能,如特效、声音等。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5501

C#实现将DataGridView中数据导出到Excel (附完整源码)

C#实现将DataGridView中数据导出到Excel (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1589

基于STM32CubeMX创建STM32L496ZGTx的工程

基于ST官方推出的工具STM32CubeMX创建STM32L496ZGTx的MDK-ARM工程

陈海峰的博客 2475

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

如何在keil中STM32L496 跑simulator 不需要开发板跑RTTHREAD

如何不用开发板就可以KEIL跑STM32L496呢?

supperThomas的专栏 1778

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【STM32L496】HAL库实现HART协议收发数据(AD5700)

HART (Highway Addressable Remote Transducer)协议采用基于 Bell202 标准的 FSK频 移键控信号,在低频的 4-20mA模拟信号上叠加幅度为 0.5mA的音频数字信号进行双向数字通讯,数据传输率为1200bps。

kiro_1023的博客 6060

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

基于STM32L496的低功耗ADXL345加速度读取、TMP75温度检测

基于STM32L496的低功耗ADXL345加速度读取、TMP75温度检测

Mike Zhou的博客 1164

【STM32】 ADC 完全指南:从模拟信号采样量化到五大架构原理

本文系统介绍ADC核心概念与五大主流架构。模拟信号具时间与幅值连续性,需经采样(满足奈奎斯特准则防混叠)、量化(引入±1/2LSB误差,SNR≈6.02N+1.76dB)、编码三步转为数字信号。重点解析Flash(并行高速但受限于比较器数量)、SAR(逐次逼近,低功耗适合MCU如STM32)、双积分(高精度抗工频,用于万用表)、流水线(高速吞吐)及Σ-Δ(高分辨率,靠过采样与噪声整形)五类架构原理、优缺点与应用场景。强调分辨率≠精度,选型本质是速度、精度、功耗与面积的权衡。

专注后端与底层技术,分享实战干货与学习笔记,梦想进入字节跳动,步履不停,热爱不止。 519
上一篇: 潘多拉STM32L4 96 IoT开发板(HAL库) 5.利用中断机制实现串口的收发信息
下一篇: 1.从电平到RISC-V:单片机与嵌入式处理器入门指南
硅基造物主
博客等级 码龄4年 17粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值