从零到一:蓝桥杯嵌入式竞赛的模版搭建心法与避坑指南

蓝桥杯电子类竞赛总览 蓝桥杯电子类竞赛总览前言一、1.两块LoRa终端2.外设二、软件认识1.Cube MX2.keil5三、赛方提供总结 前言 蓝桥杯电子类竞赛分为四个类别,分别是单片机设计与开发、嵌入式设计与开发、物联网设计与开发和EDA设计与开发 一、 1.两块LoRa终端 ●设计 基于ARM Cortex M0+微控制器STM32L071KBU,具有128Kbytes Flash 存储器、6Kbyte EEPROM存储器和20Kbyte RAM存储器,QFPN32 封装 ●5V 电源供电,支持通过供电探针或CMSIS 阅读详情

从零到一:蓝桥杯嵌入式竞赛的模版搭建心法与避坑指南

第一次参加蓝桥杯嵌入式竞赛的选手,往往会在模版搭建阶段遇到各种意想不到的问题。从时钟配置到外设驱动,从中断处理到通信协议,每一步都可能隐藏着让项目停滞不前的“暗坑”。作为一名曾经在实验室熬夜调试的过来人,我深知一个稳定可靠的模版对竞赛成功的重要性。本文将分享一套经过实战检验的模版搭建方法论,帮助初学者避开常见陷阱,快速构建高效可靠的嵌入式系统基础。

1. 环境搭建与基础配置

嵌入式竞赛的第一步是搭建开发环境,但这往往比想象中复杂。很多选手直接使用默认配置,导致后续出现各种难以排查的问题。

1.1 时钟树配置的艺术

时钟是嵌入式系统的心跳,错误的时钟配置会导致整个系统运行不稳定。蓝桥杯官方板通常使用STM32系列微控制器,时钟树配置需要特别注意:

关键配置参数:

  • 系统时钟源选择:建议使用外部晶振(HSE)作为主时钟源
  • PLL配置:确保倍频参数正确,达到预期的系统频率
  • 外设时钟分频:根据外设需求合理分配时钟频率

注意:ADC时钟通常需要独立配置,很多选手忽略了ADC时钟与系统时钟的关联性,导致采样精度不足。

// 时钟错误配置示例(常见问题)
SystemClock_Config();
// 忘记单独配置ADC时钟
// 导致ADC采样率不正确

正确的做法是在系统时钟配置后,单独检查和配置外设时钟:

// 正确的时钟配置流程
void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
    // 配置HSE和PLL
    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 = 25;
    RCC_OscInitStruct.PLL.PLLN = 336;
    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
    RCC_OscInitStruct.PLL.PLLQ = 7;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);
    
    // 配置CPU和总线时钟
    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_DIV4;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
    
    // 特别配置ADC时钟
    __HAL_RCC_ADC_CONFIG(RCC_ADCPCLK2_DIV6);
}

1.2 GPIO配置的细节把控

GPIO看似简单,但配置不当会导致信号不稳定、功耗异常等问题。蓝桥杯竞赛中常用的LED、按键等外设都需要精确的GPIO配置。

常见GPIO配置误区:

  • 输出模式选择错误(推挽 vs 开漏)
  • 上下拉电阻配置不当
  • 输出速度设置不合理
  • 锁存器控制忽略
外设类型推荐模式输出速度上下拉注意事项
LED控制推挽输出中等速度无注意锁存器控制引脚
按键输入上拉输入低速上拉需要软件去抖动
I2C引脚开漏输出低速上拉需要外部上拉电阻
ADC输入模拟输入低速无避免数字干扰

2. 外设驱动开发与调试

外设驱动是嵌入式系统的核心,也是出现问题最多的环节。

2.1 ADC采样精度优化

ADC采样结果不准确是常见问题,通常由多种因素导致:

影响ADC精度的因素:

  • 参考电压稳定性
  • 采样时间设置
  • 电源噪声干扰
  • PCB布局和布线
// ADC采样优化示例
uint16_t get_adc_value(ADC_HandleTypeDef* hadc)
{
    uint16_t adc_value = 0;
    uint32_t sum = 0;
    
    // 多次采样取平均
    for(int i = 0; i < 16; i++)
    {
        HAL_ADC_Start(hadc);
        HAL_ADC_PollForConversion(hadc, 10);
        sum += HAL_ADC_GetValue(hadc);
        HAL_ADC_Stop(hadc);
    }
    
    adc_value = sum >> 4; // 除以16
    return adc_value;
}

