你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【文末有奖】18年,出货150亿颗,STM32何以深入人心  

[复制链接]
STMCU-管管 发布时间:2026-1-4 09:28
阅读主题, 点击返回1楼
1 收藏 1 评论56 发布时间:2026-1-4 09:28
56个回答
youngq 回答时间:2026-1-16 20:54:11

恭喜STM32出货150亿颗,做大做强再创辉煌~~~

wtliu 回答时间:2026-1-18 19:31:20

签到

A0dy 回答时间:2026-1-19 10:50:21

恭喜STM32出货150亿颗,今年继续进步“亿点点”,再来“亿颗”!

A0dy 回答时间:2026-1-19 11:31:29

①首次使用STM32产品就是“STM32F103C8T6”了,是我开启MCU学习的“启蒙导师”!

让我从“51单片机”步入到STM32的“内核+外设”的强大功能,从而开启了学习MCU的大门!

最重要的是当时关于F103C8T6的资料,已经多到数不胜数了,各个细节资料全都被“前人”摸透了,所以当时就选择了经典的“C8T6蓝板”,用来开发学习!

有了之前F103的基础,后面在使用F4、H7等芯片的时候,非常快速就能上手开发!

当时开发学习的时候,还是经典“Keil + 标准库(寄存器)”方式,一转眼“Keil”都慢慢淡出大家视野了,现在主流都是"HAL库+Cubemx”以及“VScode + STM32插件”开发方式了!再搭配目前火爆的相关“AI工具”,开发起来和之前相比效率简直嘎嘎提升!

③之前使用STM32H7开发板上部署过“语音识别模型”;

通过使用EDGE网站部署的;

image.png

image.png
image.png
flyingstar 回答时间:2026-1-20 13:20:17
《贺STM32出货百五十亿颗》

晶圆铸就星河志,
亿兆集成一粟身。
廿载耕耘终化蝶,
百五十亿启新程。




VegardCheng 回答时间:2026-1-27 10:33:05

STM8101系列问题 /https://shequ.stmicroelectronics.cn/thread-624895-1-1.html + 2020-5-15 + 查看规格书没有找到STM8101的ADC说明,后面论坛朋友说没说明就是没有ADC

恭喜STM32出货150亿颗,足够绕地球几圈呢?要是能统计正在服役的STM32芯片就更厉害了。不知不觉ST已经陪伴我们20年了,真是快啊,这些年来也不知道自己有没有跟着ST的脚步成长起来,希望ST在马年一马当先,在众多产品中脱颖而出,兵强马壮,发展更加迅速,推出更多天马行空的新产品,万马奔腾祝福来!

背影101 回答时间:2026-1-29 09:49:23

②老项目,使用STM32F030的红外测温项目,我印象最深刻的项目是使用STM32F030C8T6制作的红外测温。这个项目是通过红外感应温度,通过IIC在屏幕上显示

代码:


/* 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 "i2c.h"
#include "gpio.h"
#include "font.h"
#include "oled.h"
#include "mlx90614.h"
#include <stdio.h>
#include <string.h>

/* Private variables ---------------------------------------------------------*/
static float object_temp = 0;
static float ambient_temp = 0;
//static char object_temp = 0;
//static char ambient_temp = 0;
static uint8_t sensor_ok = 0;

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void Error_Handler(void);




/* Private user code ---------------------------------------------------------*/

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    HAL_Init();
    SystemClock_Config();

    MX_GPIO_Init();
    MX_I2C1_Init();
    MX_I2C2_Init();

    OLED_Init();





    OLED_Clear();

    // 检测MLX90614
    sensor_ok = MLX90614_IsConnected();

    // 显示固定内容
    OLED_ShowString(0, 0, "MLX90614 Test");
//    OLED_ShowNum(0, 2, 4,0);

    if(sensor_ok)
    {
        OLED_ShowString(0, 1, "Sensor: OK");
    }
    else
    {
        OLED_ShowString(0, 1, "Sensor: No");
    }

    OLED_ShowString(0, 3, "Object: ");
    OLED_ShowString(0, 4, "Ambient:");
    OLED_ShowString(0, 5, "Raw: ");
