printf在stm32中重映射到串口
首先:Keil和GCC底层printf函数走的是两条完全不同的路线Keil MDK + 勾选MicroLIB pinrtf -> 格式化拆分字符 -> fputc(ch,FILE*) -> 串口发送 MicroLIB库强制所有printf输出走fputc,所以只要重写fputc,printf百分百生效。 这是针对Keil的。 ARM-GCC+newlib-nano+nosys.specs(Clion+Cmake环境)Newly-nano为了极致精简FLASH,砍掉冗余代码,重构了printf底层链路,不再默认走fputc,出现了两条分枝优先级。 优先级: _io_putchar > _write > fputc 开启nano.specs后,printf优先走最精简路径:_io_putchar,直接跳过fputc,所以如果我重写fputc等于白写。库根本不进入这个函数,串口自然没有数据。 注:newlib-nano 为了省 Flash,砍掉文件流 FILE 缓冲层,设计了**单字符直通接口__io_putchar**: 只要用户实现这个函数,n...
可得性启发式(availability heuristic)
K在单词的首位置和第三个位置出现的频率先说结论,K在第三个位置出现的频率远大于首位置,如ask,make,take,like,bike,cake等。 但很多人都会觉得K在首位置出现的频率要高,因为我们的大脑更容易检索和回忆起某个字母开头的单词,如keep,know,key,kitchen等。 这种认知偏差被称为“可得性启发式”(availability heuristic)。 但从真正的统计数据来看: 以k为第三个字母的英文单词数量是k为首字母的英文单词数量的2-3倍。 所以,虽然我们在脑海中能脱口而出很多k开头的单词,但在英语词汇中的实际分布中,k更多地隐藏在单词的中间位置。 图书管理员与农民的例子假设有个叫史蒂夫的人,邻居这样描述他: “史蒂夫非常腼腆,少言寡语,乐于助人,但对他人或现实世界没什么兴趣。他性情温和,干净利落,做事井然有序,非常关注细节。” 现在请问:史蒂夫更有可能是一名图书管理员,还是一名农民? 🧠 你的直觉(系统1)会怎么想?绝大多数人的第一反应都是:图书管理员。 这是因为史蒂夫的性格特征(内向、爱整洁、注重细节)与我们脑海中“图书管理员”的刻板印象高度吻...
git_bush
MinGW64MINGW64 是 Minimalist GNU for Windows (64-bit) 的缩写。 本质:它不是一个编译器,而是一个软件环境。它把 GNU 的开发工具(如 GCC 编译器、Make 工具)和 Bourne Shell(一种 Linux 命令行解释器)移植到了 Windows 上。 作用:它让你在 Windows 上也能使用像 ls, cd, grep, make 这样原本属于 Linux/Unix 系统的命令,而不需要安装虚拟机或双系统。 Git_Bush简单来说,Git_Bash 就是让你在 Windows 上也能像用 Linux 一样愉快地敲命令行(Shell:外壳)的工具。 底层核心正是基于 MinGW64 构建的。 技术原理:Git Bash 本质上是一个轻量级的 POSIX 兼容层。为了让 Windows 能听懂 Linux 的指令,它需要把 Linux 的指令“翻译”成 Windows 能听懂的。 底层依赖:它使用了 MinGW-w64(Minimalist GNU for Windows)项目提供的工具链。 Bash:...
Clion配置STM32F103开发环境
构建系统层次CMake/Make{CMake——make工具——编译器} 写makefile文件,然后用mingw32-make工具执行makefile文件来实现编译,这样对于大型,文件很多的工程就不用手动去gcc编译每每一个文件了。 但makefile文件的格式太晦涩难懂,不太好写,所以人们就想能不能模版化的生成makefile文件,所以出现了cmake。我们只要写cmakelist文件,然后把cmakelist文件丢给cmake,cmake就会生成makefile文件,然后再把makefile文件丢给mingw32-make工具,就可以执行编译了。编译则是调用本机 ARM-GCC 执行编译链接。 NinjaNinja 是一个专注于速度的小型构建系统,是输入第二层Make工具中的一种。 mingw32-make: 特点:历史悠久,功能强大,语法(Makefile)相对复杂,人为编写容易出错。 速度:在大型项目中,解析 Makefile 和启动编译任务的速度相对较慢。 Ninja: 特点:设计极简,专为机器生成(而非人类手写)而优化。它的语法非常枯燥但解析速...
MATLAB用法
矩阵操作12345A=[1 2 3 ; 4 5 6 ; 7 8 9]B=A’ %代表A的转制C=A(:) %把矩阵输出成一长列D=inv(A) %对A求逆,但A必须是方阵,F=det(A) %求A的行列式的值,但A必须是方阵,可以用来检验A矩阵可不可逆,因为行列式值为0的矩阵无逆矩阵。 多维矩阵1234567891011C=zeros(5,4,3)%% 生成一个3维矩阵,其中每一维都是5行4列的0矩阵C(:,:,1)=rand(5,4)%% 在第一维矩阵随机生成范围在0-1的一个5行4列的矩阵E(:,:,3)=randi([iMin,iMax]5,4)%% 在第三维矩阵随机生成一个5行4列的整数矩阵,其中最大值为iMax,最小值为iMinE(:,:,2)=randn(5,4)%% 在第二维矩阵随机生成一个5行4列,符合标准正态分布(均值为0,方差为1)的随机矩阵 A=1:2:91A=1:2:9 输出1 3 5 7 9,中间的2是步长 repmat ones zeros1234B=eye(3); % 生成一个3阶单位阵C=repmat...
macOS
homebrew12brew update 更新homebrewbrew install --cask APP 安装图形化应用 显示/隐藏文件夹command+shift+"."(句号键)能够显示或隐藏文件夹中的隐藏文件。 多窗口findercommand+n
C语言知识
GCCGCC是一个编译器,可以将C语言代码编写为机器码。 支持C/C++,Go,Fortran等语言。 支持MacOS,Windows,Linux等平台。 1gcc main.c -o main 上述代码:将main编译成一个名字叫main的可执行程序。 %d代表数值,%p代表地址。指针*一级指针指针,比如定义一个指针变量,那个这个指针变量代表的就是另一个变量的地址。 比如: 12345678int main(){ int a=10; int *b=&a; printf("a=%d"\n,a); printf("b=%p"\n,b); printf("*b=%d"\n,*b); return 0;} 打印出的效果: a=10,代表数值。 b=ox16db88b58,代表地址。 *b=10,这里因为b本身就是指针变量, *b是解引用指针,他可以获取b指针指向的那块内存地址里存储的值。 **二级指针12int **c=&b;printf(&q...
stm32编写
RCC: reset and clock control 复位和时钟控制配置系统时钟,开启/关闭各个外设的时钟电源。 一般首要操作就是通过RCC去打开相应外设的时钟,比如: 1RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); 通过RCC打开APB2总线外设的GPIOC的时钟,使他开启(ENABLE)。 GPIO_InitTypeDef 结构体对GPIO进行设置/初始化之前,要先定义一个结构体,这个模板里规定了:如果你想配置 GPIO,你必须提供 模式、速度 和 引脚号 这三样东西。 1234GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_PP;GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;GPIO_InitStryct.GPIO_Speed=GPIO_Speed_50MHz; 然后再去对GPIO进行配置 1GPIO_InitStryct.GPIO_Speed=GPIO_Speed_50...
stm32学习
寄存器( 一种特殊的SRAM)==连接软件和硬件的桥梁== 一方面:CPU可以对寄存器进行读写,就像读写运行内存一样。 另一方面,寄存器的的每一位背后都连接了一根导线,这些导线可以用于控制外设电路的状态,比如置引脚的高低电平,导通和断开开关,切换数据选择器。 IDE:Integrated Development Environment 集成开发环境RAM: 20K (SRAM)ROM: 64K(Flash) 在程序内无法对Flash进行写入操作,只能进行读取操作,除非调用Flash控制器,但这很复杂,包括DMA转运数据,不能将Flash的地址作为目标地址,不然会报错。 而==烧录程序是烧录到Flash==的,ST-link会处理好,接入Flash控制器,解锁 Flash 控制器 -> 擦除指定扇区 -> 逐页写入新数据 -> 校验一致性。 Flash的物理特性决定了只能把位从 1 变成 0,不能直接从 0 变成 1。所以写入新数据前,必须先把目标区域(页或扇区)全部擦成 1。这个“...
linux语法
sudo:超级管理员 本机地址:127.0.0.1 Pwd : print working directory 打印当前工作目录 Cd xx :进入xx目录下 hexo -v : 检查hexo的版本 ls/dir(windows) : 查看当前目录中的文件 mkdir + 名字: 新建文件夹 touch+名字:创建新的文件 ls -l : 以列表的形式查看 ls -a:显示所有文件,包括隐藏文件 ls -la / ls -a -l:二合一,列表+隐藏 cd .. :退一层 cd ../.. : 退两层 cd ~ :退到home路径 blog文件权限是root用户,导致dhwen用户无法更改文件里的数据,==解决办法如下:== 1sudo chown -R dhwen blog 如果已经在blog文件夹目录里,就用 1sudo chown -R dhwen