提示:在ADC采样前加入短暂延时,可以让采样电容充分充电,提高采样精度。

2.2 定时器应用实战

定时器是嵌入式系统中最复杂的外设之一,特别是PWM生成和输入捕获功能。

定时器配置关键点:

  • 时基单元配置(预分频器、自动重载值)
  • 输出比较模式设置
  • 输入捕获边沿选择
  • 中断优先级配置
// PWM配置示例:生成1kHz,占空比40%的方波
void pwm_init(TIM_HandleTypeDef* htim)
{
    TIM_OC_InitTypeDef sConfigOC = {0};
    
    htim->Instance = TIM2;
    htim->Init.Prescaler = 80 - 1;    // 分频后1MHz
    htim->Init.CounterMode = TIM_COUNTERMODE_UP;
    htim->Init.Period = 1000 - 1;     // 1kHz频率
    htim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    HAL_TIM_PWM_Init(htim);
    
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 400;            // 40%占空比
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    HAL_TIM_PWM_ConfigChannel(htim, &sConfigOC, TIM_CHANNEL_1);
    
    HAL_TIM_PWM_Start(htim, TIM_CHANNEL_1);
}

输入捕获频率测量:

// 测量输入信号频率
volatile uint32_t capture1 = 0, capture2 = 0;
volatile uint32_t difference = 0;
volatile float frequency = 0;

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
    {
        if(capture1 == 0)
        {
            capture1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
        }
        else
        {
            capture2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
            difference = (capture2 > capture1) ? (capture2 - capture1) : 
                        (0xFFFF - capture1 + capture2);
            frequency = 1000000.0 / difference; // 假设定时器时钟为1MHz
            capture1 = capture2;
            capture2 = 0;
        }
    }
}

3. 通信协议实现要点

I2C、UART等通信协议在嵌入式竞赛中广泛应用,但也是故障高发区。

3.1 I2C通信可靠实现

I2C总线通信失败通常由时序问题、地址错误或总线冲突导致。

I2C实现常见问题及解决方案:

  1. 时序问题:严格遵循I2C时序规范,适当加入延时
  2. 地址错误:注意7位地址和8位地址的区别
  3. 总线冲突:实现总线检测和重试机制
  4. 上拉电阻:确保物理上拉电阻值合适
// 可靠的I2C写入函数
HAL_StatusTypeDef i2c_write_memory(uint8_t dev_addr, uint8_t mem_addr, uint8_t* data, uint8_t size)
{
    HAL_StatusTypeDef status;
    uint8_t retry = 3;
    
    while(retry--)
    {
        status = HAL_I2C_Mem_Write(&hi2c1, dev_addr, mem_addr, 
                                  I2C_MEMADD_SIZE_8BIT, data, size, 100);
        if(status == HAL_OK)
            break;
        
        // 总线恢复操作
        i2c_bus_recovery();
        HAL_Delay(1);
    }
    
    return status;
}

// I2C总线恢复函数
void i2c_bus_recovery(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    // 配置SDA和SCL为通用输出
    GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; // SDA, SCL
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    // 模拟I2C总线恢复序列
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); // SDA高
    for(int i = 0; i < 9; i++)
    {
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); // SCL低
        HAL_Delay(1);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); // SCL高
        HAL_Delay(1);
    }
    
    // 发送停止条件
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET); // SDA低
    HAL_Delay(1);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); // SCL高
    HAL_Delay(1);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET); // SDA高
    HAL_Delay(1);
    
    // 恢复I2C引脚功能
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

3.2 串口通信实战技巧

串口通信是调试和数据显示的重要工具,稳定的串口通信能大大提高开发效率。

串口配置要点:

  • 波特率精度要求
  • 中断优先级设置
  • 数据缓冲区管理
  • 流控制机制
// 可靠的串口数据发送
#define UART_TX_BUFFER_SIZE 256

typedef struct {
    uint8_t buffer[UART_TX_BUFFER_SIZE];
    uint16_t head;
    uint16_t tail;
    uint16_t count;
} uart_tx_buffer_t;

