超快 STM32 系统入门指南

超快 STM32 系统入门指南

计算机类的教程多,框架和 API 用法讲的全面,成系统的教程很多,CSDN上、知乎上很多个人学习记录和全面的成书的教程,而且生动形象有甚至有动画讲解,回过头来看嵌入式的教程,又臭又长。本文 Github 地址。


两种学习模式,一种是从底层开始看大厚书学习,但这只适合那些理解能力和前后关联能力强甚至有天赋的人来看,说白了不是设计给新人看的,而是给熟练的人当字典来看的,现在学校的课本一上来直接怼抽象的概念和公式,可能导致的在网上写教程的也有这毛病,不人性化。另一种学习是面向应用来学,就是下面要说的,是 “真-面向应用”,对于超快 STM32 入门来说就是:听正常人能理解的句子来了解外设概念和意义,然后直接从 API 入手。

这篇文章需要有 基本数模电和单片机的概念、C 语言基础和良好英文(或翻译)。

第一个外设

这时候可以备好 STM32 编程手册《STM32F10xxx参考手册》。

GPIO(General-purpose input/output)为通用目的输入输出口,所谓通用即不只可以用软件控制高低电平的变化,还有输入、开漏等功能,根据不同应用场景配置成不同功能。以下是该外设的内部数字电路的电路框图。

该图就是 STM32 芯片 里面 GPIO 外设部分的真实存在的电路的框图。

下面两个 P-MOS 和 N-MOS 就是控制输出 I/O 口的高低电平,如果 P-MOS 导通,则输出高电平,这称为 “推挽输出” 模式,输出有一定的驱动能力,输出高电平为 芯片供电电压,即 3.3V,低电平为接地,即 0V,可以先这么理解。

如果 下面两个 P-MOS 和 N-MOS 均不导通,那就是 “浮空输入” 模式,外接的高低电平可以读入,外部接上按键,就可以用按键控制东西。

如果 输出的时候是 P-MOS 一直处于关闭状态,而只有 N-MOS 打开或关闭,那就是 “开漏输出” 模式,在该口上拉一个电阻到 Vref 电压,那么输出高电平就是 Vref 电压,这么做可以改变输出高电平的电压,可以任定,而不是上面 “推挽输出” 时候固定的 3.3V。

图中还有还有上、下拉电阻,还有复用功能,就是配置别的外设比如 SPI、PWM 等的输出要从此 I/O 输出,这些功能组合可以得到这些模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能、开漏复用功能。

进入主题

下载、安装和会用 STM32CubeMX 软件。

STM32CubeMX 新建一个工程,选择 STM32F103C8T6,将 PA8 设为 推挽输出模式,如下图。

导出工程。路径不要有中文和空格,IDE 选择 MDK(即 Keil 5),右上角生成。

打开 MDK 工程。

打开 main.c 即看到写用户程序的地方,我们在 STM32CubeMX 软件里面图形化的配置了一个推挽输出模式的 PA8 引脚,所以现在工程中有了一个 MX_GPIO_Init() 函数,里面就是通过 HAL 库配置该 I/O 的程序。下面添加上注释来说明。

/* 声明一个 GPIO_InitTypeDef 类型的结构体 名叫 GPIO_InitStruct,该结构体打包了配置 I/O 的所有参数,填这个结构体即可 */
GPIO_InitTypeDef GPIO_InitStruct = {0};

/* 使能 GPIO 的时钟,STM32 中,每个外设都要有时钟信号做驱动,数字电路尤其是时序、同步逻辑电路,当然都需要时钟 */
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();

/* 预先设置该 I/O 的输出电压。在初始化之前,I/O 是浮空的,当初始化完毕之后 I/O 立马变为设置的高或低电平 */
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_RESET);

/* 配置 I/O,结构体 GPIO_InitStruct 共有 Pin、Mode、Pull 和 Speed 这几个参数,分别填为 I/O口 8、推挽输出、没有上下拉电阻、翻转速度为低
然后调用 HAL_GPIO_Init() 函数,填入 结构体 GPIO_InitStruct 的指针,该函数会根据结构体 GPIO_InitStruct 里面的参数配置 I/O 的寄存器 */
/*Configure GPIO pin : PA8 */
GPIO_InitStruct.Pin = GPIO_PIN_8;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

<< · Back Index ·>>

发表回复

相关推荐

槍響瞭!震驚古城西安的121槍案:97年董力團夥殺11人

作者:薩沙本文章為薩沙原創,謝絕任何媒體轉載照例聲明:本文是薩沙創作的小說,聲明完畢(你不知道的大案第68講)再多申明...

· 2分钟前

定金和意向金不可退?訂金可退?還傻傻分不清?

房產交易中的定金、訂金、誠意金、意向金,相信多數人都一頭霧水,根本搞不清它們之間的關鍵區別。究竟哪些金是可以退的?哪...

· 3分钟前

川麻開局打法淺談

“ 會打麻將的人,在碼好牌的時刻就已經構思好瞭胡哪張牌瞭。” 上次的文章主要講瞭一些我自己打牌的一個思路,不迷信運氣,...

· 31分钟前

厲害!新西蘭小黑本,全球排第5名!免簽187個……

你手上的小黑本能帶你去全球哪些地方呢?全球第5!可免簽187個國傢和地區。▼今年第三季度,亨利護照指數(Henley Passport In...

· 35分钟前

Bio-Share 工艺验证 | 生物制药的工艺性能确认(PPQ)

随着工艺验证进入QbD时代,FDA的新工艺验证指南将工艺验证分为三个阶段,今天我们要讲述的工艺性能确认(PPQ)是阶段2(工艺 ...

· 1小时前