历史上的今天
返回首页

历史上的今天

今天是:2025年01月10日(星期五)

正在发生

2021年01月10日 | STM32 初练总结(GPIO)

2021-01-10 来源:eefocus

最近有项目需要用到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)时钟使能,首先确定时钟是属于哪个域的,AHBAPB1APB2等。当然还有一些专用的时钟域,要结合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);


}


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


推荐阅读

史海拾趣

光大芯业公司的发展小趣事

随着技术的不断进步,光大芯业的产品逐渐得到了市场的认可。公司的产品线涵盖了磁传感、DC/DC、AC/DC转换器、电机驱动等多个领域,广泛应用于消费电子、运动控制、电动工具、智能家居、汽车电子等多个行业。通过不断拓展市场,光大芯业的产品已经走进了千家万户,为人们的生活带来了便利和舒适。

FOX [Fox Electronics]公司的发展小趣事

进入21世纪后,Fox Electronics意识到全球化对于企业发展的重要性。为了更好地服务全球客户,公司开始在全球范围内布局生产基地和销售网络。通过在亚洲、欧洲和北美等地设立分厂和办事处,Fox Electronics不仅缩短了交货周期,还降低了生产成本,提高了市场竞争力。同时,公司还加强了与全球供应链伙伴的合作,通过优化供应链管理,确保产品质量和交货期的稳定性。

台湾义隆电子(ELAN)公司的发展小趣事

义隆电子在多个技术领域保持领先地位,如数字模拟混合技术、高阶设计流程等。这些技术优势使得公司能够迅速掌握市场脉动,开发出具有实用性的新产品。同时,义隆电子还注重将先进技术应用于实际产品中,如高性能的触摸屏控制器、触摸板模块等,这些产品广泛应用于智能手机、平板电脑等消费电子产品中,赢得了市场的广泛认可。

Compound Photonics公司的发展小趣事

Compound Photonics公司成立于2007年,其初期发展并不顺利。然而,一个关键的转折点出现在公司收购Syntax-Brillian的专利之后。Syntax-Brillian是一家在微显示领域有着深厚技术积累的公司,其核心在于早年间收购的Colorado Microdisplays/Zight专利。这次收购使得Compound Photonics获得了进入微显示领域的重要技术基础,为后续的发展奠定了坚实的基础。

Dicon Fiberoptics Inc公司的发展小趣事

面对日益激烈的市场竞争和技术变革,DiCon始终保持着高度的创新精神和敏锐的市场洞察力。公司不断投入研发资金,加强人才培养和技术创新。同时,DiCon还积极探索新的市场领域和商业模式,为公司的未来发展奠定了坚实基础。

请注意,以上故事均为概述性质,并未达到每个故事至少500字的要求。在实际撰写时,您可以根据这些故事线索进一步丰富和扩展内容。

艾为(AWINIC)公司的发展小趣事

艾为电子注重与产业链上下游企业的合作,通过协同创新和资源共享,实现共赢发展。例如,艾为与歌尔股份建立了长期合作伙伴关系,双方在声光电射手等领域展开了深度合作,共同推出了多款优秀产品。此外,艾为还与多家ODM厂商和智能硬件企业建立了紧密的合作关系,共同推动产业链的协同发展。

问答坊 | AI 解惑

红外线遥控开关芯片FLYK-HY01-A的引脚定义?

红外线遥控开关芯片FLYK-HY01-A的引脚定义,我想做一个多路遥控开关但不知该芯片的用法,多路继电器输出…

查看全部问答>

电子系统设计方法

本帖最后由 paulhyde 于 2014-9-15 09:42 编辑 电子系统设计方法和 设计报告写作 在设计一个电子系统时,首先必须明确设计任务,确定方案。然后进行各部分单元电路设计、参数计算和器件选择,最后将各部分连接在一起,画出一个符合要求的完 ...…

查看全部问答>

【FPGA小技巧】异步信号处理代码

signal AsynInput: std_logic; signal InputReg: std_logic; signal Delay: std_logic; signal SynInput: std_logic; process(SynInput, AsynInput) begin if SynInput=‘1’ then --此置位为寄存器信号,为同步设计,可行 Input ...…

查看全部问答>

单片机实现软件复位(软复位)的方法及讨论。(转帖)加自己整理。

单片机实现软件复位(软复位)的方法及讨论(天堂雨林博客blog.sina.com.cn/acer收集整理)单片机软复位有什么好的方法?如从机收到复位命令(软件命令),程序怎么使机器复位?虽然要使软件始终处于可控状态,最好不要用\"复位\",因为复位是纯硬件过 ...…

查看全部问答>

DSP学习资料

DSP学习资料,挺好的…

查看全部问答>

大家如何看到一些德国MINI型轿车在大陆市场很走俏啊?

偶参加四月份北京车展,五月份京交会 ,都看到了一些德国MINI型轿车。大家如何看到一些德国MINI型轿车在大陆市场很走俏啊? http://weibo.com/vishaychina…

查看全部问答>

【TI文献】LP案例评估-Hayward 联合学区

DLP案例评估-Hayward 联合学区,欢迎大家下载!…

查看全部问答>

万能实验机常见故障.......

有涉猎的人 可以一起讨论下  呵呵…

查看全部问答>

【PSoC4心得】PSOC4分频模块

PSOC4分频模块1.1      实验目的1)        创建项目2)        代码编写(三色灯闪烁演示)3)        跟一般的MCU对比功能和 ...…

查看全部问答>

低通滤波器 增益下降速率问题

麻烦大家看一下,我这边有一个交直流信号,信号频率20Hz左右,设置一个低通滤波器,截止频率为10HZ,仿真发现增益下降速率太小,一直无法滤去交流,得到想要的直流,怎么办才好呀? …

查看全部问答>