Read the article below.
https://www.ti.com/lit/ml/slua618a/slua618a.pdf?ts=1791431445990
hats off to TI.
本论坛之外的主题。此处表达的观点和意见可能不代表本论坛及其成员的立场。
海量内容尽在指尖 …
不妨将此视为您专属的全球发现信息流。它汇集了来自互联网各处及其他社区的有趣讨论,一应俱全。
虽然您可以浏览当前的热门内容,但使用该信息流的最佳方式是将其个性化。通过注册账号,您可以关注特定的创作者和主题,从而过滤掉无关信息,只查看对您真正重要的内容。
准备好开始了吗?注册一个账号,即可关注他人、在收到回复时获得通知,并收藏您喜欢的内容。
注册 登录Read the article below.
https://www.ti.com/lit/ml/slua618a/slua618a.pdf?ts=1791431445990
hats off to TI.
很久以前参加 1 Hour Challenge 写的小玩具,今天翻出来扩了个容,顺便发出来给大家玩。
鼠标(手机上用手指)点击那些失败的科技产品,送它一块墓碑,附赠一句墓志铭。超度得越多,墓园越壮观。右上角可以"扫墓"清屏重来。
手机: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 调试的生命线:打印日志、看传感器数据、跟上位机联调都靠它。这篇把最常用的两招讲透: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());
注意两点:
轮询接收会堵住主循环,用中断 + 一字节缓冲:
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); // 关键:重新挂起
}
}
| 现象 | 先查 |
|---|---|
| 串口无输出 | 波特率两边是否一致;TX/RX 是否交叉接;GND 有没有共地 |
| 输出乱码 | 波特率/时钟配置,检查 HSE 是否起振 |
| 只能收一次 | 回调里有没有重新调 HAL_UART_Receive_IT |
| printf 卡死 | 是否在中断上下文里调用;串口外设时钟开了没 |
下一篇计划写定时器 PWM 驱动舵机/电机,连载目录见 /series。
串口是 STM32 调试的生命线:打印日志、看传感器数据、跟上位机联调都靠它。这篇把最常用的两招讲透: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());
注意两点:
轮询接收会堵住主循环,用中断 + 一字节缓冲:
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); // 关键:重新挂起
}
}
| 现象 | 先查 |
|---|---|
| 串口无输出 | 波特率两边是否一致;TX/RX 是否交叉接;GND 有没有共地 |
| 输出乱码 | 波特率/时钟配置,检查 HSE 是否起振 |
| 只能收一次 | 回调里有没有重新调 HAL_UART_Receive_IT |
| printf 卡死 | 是否在中断上下文里调用;串口外设时钟开了没 |
下一篇计划写定时器 PWM 驱动舵机/电机,连载目录见 /series。
串口是 STM32 调试的生命线:打印日志、看传感器数据、跟上位机联调都靠它。这篇把最常用的两招讲透: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());
注意两点:
轮询接收会堵住主循环,用中断 + 一字节缓冲:
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); // 关键:重新挂起
}
}
| 现象 | 先查 |
|---|---|
| 串口无输出 | 波特率两边是否一致;TX/RX 是否交叉接;GND 有没有共地 |
| 输出乱码 | 波特率/时钟配置,检查 HSE 是否起振 |
| 只能收一次 | 回调里有没有重新调 HAL_UART_Receive_IT |
| printf 卡死 | 是否在中断上下文里调用;串口外设时钟开了没 |
下一篇计划写定时器 PWM 驱动舵机/电机,连载目录见 /series。
这是论坛的第一篇示例教程,演示代码高亮与发帖模板是否正常工作。
用 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);
}
}
HAL_Delay 依赖 SysTick,确保 HAL_Init() 已调用。欢迎来到 potato CHIP(试运行)!发帖前花一分钟看看这份指南,提问更容易得到回答。
用三个反引号包裹代码,并在后面标注语言,代码会自动高亮:
#include <stdio.h>
int main(void) {
printf("hello chip\n");
return 0;
}
常用语言标记:c、cpp、python。编译报错信息也请用代码块贴,不要截图——方便别人复制搜索。
建议格式:[STM32] 定时器中断进不去,求助、[ESP32] DHT11 读数全是 0。
好标题 = 芯片型号 + 一句话问题,别只写"救命""求助大佬"。
手头有块 ESP32 和一个 DHT11,干脆做个温湿度计,把数据打印到串口。代码不到 50 行,适合周末半小时折腾。
#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
Serial.printf("温度: %.1f°C 湿度: %.1f%%\n", t, h);
delay(2000);
}
打开串口监视器(115200),每 2 秒刷一行数据。下一步可以加个 OLED 显示,或者连 WiFi 上报数据。
测试帖,顺便看看论坛代码块的显示效果。
这是 potato CHIP 的第一篇测试教程,顺手验证下论坛的排版效果。如果你是第一次玩 STM32,跟着走一遍就能点亮第一颗灯。
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
HAL_Delay(500);
本帖为测试内容,排版如果看着别扭欢迎吐槽。
This is what a topic and post looks like. As an administrator, you can edit the post's title and content.
To customise your forum, go to the Administrator Control Panel. You can modify all aspects of your forum there, including installation of third-party plugins.