uart_tx_buffer_t tx_buffer;

void uart_send_string(const char* str)
{
    uint16_t len = strlen(str);
    for(uint16_t i = 0; i < len; i++)
    {
        // 循环缓冲区写入
        tx_buffer.buffer[tx_buffer.head] = str[i];
        tx_buffer.head = (tx_buffer.head + 1) % UART_TX_BUFFER_SIZE;
        tx_buffer.count++;
    }
    
    // 如果串口空闲,启动发送
    if(huart1.gState == HAL_UART_STATE_READY)
    {
        uart_start_transmit();
    }
}

void uart_start_transmit(void)
{
    if(tx_buffer.count > 0)
    {
        uint16_t to_send = (tx_buffer.head > tx_buffer.tail) ? 
                          (tx_buffer.head - tx_buffer.tail) :
                          (UART_TX_BUFFER_SIZE - tx_buffer.tail);
        
        to_send = (to_send > 64) ? 64 : to_send; // 每次最多发送64字节
        
        HAL_UART_Transmit_DMA(&huart1, &tx_buffer.buffer[tx_buffer.tail], to_send);
        tx_buffer.tail = (tx_buffer.tail + to_send) % UART_TX_BUFFER_SIZE;
        tx_buffer.count -= to_send;
    }
}

// DMA发送完成回调
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        uart_start_transmit();
    }
}

4. 系统整合与调试策略

单个模块调试通过后,系统整合阶段会出现新的问题,需要系统化的调试方法。

4.1 中断优先级管理

中断冲突是嵌入式系统中最难调试的问题之一,合理的中断优先级配置至关重要。

中断优先级配置原则:

  • 系统关键中断(如看门狗)设置最高优先级
  • 实时性要求高的外设中断(如PWM)设置较高优先级
  • 非关键外设中断设置较低优先级
  • 避免中断嵌套过深
// 中断优先级配置示例
void set_interrupt_priorities(void)
{
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);        // 系统滴答定时器最高优先级
    
    // 关键外设中断
    HAL_NVIC_SetPriority(ADC_IRQn, 1, 0);
    HAL_NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 1, 0);
    
    // 一般外设中断
    HAL_NVIC_SetPriority(USART1_IRQn, 2, 0);
    HAL_NVIC_SetPriority(I2C1_EV_IRQn, 3, 0);
    HAL_NVIC_SetPriority(EXTI9_5_IRQn, 3, 0);
    
    // 低优先级中断
    HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 4, 0);
}

4.2 系统调试与性能优化

完善的调试机制能大幅提高开发效率,特别是在竞赛时间紧张的情况下。

调试信息输出函数:

// 多级调试信息输出
typedef enum {
    DEBUG_LEVEL_ERROR = 0,
    DEBUG_LEVEL_WARNING,
    DEBUG_LEVEL_INFO,
    DEBUG_LEVEL_DEBUG
} debug_level_t;

debug_level_t current_debug_level = DEBUG_LEVEL_INFO;

void debug_print(debug_level_t level, const char* format, ...)
{
    if(level > current_debug_level)
        return;
    
    char buffer[128];
    va_list args;
    va_start(args, format);
    vsnprintf(buffer, sizeof(buffer), format, args);
    va_end(args);
    
    // 添加级别前缀
    const char* level_str[] = {"[ERROR] ", "[WARN]  ", "[INFO]  ", "[DEBUG] "};
    uart_send_string(level_str[level]);
    uart_send_string(buffer);
    uart_send_string("\r\n");
}

// 使用示例
debug_print(DEBUG_LEVEL_INFO, "ADC value: %d", adc_value);
debug_print(DEBUG_LEVEL_DEBUG, "I2C transaction completed");

性能监控机制:

// CPU使用率监控
volatile uint32_t system_ticks = 0;
volatile uint32_t idle_ticks = 0;

void SysTick_Handler(void)
{
    system_ticks++;
    HAL_IncTick();
}

void idle_task(void)
{
    while(1)
    {
        idle_ticks++;
        __WFI(); // 等待中断,进入低功耗模式
    }
}

