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

【文末有奖】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 手机版