手势点灯任务一:stm32基础入门和keil

写在前面的一些话:
博主在发布该系列的时候还只是个大一新生(
所以如果你和此时的我一样,零基础但对嵌入式或者人工智能感兴趣,
不妨把这个系列当做一个小小的入门指南,
其中完整记录了基于python和stm32实现手势点灯的一个小项目
你可以在此过程中:了解stm32的相关知识,并一窥图像处理和卷积神经网络

再次重复:对新手极度友好!!非常基础!两个月从零开始都可以!
在此之前你只需掌握:
熟练掌握C语言,python的基础语法和配anaconda的虚拟环境+会下载库即可
欢迎你跟随我的脚步,一起入坑(bushi)嵌入式和人工智能哦٩(๑>◡<๑)۶

任务一:关于stm32芯片和keil


tis:硬件部分强烈推荐跟随【STM32入门教程-2023版 细致讲解 中文字幕】学习,以下是我的一些笔记

一、关于stm32芯片的基础概念

1、单片机(MCU,Microcontroller Unit):

英语直译为:微小控制单元集合,从直译可以看出单片机可以被理解为一个小型电脑,集成了CPU(处理器核心)、存储器、输入/输出接口和其他外设的整体系统。其优点在于小体积、低功耗

2、stm32:

STMicroelectronics(意法半导体,一个公司)推出的32位ARM Cortex-M(内核,CPU)系列微控制器产品系列(也是是单片机)

3、外设:

与主芯片相连并为其提供特定功能的电子组件或模块,与主芯片通过各种接口进行连接,例如串行接口(SPI)、并行接口(GPIO)、通用串行总线(USB)、音频接口(I2S)、摄像头接口(MIPI)等

4、GPIO(通用输入输出引脚):

用于连接和控制各种外部设备(很好理解),其可以被配置为并行操作

5、DMA(Direct Memory Access)

直接存储器访问,一种数据传输技术,可实现外设和内存之间的直接数据传输,减轻CPU的负担,提高系统效率

6、ADC(模数转换器),DAC(数模转换器)

二者用于数字信号和模拟信号间的转化
模拟信号转化为数字信号便于单片机分析,数字信号转化为模拟信号用于输出至外部设备

7、TIM(Timer):定时器

通常由一个或多个计数器组成,可以倒计时、计时间隔和生成周期性中断
用于生成精确的定时事件、测量时间间隔和产生PWM信号(脉冲信号。。协助实现数字模拟信号转换)

8、RTC(Real-Time Clock):实时时钟

通常包含一个独立的时钟源(比如晶振),可以在系统断电或关机的情况下继续计时

用于提供精确的时间和日期信息

9、SDIO(Secure Digital Input and Output):

安全数字输入/输出接口,用于与SD卡或SD存储器进行通信

10、USB(Universal Serial Bus)(感动。。有个见过的):

用于连接计算机和外部设备,实现数据传输和设备通信

11、串行与并行:

(1)串行:数据或信息按一定的格式编码,通过少量数据信号线(一般是8根以下)、地线及控制信号线,按数据位形式一位一位地传输数据,适用于远距离通信
(2)并行:一般是指使用8、16、32及64根或更多的数据线进行传输的通信方式
并行通信就像多条车道的公路,可以同时传输多位数据,而串行通信则像单条车道的公路,同一时刻只能传输一位数据

12、全双工、半双工、单工通信:

(1)单工:只支持数据在一个方向上传输

类似于单行道,完全禁止另一方向的车辆通行

(2)半双工:允许数据在两个方向上传输,但不能同时进行,在某一时刻只允许数据在一个方向上传输(实际上是一种切换方向的单工通信)

类似于乡间小道,同一时刻只能让一辆小车通过,另一方向来的车只能等待道路空出来时才能通过

(3)全双工:允许数据同时在两个方向上传输,要求发送设备和接收设备都有独立的接收和发送能力

类似于一个双向车道,两个方向上的车流互不相干

12、同步通信与异步通信

可以根据通信过程中是否使用时钟信号进行简单的区分
(1)同步通信:收发设备双方会使用一根信号线表示时钟信号,实现数据同步

通信中通常双方会统一规定在时钟信号的上升沿或下降沿对数据进行采样

(2)异步通信:不使用时钟信号进行数据同步

直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据

同步通信中双方的时钟允许误差较小,而异步通信双方的时钟允许误差较大

13、CAN(Controller Area Network):

通过总线连接多个节点进行通信的网络协议
类似于多台电脑连接在一个路由器上实现上网

(注意:14-16为电子行业最常用的3种串行通讯协议)

14、SPI(同步、全双工、串行)

一种同步串行通信协议,可提供非常高速的全双工通信

(1)时钟信号由主设备提供给从设备
(2)两种触发机制:边沿触发和电平触发
  • 边沿触发(常用):上升沿(时钟从低到高的转换)和下降沿(从高到低的转换),检测到边沿时,接收器将从下一位开始在数据总线上查找数据

15、IIC(同步、全双工、串行)

一种简单的双向两线制总线协议标准

  • 使用两根信号线进行通信:一根时钟线SCL,一根数据线SDA

(1)起始、停止信号
  • SCL处于高电平,SDA由高到低变化,这种信号是起始信号
  • SCL处于高电平,SDA由低到高变化,这种信号是停止信号

  • 除了起始和停止信号,在数据传输期间,SCL为高电平时,SDA必须保持稳定,不允许改变,只有在SCL低电平时才可以进行变化

(2)应答、非应答信号:

  • 第9个(传输信号必须为8个字节)时钟周期中:
  • 若读取到的SDA保持高电平,则表示非应答信号;
  • 如果从机正确的收到了主机发来的数据,会把SDA拉低,表示应答响应,不是高电平状态

16、UART(通用异步收发器,异步、全双工、串行)

  • 与IIC、SPI 等接口一样,都属于串行通信接口,但是UART只有数据接收线(RX)和发送线(TX),并无时钟线,故为异步串行通信接口,可以实现全双工通信
  • UART在数据的起始和结束位置使用起始位(Start Bit)和停止位(Stop Bit)来标识数据的传输

17、USART(同步/异步、全双工、串行)

  • 异步模式:工作方式与UART相似
  • 同步模式:使用外部时钟来同步数据的传输,不需要起始位和停止位

二、了解stm32芯片结构

tis:这一部分要学会翻芯片的手册哦O(∩_∩)O

1、芯片工作原理

stm32.png

该图来源于数据手册11页(图中为大体的几个模块)
其它了解内容:
  • 三根总线:icode/ibus(指令总线,用于指令传输)、Dcode/Dbus(数据总线,传输常量和调试参数)、System(系统总线)

  • AHB:挂载最基本的或性能比较高的外设(复位、时钟控制等基本电路、SDIO)

  • APB:利用桥接(完成数据转换和缓存)与APB相接;其中APB2性能高于APB1,故一般挂载重要外设(GPIO、ADC/SPI1、TIM1、TIM8等;TIM1、TIM8都是高级定时器)

2、外设设备列表

2ceb17b36e7a36ca2d9f0baef1e093d1.png

  • 定时器(TIM):用于生成精确的定时和PWM信号
  • 串行外设接口(SPI):支持与其他SPI设备的全双工通信
  • I²C总线接口(I²C):用于连接与此芯片通信的外部I²C设备
  • 串行通信接口(USART):支持异步串行通信,可用于与外部设备进行通信
  • USB:通过USB接口进行数据传输和通信
  • CAN:通过CAN总线进行数据传输和通信(前面有)
  • 通用I/O口(GPIO):可以用于输入输出数字信号
  • 12位模数转换器(ADC):用于模拟信号的数字转换

三、keil新工程的创建及库函数的添加

18b57c774ed00decb.png
99cb63e094a3f64c5dde8578724a407b.png

  • 其中Start文件夹中为启动工程相关程序,User文件夹中为工程文件,Library文件夹中为库函数程序

2d7f37da53e779c6a.png

四、查看stm32芯片原理图,尝试找到板载小灯的GPIO口

a422c8c63b2bdbdf1521ff66122c0e10.png

板载小灯有两个:

  • 一个为+3.3V电源指示灯,如果板卡上电正常,该灯常亮;该灯接在GND上
  • 另一个为程序状态指示灯,可供软件调试或者程序运行指示用;该灯接在PC13上

其他内容的理解

  • 复位电路:复位按键的作用是当按键按下,复位引脚的被拉至低电平,单片机触发复位;程序被归零
  • USB电源接口:最小系统板可通过USB接口连接至电脑上或者+5V电源适配器上,实现板卡的供电;但需要5V转3.3V稳压电路(稳压芯片)转电压

五、使用标准库驱动GPIO口点亮stm32板载小灯

这里就是把B站的教程做了一个小小的延伸

-.png
-.jpg

六、GPIO外设结构及输入输出模式

(一)相关结构的理解

GPIO.png

1、输入驱动器
(1)两个开关:分别接VDD和VSS(下文中以D和S命名)
  • 上拉输入模式:D接通,S断开,悬空时默认高电平
  • 下拉输入模式:D断开,S接通,悬空时默认低电平
  • 浮空输入模式:D断开,S断开,悬空时电平不稳定(易受外界干扰)
(2)TTL斯密特触发器(图片翻译有误)

  • attention:上图中电压变化的过程是错误的,以下方文字为准
  • 当输入高于某个选定阈值 (UTP) 时,输出瞬间变为高电平;当输入低于阈值 (LTP) 时,输出瞬间变为低电平;当输入介于两者之间时,输出保持其当前值
  • 作用:对输入电压进行整形,避免波形因为干扰失真出现波动导致误判
  • 可以将模拟信号转化为数字信号
(3)模拟输入、复用功能输入
  • 模拟输入:直接接到ADC上(基本专属,接受模拟信号)
  • 复用功能输入:连接到需要读取端口的外设上(接受数字量)
2、寄存器部分
(1)位设置/清除寄存器
  • 方便对输出数据寄存器16位中的某一位进行修改
  • 对输出数据寄存器某一位置1操作,则在位设置寄存器对应位置写1,不改变位置则为0
  • 对输出数据寄存器某一位置清零,则在位清除寄存器对应位置写1,不改变位置则为0
(2)复用功能输出
  • 与复用功能输入类似,连接到需要从端口输出的外设上
3、输出驱动器

784858a50dc36547fe2e6cc7b9193459.png

两个开关:P-MOS、N-MOS
  • 推挽输入模式(强推输出模式):有较强驱动能力(高低电平均有驱动能力)

    P-MOS和N-MOS均有效

    数据寄存器为1时:上通下断,输出接VDD(高电平)

    数据寄存器为0时:上断下通,输出接VSS(低电平)

  • 开漏输出模式:通信协议的驱动方式(只有低电平有驱动能力)

    P-MOS无效,N-MOS有效

    数据寄存器为1时:N-MOS断开(输出断开),为高阻模式

    数据寄存器为0时:N-MOS导通,接到VSS上 输出低电平

(二)八种GPIO模式

tis:这一部分也可参照GPIO的8种工作模式进行学习哦

1、上拉/下拉/浮空输入模式(数字输入口)

4b09abc2c128d8f996d131b07cab28ee.png

  • 此时输出断开,只能读入数据
  • 通过斯密特整形传入数据寄存器
2、模拟输入

27eb06515b7cc842162f83e7fe0a58e5.png

  • GPIO无效,引脚直接接入ADC
  • 可以看做ADC的专属配置
3、开漏/推挽输出(数字输出口)

de7910cfae0aca87181ef6f52e7cd1bc.png

  • 开漏输出的高电平呈现高阻态!无驱动能力!
  • 输出模式下,输入模式依然有效(即在任何时候输入均有效)
4、复用开漏/推挽输出

d819ffa58908b5c10db8685a31d57680.png

  • 与普通开漏/推挽输出类似
  • 引脚电平由片上外设控制(不再由输出寄存器控制)

七、代码+LED闪烁

#include "stm32f10x.h"                  

int main(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);     
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	GPIO_SetBits(GPIOC, GPIO_Pin_13);
	GPIO_ResetBits(GPIOC, GPIO_Pin_13);
	while(1){		
		}
}