float get_cpu_usage(void)
{
    static uint32_t last_system_ticks = 0;
    static uint32_t last_idle_ticks = 0;
    
    uint32_t current_system_ticks = system_ticks;
    uint32_t current_idle_ticks = idle_ticks;
    
    uint32_t delta_system = current_system_ticks - last_system_ticks;
    uint32_t delta_idle = current_idle_ticks - last_idle_ticks;
    
    last_system_ticks = current_system_ticks;
    last_idle_ticks = current_idle_ticks;
    
    if(delta_system == 0) return 0;
    
    return (1.0 - (float)delta_idle / delta_system) * 100.0;
}

在实际项目中,我发现最有效的调试方法是在开发初期就建立完善的日志系统

从零到省一:蓝桥杯嵌入式竞赛的备赛心法与实战拆解 本文分享了作者从零开始备战蓝桥杯嵌入式竞赛并荣获省一等奖的实战经验与备赛心法。内容涵盖基础环境搭建、系统框架设计、外设驱动开发、调试技巧与时间管理策略,为参赛者提供了一套高效的备赛方法论,重点解析了嵌入式系统设计与省赛实战中的关键技术要点。 阅读详情

相关推荐

蓝桥杯嵌入式:从零到一的考场环境搭建与避坑指南

本文详细介绍了蓝桥杯嵌入式比赛的考场环境搭建与避坑指南,涵盖Keil MDK安装配置、STM32CubeMX离线部署等关键步骤。针对无网络、低性能等考场特点,提供实战技巧和压力测试方案,帮助选手高效备赛。重点解决嵌入式开发中的环境配置难题,确保比赛顺利进行。

weixin_30652897的博客 399

从零到一:蓝桥杯嵌入式竞赛环境搭建的避坑指南与效率优化

本文提供蓝桥杯嵌入式竞赛环境搭建的详细指南,基于STM32G4芯片,重点讲解CubeMX和MDK5工具链的配置优化。涵盖时钟配置、调试接口设置、外设驱动集成及常见问题解决方案,帮助参赛者高效避坑,提升开发效率。

moss5的博客 804

从零到一:蓝桥杯嵌入式竞赛中的STM32G431开发实战指南

本文详细介绍了蓝桥杯嵌入式竞赛中STM32G431开发的全流程,从开发环境搭建、核心外设驱动开发到典型模块实战,涵盖GPIO、USART、ADC等关键技术的实现方法。通过实战案例和调试技巧,帮助参赛者快速掌握STM32G431开发,提升竞赛表现。

docker7nomad的博客 920

从零到一:蓝桥杯嵌入式竞赛的底层驱动开发心法与避坑指南

本文详细解析蓝桥杯嵌入式竞赛中底层驱动开发的核心技巧与常见陷阱,涵盖环境配置、输入捕获、按键处理、LCD显示优化及系统稳定性策略。通过实战案例和代码示例,帮助选手掌握嵌入式开发心法,提升竞赛表现。

sky77的博客 615

蓝桥杯竞赛环境搭建全攻略:从通用软件到嵌入式开发的避坑指南

在软件开发与算法竞赛中,一个稳定、可靠的开发环境是高效编码与调试的基础。其核心原理在于确保编译器、解释器、依赖库及IDE配置与目标运行环境的一致性,以避免因版本差异、路径错误或依赖缺失导致的编译失败或运行时异常。对于技术实践而言,提前搭建并验证标准化环境,能显著提升代码的可移植性和开发效率,尤其在时间紧迫的竞赛场景下价值凸显。常见的应用场景包括算法竞赛、嵌入式开发及EDA设计等标准化考试或项目交付。本文聚焦蓝桥杯竞赛,针对C++、Java、Python等软件类赛道及STM32等嵌入式赛道,详细解析环境搭建流

weixin_34241036的博客 574

基于Matlab与Gurobi的园区微电网风光储协同规划:从独立运营到联合优化的建模实战

本文详细介绍了如何利用Matlab与Gurobi进行园区微电网的风光储协同规划建模实战。通过构建从独立运营到联合优化的数学模型,结合Yalmip工具箱,旨在解决源荷不匹配问题,实现储能系统的最优配置与运行,从而降低总供电成本并提升新能源利用率。

weixin_29053073的博客 142

蓝桥杯嵌入式竞赛实战:从零构建高效开发模版