//    OLED_ShowFloat(0, 0, 24.39, 3, 1);



    OLED_Refresh();

    while (1)
    {
       if(sensor_ok)
        {
            // 读取温度
            object_temp = MLX90614_ReadObjectTemp();
            ambient_temp = MLX90614_ReadAmbientTemp();

            // 获取原始数据
            uint16_t raw_data = MLX90614_GetLastRawTemp();

            // 显示温度 - 使用紧凑格式
            char buffer[16];

            // 物体温度
            if(object_temp < -900)
            {
                OLED_ShowString(40, 3, "Error  ");
            }
            else
            {
                // 简单直接的格式
                sprintf(buffer, "%.1fC", object_temp);
                OLED_ShowString(64, 3, buffer);
 //               OLED_ShowNum(8, 7, object_temp,0);
 //               OLED_ShowFloat(8, 7, object_temp,0,0);

            }

            // 环境温度
            if(ambient_temp < -900)
            {
                OLED_ShowString(40, 4, "Error  ");
            }
            else
            {
                sprintf(buffer, "%.1fC", ambient_temp);
                OLED_ShowString(64, 4, buffer);
            }

            // 显示原始数据
            sprintf(buffer, "0x%04X", raw_data);
            OLED_ShowString(32, 5, buffer);

            // 显示刷新状态
            static uint8_t dot = 0;
            dot = (dot + 1) % 4;
            if(dot == 0) OLED_ShowString(120, 1, "|");
            else if(dot == 1) OLED_ShowString(120, 1, "/");
            else if(dot == 2) OLED_ShowString(120, 1, "-");
            else OLED_ShowString(120, 1, "\\");
        }
        else
        {
            // 定期重试
            static uint16_t retry = 0;
            retry++;
            if(retry >= 20)
            {
                sensor_ok = MLX90614_IsConnected();
                retry = 0;
            }

            // 闪烁提示
            static uint8_t blink = 0;
            blink = !blink;
            if(blink)
            {
                OLED_ShowString(40, 3, "---.-C");
                OLED_ShowString(40, 4, "---.-C");

            }
            else
            {
                OLED_ShowString(40, 3, "      ");
                OLED_ShowString(40, 4, "      ");
            }
        }

        OLED_Refresh();
        HAL_Delay(500);
    }
}

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

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
    {
        Error_Handler();
    }

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    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_0) != HAL_OK)
    {
        Error_Handler();
    }
}

/**
  * @brief  Error handler
  */
void Error_Handler(void)
{
    __disable_irq();
    while (1) {}
}

效果:

image.png

④分享首次使用STM32软件的感受

首次使用IDE的时候感觉好方便啊

可以不用自己写代码

软件可以直接帮我们将基础框架搭建出来

只需要稍微修改就行

大大节省了开发时间

背影101 回答时间:2026-1-29 09:53:30

④分享首次使用STM32软件的感受

首次使用IDE的时候感觉好方便啊

可以不用自己写代码

软件可以直接帮我们将基础框架搭建出来

只需要稍微修改就行

大大节省了开发时间

617442109@qq.co 回答时间:2026-1-30 23:11:51

恭喜STM32出货150亿颗的,我买了有7w个左右4年😄 ,生态牛,辐射范围广

〃聪聪哥哥 回答时间:2026-2-2 11:14:32

在150 亿颗 STM32 中,我想我应该是使用STM8,STMF103系列和STM32F4系列,有着自己的一份力量,现在项目上用到的芯片,机会都是ST作为主控,不仅仅是功能强大,网上对于ST的资料也是应有尽有。 去年ST的推出的低功耗U系列,无线蓝牙WB系列,自己也是处于开发和项目前期技术储备阶段,相信在2026年,ST的产量也会登上一个台阶的。

〃聪聪哥哥 回答时间:2026-2-2 11:20:13

移植的项目:从STM32f1到H7533的升级:

/***********************************************************************************************
  * @brief   void ClearGraphLine(void)
  * @param   清除数据
  * @retval  无
  * @author  聪聪哥哥
  * @version V1.1.0
  * @date     1-8-2024
*************************************************************************************************/
void ClearGraphLine(void)
{
    SendBuffer2[0] = 0x5A;
    SendBuffer2[1] = 0xA5;
    SendBuffer2[2] = 0x03;
    SendBuffer2[3] = 0x80;
    SendBuffer2[4] = 0xEB;
    SendBuffer2[5] = 0x55;
    HAL_UART_Transmit(&huart2,&SendBuffer2[0],6,10);
}


/*工作界面下 数据显示部分 */
void  WorkPage(void)
{
/*压力1 显示函数*/
        Add_Write_Data1(0x5000 ,uiPress1Data);
/*位移1 显示函数*/
        Add_Write_Data1(0x5002 ,uiLength1Data);
/*温度    显示函数*/
        Add_Write_Data1(0x5004 ,263);

/*压力  1 显示函数*/
        Add_Write_Data1(0x5006 ,uiPress2Data);
/*位移  1 显示函数*/
        Add_Write_Data1(0x5008 ,uiLength2Data);
/*湿度  1 显示函数*/
        Add_Write_Data1(0x500A ,526);
}

/*界面显示函数 展示*/

void GuiDisplay(void)
{
   switch (ucDispMode)
    {

        case 0:  
        break ;


        case 1 :    WorkPage();
     break ;

        default :
         break ;
    }

}