以上为点亮PC13板载小灯的代码,从中可以学习到一些基本内容

1、操纵GPIO口的三个步骤

(1)使用RCC(复位和时钟控制)开启GPIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

最常用的三个函数为AHB、APB1、APB2三个(在rcc.h文件的第692-694行)

(2)使用GPIO_INT函数初始化GPIO
  • 复位GPIO外设

      void GPIO_DeInit(GPIOx)
    
  • 用结构体的参数来初始化GPIO口(very important!)
    定义一个结构体变量->给结构体赋值->调用GPIO_INT函数

  • Mode:工作模式;Pin:对应引脚;Speed:频率

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  • GPIO的八种工作模式对应英语记忆
    AIN:模拟输入
    IN_FLOATING:浮空输入
    IPD,IPU:下拉/上拉输入
    Out_OD,Out_PP:开漏/推挽输出
    AF_OD,AF_PP:复用开漏/推挽输出
(3)使用输入输出函数控制GPIO口
//将结构体设置为默认值	
GPIO_StructInit(GPIO_InitStruct);    
		
//4个GPIO口的写入函数
GPIO_ReadInputDataBit(GPIOx, GPIO_Pin);
GPIO_ReadInputData(GPIOx);
GPIO_ReadOutputDataBit(GPIOx, GPIO_Pin);
GPIO_ReadOutputData(GPIOx);
		