本文详细介绍了蓝桥杯嵌入式竞赛的开发环境搭建与实战技巧,重点讲解基于STM32CubeMX的模版搭建方法,涵盖GPIO、串口、ADC、定时器等外设配置优化,并提供代码封装与调试策略,帮助参赛者快速构建高效开发模版,提升竞赛开发效率。

qq_27496129的博客 786

1 四种防反接电路——multisim仿真

摘要:防反接电路可防止电源反接损坏器件,主要有四种方案:1)二极管串联(低成本,适用小电流);2)整流桥(无极性输入,但效率低);3)保险丝+稳压管(低损耗但需更换);4)MOS管方案(大电流、高效率,主流选择)。选型需考虑电流、压降和成本,MOS管因其低导通电阻(毫欧级)成为大电流应用的首选。口诀:"小电流二极管,大电流用MOS"可快速指导设计。

XU157303764的博客 1574

从零到一:蓝桥杯嵌入式竞赛环境搭建与避坑指南

本文详细介绍了蓝桥杯嵌入式竞赛环境的完整搭建流程,重点解析了STM32G4开发中CubeMX与MDK5的配置要点、官方资源包的正确引入方式以及常见外设的实战技巧。通过系统性的环境配置指导和避坑经验分享,帮助参赛者快速构建稳定可靠的开发环境,为竞赛成功奠定坚实基础。

life6的博客 257

ardupilot 获取避障传感器数据

本节主要记录自己学ardupilot的避障代码过程,首先看下怎么注册避障传感器,然后怎么获取避障数据。

陌城烟雨 5525

YOLOv9分割训练自己数据和推理训练好模型,并教你使用Labelme工具标注数据(附YOLOv9分割模型结构图),全网最详细教程

YOLOv9 通过研究数据传输时的信息丢失问题,提出了可编程梯度信息(PGI)和通用高效层聚合网络(GELAN)架构,提高了参数利用率和模型性能。与 SOTA 方法相比,GELAN 仅使用传统卷积算子即可实现更好的参数利用率。PGI 适用于从轻型到大型的各种模型,使从头开始训练的模型能够获得更好的结果。YOLOv9 被评价为新的 SOTA 实时目标检测器。接下来本文手把手教你训练自己分割数据集和推理训练好的分割模型。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1493

从零到一:蓝桥杯嵌入式竞赛的底层驱动开发心法

本文深入解析蓝桥杯嵌入式竞赛中的底层驱动开发核心技术,涵盖环境搭建、输入捕获、按键状态机、中断管理和调试优化等关键环节。通过实战代码示例和系统整合策略,帮助参赛者避开常见陷阱,提升代码质量和稳定性,为蓝桥杯嵌入式竞赛提供全面的开发指导。

pea55的博客 848

uniapp - 超详细 H5 网页引入百度地图教程,附地图示例 / 获取当前设备定位的省市区、详细地址、经纬度信息 / 用户当前 IP 属地定位地理位置等等(新手小白快速上手,详细配置及使用全流程)

uniapp百度地图,uniapp百度地图ip属地定位,uniapp百度地图获取省市区详细地址经纬度等,uniapp百度地图当前用户设备定位省份市区详细所在地ip属地等详细教程示例,uniapp网页h5引入百度地图详细教程,uniapp h5网站使用百度地图详细教程,uniappH5端如何接入使用百度地图api,uniapp H5网页端百度地图获取地理位置信息,uniapp h5页面引入百度地图,uniapp h5平台百度地图获取城市信息,uniapp百度地图获取经纬度,uniapp 百度地图拿省市区用什么

🏆 前端领域优质创作者 6219

从零到一:蓝桥杯嵌入式竞赛中TIM定时器的实战避坑指南

本文针对蓝桥杯嵌入式竞赛中TIM定时器的常见问题,提供实战避坑指南。详细解析定时器时钟源选择、预分频器与自动重装载值的关系,以及中断配置、PWM输出、输入捕获等关键环节的配置要点和调试技巧,帮助选手高效应对竞赛中的定时器任务挑战。

rice5的博客 996

飞牛NAS新增虚拟机功能,如果使用虚拟机网卡直通安装ikuai软路由(如何解决OVS网桥绑定失败以及打开ovs后无法访问飞牛nas等问题)

