跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
  • 游戏大厅
  • 工具箱
  • 连载
皮肤
  • 浅色
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • 深色
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Potatochip Light
  • Potatochip Dark
折叠
品牌标识

potato CHIP

administrators

私有

帖子


  • 「失败者联盟」—— 1 小时挑战做的超度小游戏
    A admin
    综合讨论

    很久以前参加 1 Hour Challenge 写的小玩具,今天翻出来扩了个容,顺便发出来给大家玩。

    怎么玩

    鼠标(手机上用手指)点击那些失败的科技产品,送它一块墓碑,附赠一句墓志铭。超度得越多,墓园越壮观。右上角可以"扫墓"清屏重来。

    目前入住的 20 位

    手机:BlackBerry(全键盘随我长眠)、Nokia Lumia(只差一个微信)、Fire Phone(除了亚马逊没人买过)、Galaxy Note 7(此地禁止携带上飞机)、Microsoft Kin(在职 48 天)、Essential Phone(安卓之父也带不动)

    游戏机:Google Stadia(退款比开服快)、Ouya(众筹 860 万买了个寂寞)、Dreamcast(最后的武士)

    系统:Windows Phone(生态荒漠)、Palm webOS(超前时代,死于收购)

    社交:Google+(九成会话活不过五秒)、Vine(坟头长出了 TikTok)

    硬件:Google Glass(Glasshole 头衔)、Juicero(七百美元不如一双手)、Pebble(死于被收购)、Segway(武装了保安)、Virtual Boy(物理意义上的辣眼睛)

    服务:Google Reader(RSS 之泪)、HD-DVD(败给蓝光)

    技术栈

    单文件 HTML + GSAP,无构建,手机触屏适配。墓碑材质按生前咖位:金 / 银 / 石。


    墓志铭纯属虚构,如有雷同,说明这些产品真的死了。


  • STM32 UART 串口通信:printf 重定向与中断接收(示例帖)
    A admin
    STM32

    串口是 STM32 调试的生命线:打印日志、看传感器数据、跟上位机联调都靠它。这篇把最常用的两招讲透:printf 重定向输出,中断方式接收。

    1. CubeMX 配置要点

    • Connectivity → USART1,Mode 选 Asynchronous
    • 波特率 115200,8 数据位、无校验、1 停止位(8N1)
    • NVIC Settings 里勾选 USART1 global interrupt(中断接收才需要)
    • PA9(TX)、PA10(RX)接到 USB 转串口模块,注意 TX 接 RX、RX 接 TX,交叉接

    2. printf 重定向

    C 库的 printf 最终调 fputc,重写它把字符送进串口:

    #include <stdio.h>
    
    int fputc(int ch, FILE *f) {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
    // main 里直接用
    printf("system clock: %lu Hz\r\n", HAL_RCC_GetSysClockFreq());
    

    注意两点:

    • printf 发 \n 不会自动回车,串口助手里看到满屏阶梯状就改成 \r\n
    • HAL_MAX_DELAY 是阻塞等待,放在中断里调 printf 会卡死,中断里只做标记

    3. 中断接收(推荐做法)

    轮询接收会堵住主循环,用中断 + 一字节缓冲:

    uint8_t rx_byte;
    uint8_t rx_buf[128];
    uint8_t rx_len = 0;
    
    void start_uart_rx(void) {
        HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 启动一次
    }
    
    // 每收到 1 字节进一次回调,记得重新挂起下一次接收
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
        if (huart->Instance == USART1) {
            if (rx_byte == '\n' || rx_len >= sizeof(rx_buf) - 1) {
                rx_buf[rx_len] = '\0';
                // 在这里处理一行命令,不要做耗时操作
                rx_len = 0;
            } else if (rx_byte != '\r') {
                rx_buf[rx_len++] = rx_byte;
            }
            HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 关键:重新挂起
        }
    }
    

    4. 排障清单

    现象 先查
    串口无输出 波特率两边是否一致;TX/RX 是否交叉接;GND 有没有共地
    输出乱码 波特率/时钟配置,检查 HSE 是否起振
    只能收一次 回调里有没有重新调 HAL_UART_Receive_IT
    printf 卡死 是否在中断上下文里调用;串口外设时钟开了没

    下一篇计划写定时器 PWM 驱动舵机/电机,连载目录见 /series。


  • STM32 UART 串口通信:printf 重定向与中断接收(示例帖)
    A admin
    STM32

    串口是 STM32 调试的生命线:打印日志、看传感器数据、跟上位机联调都靠它。这篇把最常用的两招讲透:printf 重定向输出,中断方式接收。

    1. CubeMX 配置要点

    • Connectivity → USART1,Mode 选 Asynchronous
    • 波特率 115200,8 数据位、无校验、1 停止位(8N1)
    • NVIC Settings 里勾选 USART1 global interrupt(中断接收才需要)
    • PA9(TX)、PA10(RX)接到 USB 转串口模块,注意 TX 接 RX、RX 接 TX,交叉接

    2. printf 重定向

    C 库的 printf 最终调 fputc,重写它把字符送进串口:

    #include <stdio.h>
    
    int fputc(int ch, FILE *f) {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
    // main 里直接用
    printf("system clock: %lu Hz\r\n", HAL_RCC_GetSysClockFreq());
    

    注意两点:

    • printf 发 \n 不会自动回车,串口助手里看到满屏阶梯状就改成 \r\n
    • HAL_MAX_DELAY 是阻塞等待,放在中断里调 printf 会卡死,中断里只做标记

    3. 中断接收(推荐做法)

    轮询接收会堵住主循环,用中断 + 一字节缓冲:

    uint8_t rx_byte;
    uint8_t rx_buf[128];
    uint8_t rx_len = 0;
    
    void start_uart_rx(void) {
        HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 启动一次
    }
    
    // 每收到 1 字节进一次回调,记得重新挂起下一次接收
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
        if (huart->Instance == USART1) {
            if (rx_byte == '\n' || rx_len >= sizeof(rx_buf) - 1) {
                rx_buf[rx_len] = '\0';
                // 在这里处理一行命令,不要做耗时操作
                rx_len = 0;
            } else if (rx_byte != '\r') {
                rx_buf[rx_len++] = rx_byte;
            }
            HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 关键:重新挂起
        }
    }
    

    4. 排障清单

    现象 先查
    串口无输出 波特率两边是否一致;TX/RX 是否交叉接;GND 有没有共地
    输出乱码 波特率/时钟配置,检查 HSE 是否起振
    只能收一次 回调里有没有重新调 HAL_UART_Receive_IT
    printf 卡死 是否在中断上下文里调用;串口外设时钟开了没

    下一篇计划写定时器 PWM 驱动舵机/电机,连载目录见 /series。


  • STM32 UART 串口通信:printf 重定向与中断接收(示例帖)
    A admin
    STM32

    串口是 STM32 调试的生命线:打印日志、看传感器数据、跟上位机联调都靠它。这篇把最常用的两招讲透:printf 重定向输出,中断方式接收。

    1. CubeMX 配置要点

    • Connectivity → USART1,Mode 选 Asynchronous
    • 波特率 115200,8 数据位、无校验、1 停止位(8N1)
    • NVIC Settings 里勾选 USART1 global interrupt(中断接收才需要)
    • PA9(TX)、PA10(RX)接到 USB 转串口模块,注意 TX 接 RX、RX 接 TX,交叉接

    2. printf 重定向

    C 库的 printf 最终调 fputc,重写它把字符送进串口:

    #include <stdio.h>
    
    int fputc(int ch, FILE *f) {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
        return ch;
    }
    
    // main 里直接用
    printf("system clock: %lu Hz\r\n", HAL_RCC_GetSysClockFreq());
    

    注意两点:

    • printf 发 \n 不会自动回车,串口助手里看到满屏阶梯状就改成 \r\n
    • HAL_MAX_DELAY 是阻塞等待,放在中断里调 printf 会卡死,中断里只做标记

    3. 中断接收(推荐做法)

    轮询接收会堵住主循环,用中断 + 一字节缓冲:

    uint8_t rx_byte;
    uint8_t rx_buf[128];
    uint8_t rx_len = 0;
    
    void start_uart_rx(void) {
        HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 启动一次
    }
    
    // 每收到 1 字节进一次回调,记得重新挂起下一次接收
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
        if (huart->Instance == USART1) {
            if (rx_byte == '\n' || rx_len >= sizeof(rx_buf) - 1) {
                rx_buf[rx_len] = '\0';
                // 在这里处理一行命令,不要做耗时操作
                rx_len = 0;
            } else if (rx_byte != '\r') {
                rx_buf[rx_len++] = rx_byte;
            }
            HAL_UART_Receive_IT(&huart1, &rx_byte, 1); // 关键:重新挂起
        }
    }
    

    4. 排障清单

    现象 先查
    串口无输出 波特率两边是否一致;TX/RX 是否交叉接;GND 有没有共地
    输出乱码 波特率/时钟配置,检查 HSE 是否起振
    只能收一次 回调里有没有重新调 HAL_UART_Receive_IT
    printf 卡死 是否在中断上下文里调用;串口外设时钟开了没

    下一篇计划写定时器 PWM 驱动舵机/电机,连载目录见 /series。


  • STM32 HAL 点亮 LED:最小可运行工程(示例帖)
    A admin
    STM32

    这是论坛的第一篇示例教程,演示代码高亮与发帖模板是否正常工作。

    目标

    用 STM32 HAL 库点亮一块 LED,理解 GPIO 输出的基本流程。

    代码

    #include "main.h"
    
    int main(void)
    {
    	HAL_Init();
    	__HAL_RCC_GPIOA_CLK_ENABLE();  // 先开 GPIOA 时钟
    
    	GPIO_InitTypeDef gpio = {0};
    	gpio.Pin = GPIO_PIN_5;
    	gpio.Mode = GPIO_MODE_OUTPUT_PP;
    	gpio.Pull = GPIO_NOPULL;
    	gpio.Speed = GPIO_SPEED_FREQ_LOW;
    	HAL_GPIO_Init(GPIOA, &gpio);
    
    	while (1) {
    		HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    		HAL_Delay(500);
    	}
    }
    

    要点

    1. 操作任何外设前先使能对应总线时钟,这是新手最常踩的坑。
    2. HAL_Delay 依赖 SysTick,确保 HAL_Init() 已调用。
    3. LED 不亮时先用万用表量引脚电平,二分法定位是软件还是硬件问题。

  • 新人必读:发帖指南(代码格式 / 提问规范)
    A admin
    综合讨论

    欢迎来到 potato CHIP(试运行)!发帖前花一分钟看看这份指南,提问更容易得到回答。

    1. 代码怎么贴

    用三个反引号包裹代码,并在后面标注语言,代码会自动高亮:

    #include <stdio.h>
    int main(void) {
        printf("hello chip\n");
        return 0;
    }
    

    常用语言标记:c、cpp、python。编译报错信息也请用代码块贴,不要截图——方便别人复制搜索。

    2. 求助请用「问答」功能

    • 发帖时可以把帖子标记为问题帖;
    • 问题解决后,请把有用的回复设为最佳答案,或把帖子标记为已解决;
    • 这样后来的人一眼就能看到答案,也方便搜索。

    3. 标题写清楚

    建议格式:[STM32] 定时器中断进不去,求助、[ESP32] DHT11 读数全是 0。
    好标题 = 芯片型号 + 一句话问题,别只写"救命""求助大佬"。

    4. 提问时带上这些信息

    • 开发板型号、IDE/框架(HAL 库 / ESP-IDF / Arduino);
    • 最小可复现的代码;
    • 实际现象 vs 预期现象;试过哪些排查步骤。

    5. 其他

    • 发帖最短 8 个字符,新用户发帖有 2 分钟间隔限制,防 spam;
    • 视频教程可以直接贴 YouTube / B站链接,会自动嵌入播放器;
    • 论坛试运行中,分类和名称都可能调整,有建议直接回帖。

  • 视频:B站 STM32 / ESP32 教程嵌入测试
    A admin
    综合讨论

    测试 B 站视频的嵌入效果。

    江协科技 STM32 入门教程(2023版)

    keysking:超易懂的 STM32 教程

    ESP32-S3 搭建小智 AI(有手就会版)


  • 视频:ESP32 入门教程(YouTube 嵌入测试)
    A admin
    ESP32

    YouTube 上两个 ESP32 新手教程,直接在帖子里播放。

    ESP32 Tutorial For Absolute Beginners(ESP32-C3)

    ESP32 Tutorial #1: Control an LED with a Button


  • 视频:STM32 入门教程(YouTube 嵌入测试)
    A admin
    STM32

    测试一下 YouTube 视频在论坛里的嵌入效果,顺便推荐两个 STM32 入门视频。

    Getting Started with STM32 Blue Pill

    STM32 Blue Pill LED Blink(CubeMX + CubeIDE)

成员列表

A admin 群组所有者
18 帖子 0 声望
  • 登录

  • 没有帐号? 注册

  • 登录或注册以进行搜索。
Powered by NodeBB Contributors
  • 第一个帖子
    最后一个帖子
0
  • 版块
  • 最新
  • 标签
  • 热门
  • 世界
  • 用户
  • 群组
  • 游戏大厅
  • 工具箱
  • 连载