//4个GPIO口的输出函数
GPIO_SetBits(GPIOx,GPIO_Pin);//把指定端口设置为高电平
GPIO_ResetBits(GPIOx,GPIO_Pin);//把指定端口设置为低电平
GPIO_WriteBit(GPIOx, GPIO_Pin, BitAction BitVal);//根据第三个参数的值来设定指定的端口
GPIO_Write(GPIOx, PortVal);//同时对16个端口进行写入操作

2、LED闪烁程序

LED.png

  • 亮–延迟–暗–延迟

八、板载小灯闪烁

类似于上述LED闪烁程序,只需将其修改成PC13上的就行啦(感觉很棒。。。)

BUT 我这程序他不运行!!!

82ce80b11fe9c68c09ae4b7aa0ff30d1.png

  • 查找网上的相关工程,没有可供参考的模版
  • 我也看了江科大教程,也没找到原因(我的理解:这不就是板载小灯点亮和LED灯闪烁相结合的产物吗,改一下相关参数不就行了吗)
笑死,最后错在了接口上。。。板载小灯接的是C13!!!
  • 上面程序中将所有的GPIOA改为GPIOC即可,然后就能闪了
  • 所以要注意细节!!!

九、流水灯

核心原理:将小灯依次设置为点亮模式即可

2b385f5c475f174785ab754965e1580c.png

恭喜你点亮了LED(ノ゚▽゚)ノ,向着嵌入式迈出了第一步

希望你继续坚持下去哦!我们一起努力前进!

特别声明:以上的图片部分来自于网络,感谢CSDN、知乎等平台上各位博主的分享,本文用作交流学习予以引用,在此一并表示感谢!

  • 40
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值