学习STM32的时候,自以为学的芯片越多就越厉害。其实,学习嵌入式重要的是整体的工程思想和项目经验积累,说到底这些芯片,我感觉学习起来都差不多吧,无非就是对内资源(寄存器、中断、定时器、串口等等),和对各种外设的操作而已,挂载的外设越多,系统会越复杂,这时可能会用上操作系统,同时,如果工程中涉及到各种算法、自动控制、采样、滤波等实际问题的时候,不仅会上操作系统,而且还对数学、物理、电路等方面知识要有较强的功底,对编程的能力的要求会更高,此时就要求对STM32的各种资源有比较明晰的了解了。
不得不说STM32真的是一款非常复杂的单片机,一直以来接触的IC SPI.USART等等也只是用了一些常用基本的功能,今天在PWM上也花了不少时间,用库函数的话也是基本的函数调用初始化PWM。不过因为对定时器理解不是很深入,今天回过头去看定时器的内容,理解好定时器频率、重装值对溢出时间的影响是十分重要的。感觉学习还是手握一-本相对详细的教材,单从视频例程和手册看来的知识比片面。越是强大的功能就越是需要复杂的技术来配置它,刚解除stm32的时候我一直再抱怨连用个I0口都如此繁琐, 其实我只是没有熟悉stm32的开发方式。不是每一行代码都得你自己去写,能复制粘贴实现功能也是自己的本事。
在学习stm32外设的时候应该注意一个很重要的事情, 我们应该在用一个工程中通过添加.C和h文件的形式来学习外设的使用,不可像学51那样一个工程一 个实验。 因为stm32功能众多我们做实验可能需要多个外设协同工作,做LCD现实实验可能我们需要ED现实状态,需要SPI连接传感器,需要key来控制状态。 我们把在学习的过程中就大胆地把各个外设封装成文件,当我们完成所有外设学习的时候,这个工程就是我们的一个模板工程。需要做项目的时候直接COPY出来,去粗取精,稍作修改就能直接使用。如此看来stm32的发开也会变得十分方便快捷,估计以后接触更先进的芯片也应该采用这样的学习开发模式。毕竟芯片是越来越先进的,规模也是越来越复杂,只有在学习的时候就写好一个属于你自 己的工程,日后做项目开发才能游刃有余。
以下是一个简单的STM32基础代码示例,它使用GPIO引脚控制LED灯的闪烁:
```c
#include "stm32f4xx.h"
int main(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
// 开启时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// 初始化GPIO引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStruct);
while (1)
{
// 点亮LED灯
GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13);
// 延时
for (int i = 0; i < 1000000; i++);
// 熄灭LED灯
GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13);
// 延时
for (int i = 0; i < 1000000; i++);
}
}
```
这个代码使用了STM32的GPIO库来初始化GPIO引脚,并使用`GPIO_SetBits()`和`GPIO_ResetBits()`函数来控制LED灯的闪烁。在无限循环中,程序点亮LED灯,然后延时一段时间,再熄灭LED灯并再次延时。这个过程将不断重复,使LED灯持续闪烁。
20210320016-雷小虎