STM32 初练总结(GPIO)

STM32 初练总结(GPIO)

最近有项目需要用到STM32,开始系统的学习一下STM32这块芯片,整理了一些初学的心得,以备以后忘记了可以回来再看。

管脚资源确认

首先确定所用的STM32型号对应的GPIO管脚资源,一般都会把GPIO管脚分成好几组,比如GPIOA、GPIOB、GPIOC、GPIOD~GPIOG等,一般管脚数越多,分的组也越多,有些管脚是GPIO和其他功能复用的,一些GPIO管脚已经默认了特定的功能,如果要重新自定义映射管脚,需要打开AFIO功能开启重映射。

STM32 库导入和确认

1、STM官网上有STM开发相关的组件资源和库文件,这个网上有很多资源可以利用,先下载然后解压,并按照keil的流程建立一个STM32工程。
2、STM库里面会包含了基本上所有涉及到的组件的底层函数(CMSIS和FWLIB),我们所做的开发就是利用这些底层函数来建立符合自己的应用(APP),所以建立好工程的第一步,就是确认下自己所需要的组件函数是否都能在库中找到,当然,如果对STM32硬件资源和寄存器很熟悉,也可以自己写底层驱动,作为新手,还是建议使用现成的库函数,会节省很多时间。
3、库资源一般由.h和.c两种文件组成,.h是头文件定义,里面定义了组件相关的各种宏定义,参数定义,函数声明等。.c文件是对应组件的底层函数的详细定义,包括初始化、寄存器配置、模式控制等与组件功能相关的底层函数,开发之前最好把这些函数的作用搞清楚 ,在开发APP的时候也可以返回来看。
4、有些组件的功能并不是单一的,可能会与其他组件的功能结合实现,比如UART,可能不但是UART协议的功能,还有GPIO的功能,还有可能管脚复用等,因此要结合相关组件的底层函数一起理解。

代码组成

1、首先是startup文件,工程里面需要添加startup_xxxx.s文件,这个文件和器件类型是相关的,要根据选择的器件类型来添加。startup文件里面定义了工程运行的入口,每次系统复位后,程序会进入到startup文件里面的一个systeminit的地方,从这里开始运行,其实就是初始化时钟和复位等基本的内核配置,让芯片底层功能跑起来,再跳转到main函数,执行用户定义的功能代码。这里有一个问题需要注意,就是代码编写的时候,变量声明需要注意是否会造成内存栈溢出,否则程序运行时会触发hardfalut_handler硬件错误中断,程序进入是循环。另一个可能会触发hardfalut_handler硬件错误中断的原因就是精度设置,这个我也不知道为什么,反正网上说的是在魔法棒里面勾上一个设置选项就没有了,不同版本的keil可能描述不一样,只能多试几次。
在这里插入图片描述
2、其次就是main函数,这个函数里面就是用户自定义的各种功能的函数调用了,其实一般各个组件的应用函数都会另起一组文件(.h,.c)来描述,main文件里面只是把各个组件的功能函数集中调用,按照一定的顺序,加上适当的判断和循环,得到想要的功能;main函数一般是一些组件的初始化和配置函数的调用,加上一个while(1)循环,在while(1)之前初始化各种组件的寄存器和变量,在循环里面实现用户想要实现的功能。
3、组件功能函数,就是实现各个组件初始化和配置的相关代码,有些是可以从库里面直接使用的,有些需要按照需要在底层函数的基础上重新搭建,网上有很多参考,大体上一般包括:
(1)时钟使能,首先确定时钟是属于哪个域的,AHB\APB1\APB2等。当然还有一些专用的时钟域,要结合datasheet来控制。
(2)寄存器配置,包括一些寄存器的配置,库函数一般是会把相关组件的属性都打包成一个structure,用户只需要重新定义一个sturcture的类,然后再按照这个类的属性来配置就可以了。
(3)初始化,配置完成后,调用初始化函数来初始化对应组件。
(4)使能控制,有些组件配置完成寄存器以后,要想让模块工作,需要使能相应的控制寄存器,结合datasheet来使用。
比如这个ADC使用的pin管脚的初始化代码:
void ADC_Pin_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/*----------------Solar_Current_Moniter-------------*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Pin = CH1_Pin;
GPIO_Init(CH1_Port, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = CH2_Pin;
GPIO_Init(CH2_Port, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = CH3_Pin;
GPIO_Init(CH3_Port, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = CH4_Pin;
GPIO_Init(CH4_Port, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Pin = ADC_Trigger_Pin;
GPIO_Init(ADC_Trigger_Port, &GPIO_InitStructure);

}

一个工程的基本组成就是这些,其他都是组件的扩展了,根据需要来扩展,后面再详细分析各个组件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值