最近才被迫接手STM32-树莓派做智能小车的一个项目。项目的大致,分为32的部分,树莓派的部分和一些高端算法的部分。
因为题主之前只有过51的开发经历,所以半个月前才开始接手32哈市非常蒙蔽的。所以想写一堆帖子来记录一下问题和自己学习的一个历程。
大概已经过去了半个月,平时都在上研一的课程。但是老板对这个项目催得非常厉害。我有时候在想别人重大之类的都是十个人左右一个队伍,我们学校就我一个。实在是力不从心。但是我对此还是感兴趣的。迫于压力所以还是继续弄吧。
之前一直在看火哥的教程。但是进度太慢了。而且介于标准库的问题,经常出现很多需要自己添加修改头文件的地方。磨磨蹭蹭搞了半个月是一点进度也没有。甚至有点被劝退。因为我想的是快速上手然后开始项目。但是32还是需要积累学习的。因此不停的在GITHUB上找代码以及自主修改这个车子自带的坑爹文件,简直是越补越头痛。所以还是找了个途径,准备直接用cubeMX上手。
因为之前尝试过通过自主添加头文件的形式来进行项目编写,结果解决时间太长,对自己也没有什么增长,所以放弃了那种方式。CubeMX还是比较亲切的。至少在帮你配置环境的时候,不会出现莫名其妙的错误和冲突。
题主用的是STM32F103RC。今天用CubeMX进行了点灯。所以准备写一系列帖子记录下自己接下来十天能否搞定这个项目(即使是CV工程师也不错)
第一天:
同51一样,STM32有大量的寄存器和GPIO端口。只不过51的模式单一,且寄存器数量单一。STM32有7组端口,每组端口最多16个PIN。对于每一个GPIO而言,都可以进行编程,并且每个GPIO有7个寄存器。这就是和51特别不一样的地方。同时,I/O口可以配置8钟模式。这都是特别难的。但是通过CubeMX配置,就可以省下特别多的烦恼。(至少不会天天因为头文件确实,定义缺失而苦恼)
本人的CUBEMX的教程就是在B站上看了一堆杂糅的CubeMX教程总结而来,希望对大家有所帮助。
其中GPIO的工作模式:
1.(是否复用)推挽输出:(最常用)高低电平输出 //常用
2.(是否复用)开漏输出:OC门(三极管理解)
3.上拉(下拉)输入
4.(A/D)模拟输入
5.浮空输入
HAL库的理解(理解源码)
举个例子:
Void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, unint16_t GPIO_Pin,GPIO_PinState PinState );
其中:GPIOx:就是叫你选GPIOA----G;
GPIO_Pin:就是叫你选GPIO那个引脚,输入引脚编号;
PinState:选高电平SET或者低电平RESET
我觉得这种东西你跟着教程走一遍有的时候记不住。而且你去翻头文件里的声明,有时候有很麻烦。还是需要不停的做项目,以及引用之类的才可以。
CubeMX里的数据结合
USER:用户用的
Drivers:一堆库的外设之类的文件;基本都用结构体来命名了一大堆的功能。
重点1:解读GPIO_InitTyPeDef
首先对于部分GPIO的函数,首先需要通过
GPIO_InitTyPeDef GPIO_InitSturuct ={};
来进行引用(自我的一个理解)
然后首先是选择一个使能,一般有4个及其以上的使能函数;
_HAL_RCC_GPIOx_CLK_ENABLE() (例如这种时钟使能
然后再配置输入电平
HAL_GPIO_WritePin(--,--,--)
再配置引脚属性,这里就会运用到什么,就是GPIO_InitSturuct这样一个结构体了。
分别配置它的端口、输出模式、上下拉、速度;一般来说,你在CUBEMX里面定义好了,就不要再进行这一步的书写。
HAL_GPIO_Init()
最后就输进去了;
然后做了一个小小的实例,就是跑马灯。这个老师用的L系列的芯片,我自己还是用的野火的F103系列的。但是我觉得差不多嘛。就改改引脚之类的也还好。
同样的道理,选择两个引脚作为低电平输出。一般来说,就是你开发板上LED的地方。
首先看一下,MAIN里面有三个函数:
HAL_Init(); 硬件初始化
SystemClock_Config(); 时钟
MX_GPIO_Init(); 端口初始化
可以通过右键里的GO TO ...去看源码;
这种一般CUBEMX已经帮你写好了
然后再main函数里的while循环里写:
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
HAL_Delay(500);
就可以完成跑马灯了。
怎么说呢。我感觉我这开发板好像抽风了,很大脑壳,闪两次,就不闪了。所以决定换一个方式去解决一下。下一章更