飞牛NAS新增虚拟机功能,如果使用虚拟机网卡直通安装ikuai软路由

XiaoqiangClub的博客 1万+

使用 Visual Studio Code 搭建 SAP UI5 本地开发环境

工欲善其事,必先利其器。时至今日,SAP 提供了非常多的 SAP UI5 开发工具,既包含本地搭建的,也包含浏览器里远端使用的工具,比如 WebIDE 和 Business Application Studio. 我们访问下面这个链接,就能找到所有这些工具的安装或者配置步骤: https://tools.hana.ondemand.com/#sapui5 如果想选择本地开发,SAP 推荐的工具是 Visual Studio Code,也就是本文要介绍的内容。 也可以下载 WebIDE 的本地安装包,将其安

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1万+

从零到一:蓝桥杯嵌入式竞赛开发板跳帽配置实战指南

本文详细介绍了蓝桥杯嵌入式竞赛中STM32G431RBT6开发板的跳帽配置实战指南。从电源选择、信号路由到功能使能,系统解析核心跳帽区域配置流程,并提供典型故障排查方法与竞赛管理策略,帮助选手避免常见硬件错误,确保外设模块正常工作。

z5a6b的博客 565

Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.7 摄像头V4L2驱动开发流程总结

1.概述前几章对摄像头V4L2驱动开发各个环节做了展开分析,这一章节就做一个汇总,用来回顾前几章得知识点,概括一下摄像头开发得流程,本次使用RK3399。2.SensorSub-device开发移植Sensor驱动位于目录下,注意到本章节所描述的是具有属性的sensor驱动,故目录下的驱动并不适用。在结构下,Sensor一般作为sub-device并通过pad与cif、isp或者mipiphy链接在一起。本章主要介绍Sensor驱动的代码[1],dts配置,及如何验证sensor5个部分。...

DSMGUOGUO的博客 3731

从零到一:蓝桥杯嵌入式开发环境搭建的避坑指南与效率优化

本文详细介绍了蓝桥杯嵌入式开发环境搭建的全流程,重点解析了STM32CubeMX与Keil5的版本匹配、安装顺序、路径设置及工程配置中的常见问题与解决方案,并提供调试技巧与性能优化策略,帮助开发者高效避坑并提升竞赛开发效率。

u6v7w8x的博客 580

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

从零到一:蓝桥杯嵌入式竞赛的模块化思维构建与实战拆解

本文详细解析了蓝桥杯嵌入式竞赛中的模块化思维构建方法,通过LED控制、LCD显示、按键处理等核心模块的实战拆解,帮助参赛者系统掌握嵌入式开发技巧。文章提供了完整的代码示例和调试策略,助力选手高效备赛,提升在蓝桥杯嵌入式竞赛中的实战能力。

tech5的博客 986

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

从零到一:蓝桥杯嵌入式PWM输出实战与避坑指南

本文详细介绍了蓝桥杯嵌入式竞赛中PWM输出的实战应用与常见问题解决方案。从PWM技术基础、硬件连接到定时器参数计算,全面解析STM32平台下的配置要点,并提供智能小车电机控制等实战案例,帮助开发者避开常见陷阱,提升嵌入式系统设计能力。

raspberrypi5的博客 330

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从零到一:蓝桥杯嵌入式竞赛中的DMA高效应用实战指南

本文详细介绍了在蓝桥杯嵌入式竞赛中如何高效应用DMA技术,基于STM32G431RBT6平台,涵盖DMA基础、ADC多通道扫描、UART通信及定时器PWM等实战场景。通过HAL库配置示例和优化策略,帮助开发者降低CPU负载,提升系统性能,解决常见配置问题,助力竞赛项目脱颖而出。

desk3的博客 976

从零到省一:蓝桥杯嵌入式竞赛的代码架构设计与调试心法

本文详细解析蓝桥杯嵌入式竞赛的代码架构设计与调试方法,涵盖模块化分层、外设驱动实现、状态机设计等核心技巧。通过真题代码解析,帮助选手掌握高效调试与性能优化策略,实现从零基础到省级一等奖的突破。

gitlab7runner的博客 761
上一篇: STC8G1K08A与HX711在智能体重秤中的低功耗设计与实现
下一篇: RV1126开发板rknn-toolkit-lite环境搭建与性能优化实战
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值