/******************************************************************************************************************
  * @brief  按键处理函数
  * @param  KeyValue 按键值
  * @retval 无
  *
*******************************************************************************************************************/
void DWIN_Key_Deal(uint16_t KeyValue)
{

        switch (KeyValue)
        {
            case 0x100 :   SendTestData(2);
                    break ;     
            case  0x101:   HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
                    break ;

            case  0x102:   HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
                    break ;



/*加载*/
            case  0x103:   HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
                    break ;


/*停止*/
            case  0x104:   HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
                    break ;
/*停止*/
            case  0x105:   HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
                    break ;





            case 0x200 :   SendTestData(3);
                    break ;

            case 0x201 :   SendTestData(5);
                    break ;
            case 0x202 :   SendTestData(6);
                    break ;
            case 0x203 :   SendTestData(4);
                    break ;
            case 0x204 :   SendTestData(1);
                    break ;
            case 0x205 :   SendTestData(1);
                    break ;
            case 0x301 :   SendTestData(1);
                    break ;
            case 0x400 :   SendTestData(1);
                    break ;
            case 0x500 :   SendTestData(1);
                    break ;
            case 0x600 :   SendTestData(1);
                    break ;
            default:
            break ;

        }
}
/**
  * 函数功能: 串口2从DWIN屏接收数据
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
void DWIN_Rec_Deal(void)
{
    uint16_t RecAdd;
    uint16_t KeyValue;
    if(usart2_Flag == 1)
    {
        usart2_Flag = 0 ;
        if((Usart2_DEAL_RX_Buf[0] == 0x5A)&&(Usart2_DEAL_RX_Buf[1] == 0xA5))
                {
                    switch(Usart2_DEAL_RX_Buf[3])
                    {
                        case 0x83: RecAdd = (Usart2_DEAL_RX_Buf[4]<<8) + Usart2_DEAL_RX_Buf[5];
                                    switch(RecAdd)
                                    {
                                        case 0:     KeyValue = (Usart2_DEAL_RX_Buf[7]<<8) + Usart2_DEAL_RX_Buf[8];
                                                            DWIN_Key_Deal(KeyValue);
                                            break;
                        default :
                            break ;                                 
                        }
                    }
                }
    }
}

图片如下所示:

〃聪聪哥哥 回答时间:2026-2-2 11:24:23

软件使用的心得:

对于从事嵌入式开发的工程师来说,ST芯片无疑是使用范围最广泛,网上的资料也是最多的。而我们这也是使用ST芯片做一些产品,设计。下面和大家说下我最近使用STM32cube MX软件配置,使用的一些经历吧

一:软件版本迭代问题:

首先不得不说,这个软件的更新速度是真心的快,时不时的就会更新一些资料包,这里我们就需要注意些,对于软件包不更新是没有办法了,软件自动更新,不更新无法使用的,但是对于cube MX软件就没有必要对其频繁更新,更新之后,对于之前代码功能,会有一些影响。亲身体验,不要一味的追求最新的版本,使用自己熟悉的版本就好,保持hal,固件包的版本一致就可以。 二:配置使用问题

2.1 使能芯片的调试口

STM32cube MX软件默认是将调试口关闭的,所以最好是先将芯片的调试功能打开,防止下载程序之后,无法二次下载的问题。不过对于ST芯片也是支持串口下载的,就是更改boot0 和boot1的引脚电平就可以了。 2.2时钟树的配置

对于cpu的心脏来说,时钟树的配置无疑是重中之重的。系统时钟的来源,使用外部的高速晶振,还是内部的RC晶振,不同的单片机的支持的外部晶振最大频率是不一样的。所以我们需要根据芯片手册或者外部的晶振实际进行配置。为了使单片机可以实现最佳的性能,我们可以将主频设定在单片机的最大频率,而且ST的芯片并不支持超频使用,错误的时钟配置会导致程序运行出错。有次就是烧录了其他代码到开发板里面,导致程序直接跑飞,使用ST-link都无法二次下载。最后还是使用串口进行全面擦除,才可以将单片机复活。 2.3 NVIC的配置

对于优先级的配置,当我们使用某个外设模块时候,根据项目的实际需求,进行配置就可以,比如:使用定时器时候,记得使能定时器的中断,配置好优先级。使用串口就使能串口的中断。我这边一般是将中断向量分为设置为2个分组,即抢占优先级和响应优先级,也是从标准库到hal库的使用,当初的底层代码都是那样配置,具体也不太清楚,这样配置有没有好处,不知道有没有大佬解答一下。

2.4 代码生成注意事项:

最好是将每个模块功能配置成不同文件,这样代码看起来很整洁,也方便二次移植,要是把所有的代码都放在同一个C文件里面,开发起来是很费劲的,有次我就是把所有的配置都放在一个C文件里面,在编写的时候真的是很费劲。

三:使用问题:

相信在第一次使用cube 生成的工程中,添加用户代码时候,不知道从哪里添加。而且在开发的时候,不可能一次就把外设配置好,二次配置ico文件时候,为了防止用户代码被软件覆盖,就要求我们将用户代码一定要放在 用户代码区,即

/ USER CODE BEGIN 2 /

/ USER CODE END 2 / 标有上述字样的区间内添加。

总之,灵活使用cube MX软件会使用我们快速的开发ST芯片,不过就要求我们对ST产品有一定的了解。

1234
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版