STM32学习笔记

    技术2022-07-10  138

    一、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里判断。所以,写的时候先写全,后期再简化。

    Processed: 0.018, SQL: 9