STM32学习笔记

一、ARM,ST,Keil的区别

ARM公司是做芯片架构设计的;
ST公司是做芯片的;
Keil是针对ARM架构做的IDE(集成开发环境)
所以,任何一个做 Cortex-M3 芯片,他们的内核结构都是一样的,不同的是他们的存储器容量,片上外设,IO 以及其他模块的区别。

二、为什么要用typedef定义结构体呢?

例如结构体:

typedef struct
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} GPIO_TypeDef;

这个和下边是一样的:

struct GPIO_TypeDef
{
  __IO uint32_t CRL;
  __IO uint32_t CRH;
  __IO uint32_t IDR;
  __IO uint32_t ODR;
  __IO uint32_t BSRR;
  __IO uint32_t BRR;
  __IO uint32_t LCKR;
} ;

但为什么要用typedef呢?
就是为了定义变量时少用一个strct。
我举个栗子,
第一种方式定义结构体变量:

GPIO_TypeDef A

第二种方式定义结构体变量:

struct GPIO_TypeDef A

虽然仅仅少了一个sturct,但是众所周知,代码量决定代码速度,当结构体被大量应用时效果就会体现出来了。

三、推挽输出

低电平导通,高电平不导通。

上拉输入和下拉输入:
上拉输入就是没信号输入时,是高电平;下拉输入就是没信号输入时,是低电平,相当于自动复位吧。
浮空输入就是什么都不接,据说容受干扰。

四、开启代码补全功能

五、注意事项

5.1 编写文件时最后一行加上空行,否则有警报;

六、添加.c文件和.h文件

6.1 添加.c文件

新建并编写完c文件后一定要加到项目管理选项里面才能编译:

6.2 添加.h文件

如果.h文件不再user文件夹中,而是在自建文件夹中,则需要手动添加头文件路径,否则找不到:

七、串口下载

先安装CH340驱动,

下载线一定要用专用的下载线,就是中间带转换芯片,而不是普通的usb线,

再然后保证硬件设置正确

再然后保证下载工具的设置正确

八、或运算

或运算可以设置某一位而不影响其他位。例如:

RCC->APB2ENR|=1<<3;

上述代码代表将第3位设置为1.
& 0运算清零
| 1运算置1

一个字节4位

定义要放在函数前边。

九、串口通信

STM32写中断处理函数时,必须使用上面固定的函数名;

想判断字符,可以用宏定义。

十、定时器

定时器是内部装置,不占用引脚,但定时器通道可以映射到引脚。PWM则通过定时器通道来配置。

十一、PWM

PWM作用是调节占空比,换句话说就是调节功率。通过设置有效时间和无效时间的比例,达到按百分比输出的目的。
定时器中断和PWM可以共用同一个定时器,因为定时器中断不占用引脚,所以和PWM不冲突。但配置后定时器的更新时间就不要再更改了,否则PWM的占空比就变了。
实验中重映射将定时器3的通道2重映射到PB5,只是因为LED0在PB5上,所以PWM输出到PB5上才能看到灯的效果,实际应用中不需要重映射。

十二、DMA

DMA,全称为:Direct Memory Access,即直接存储器访问,DMA传输将数据从一个地址空间复制到另外一个地址空间。
简单来说,使用DMA传输速度更快。
使用DMA需要从外设(TIMx、ADC、SPIx、I2Cx 和USARTx)产生DMA请求,这样数据传输就不需要从外设-CPU-内存传输,而是通过DMA通道直接从外设-内存传输。

十三、通信

通信就是两个芯片之间的信息交互。总体原则是初始化,发送函数以及接收函数三部分。
通信分为有线通信和无线通信,常用的通信方式有:
IIC、SPI、485、CAN、红外、蓝牙等。

模拟IIC和硬件IIC区别

其实程序是一模一样的,唯一的区别是模拟IIC需要CPU运算,这样就增加了单片机的运算时间,而带IIC接口的单片机,程序还是需要的,但是IIC的运算通过集成在单片机里面的寄存器硬件电路来运算,就像定时器电路一样自己会运算,这样就不要cpu来运算过程了,从而节省了时间,使cpu运算的更快。当然这样就的多付出经济成本哦。
硬件IIC有专门的寄存器,只要你把相关的控制寄存器设置好,比如你要发送数据,就只要往相关的数据寄存器写一个数就可以了。
使用模拟IIC可以使用任意引脚,使用内置IIC需要固定引脚。
常用IIC接口通用器件的器件地址是由种类型号,及寻址码组成的,共7位。
如格式如下:
D7 D6 D5 D4 D3 D2 D1 D0
1-器件类型由:D7-D4 共4位决定的。这是由半导公司生产时就已固定此类型的了,也就是说这4位已是固定的。
2-用户自定义地址码:D3-D1共3位。这是由用户自己设置的,通常的作法如EEPROM这些器件是由外部IC的3个引脚所组合电平决定的(用常用的名字如A0,A1,A2)。这也就是寻址码。换言之,接法不同,地址不同。
所以为什么同一IIC总线上同一型号的IC只能最多共挂8片同种类芯片的原因了。
3-最低一位就是R/W位。这位不用我多说了。
详解参考此文

十四、外部中断和输入捕获的区别

1,定时器配置比中断复杂。
2,一个中断占用一个定时器,也是很浪费的。
3,一个定时器一般只有一个中断服务函数,而定时器有4路输入。
所以,楼主可以用定时器去实现中断的功能,只是有点大材小用。

嗯嗯,我看懂了,最近一直在思考这个问题,他们有什么区别呢?原来实现中断的方式不一样,输入捕获是利用的在定时器溢出周期内产生中断(定时器性质),比外部中断多了计时和滤波功能,但需要占用一个定时器(这个资源很宝贵,一个通道占用了这个定时器其余通道都不能用这个了)除了服务函数而且要配置定时器,配置比较麻烦。而外部中断虽然只有中断功能,但是思路直接,配置简单,每一个IO都能作为中断源。

参考链接:https://www.openedv.com/posts/list/45117.htm

EDN、杂记

不要在.h文件中定义变量,否则会出现过定义情况。

EEPROM用于存储数据,到点不丢失,相当于电脑硬盘。
FLASH,闪存,也是存储数据的。

\r\n是换行
有时按键扫描函数需要有一个缓存函数来传递值,不能直接放在if里判断。所以,写的时候先写全,后期再简化。

posted @ 2020-05-11 23:26  多弗朗强哥  阅读(431)  评论(0编辑  收藏  举报