STM32库开发和流水灯

发布者:幸福之路最新更新时间:2021-05-06 来源: eefocus关键字:STM32  库开发  流水灯 手机看文章 扫描二维码
随时随地手机看文章

一、库开发


这里指的库开发使之调用库函数接口完成对相应寄存器的设置,相比较与51单片机编程中直接对寄存器操作而言,代码量跟查找手册看寄存器位再去配置,能节约很多时间。但是相对的对寄存器的位操作看得就没拿明白了,不知道库函数接口是如何配置各个寄存器位的了,这个时候可以将函数名复制下来去STM32固件库使用手册中查看相应了用法了。如下图所示复制了库函数之后,打开STM32固件库使用手册,复制到这里


然后回车,就会跳到相应的库函数说明那里,一下就清楚了它是如何配置寄存器位的,如下图

这个函数解释的很清楚了,使能和失能APB1的外设时钟,如果不理解参数是什么,可以复制参数能在末尾的表中找到相应的参数解释。


说一下我对库开发的理解,最好的办法就是在别人的例程上修改,节约时间,框架已经搭建好了,只用配置成和自己开发板对应的就行了。这是上上之策,新手最好选择这个办法,现在网上的例程还是挺多的,不然作为一个连函数名都不知道的新手难道要去固件库一个一个翻看函数,浪费时间不说,还不一定有效果,太打消积极性了。至于对寄存器直接进行配置,我个人不反对也不支持,感觉各有各的优点,如果你老手了,可以建议选择用直接配置寄存器去写程序,这样代码自己看得清晰明了。下图显示了库开发个直接配置寄存器开发的区别

二、点亮流水灯


首先我们需要用到第一讲中的建立好的模板,这里我一步一步很详细的教你如何去点亮流水灯


1. 看开发板原理图找到LED灯连接的GPIO( 通用输入输出)口,我这里使用的是神州三号开发板,


可以看到,对应 GPIO分别为GPIOF6 GPIOF7 GPIOF8 GPIOF9,而且是上拉输入,只要控制GPIO端为低电平,就会点亮LED了,为高电平,LED灭。


找到了对应的GPIO了,然后该用到我们的模板了,这个时候新手可能会问该从哪里下手啊,怎么配置GPIO啊,用什么函数啊等等。方法就是我上面说的上上之策:使用别人写好例程框架,修改成自己的。又会问:拿第一讲新建的工程模板不就用不到了?此言差矣,个人认为新建工程模板不仅能让初学者弄清楚各个文件的作用,而且对库开发整体的框架理解会更加深入,最好是对照例程将别人的程序在自己的工程模板中重新编写一份,这样你对各个函数会更加熟悉,基本框架也会有自己的理解。


下面开始介绍如何编写程序,首先打开别人的例程,看到工程文件目录



可以看到在工程目录下USER目录下相比于我们自己建立的工程模板多了led.c led.h两个文件,没错,这就是我们需要编写的两个文件,首先打开led.h


看到代码如下:


led.h


#ifndef __LED_H

#define __LED_H


#include "stm32f10x.h"


#define ON0

#define OFF 1


#define LED1(a) if (a)

GPIO_SetBits(GPIOF,GPIO_Pin_6);

else

GPIO_ResetBits(GPIOF,GPIO_Pin_6)


#define LED2(a) if (a)

GPIO_SetBits(GPIOF,GPIO_Pin_7);

else

GPIO_ResetBits(GPIOF,GPIO_Pin_7)


#define LED3(a) if (a)

GPIO_SetBits(GPIOF,GPIO_Pin_8);

else

GPIO_ResetBits(GPIOF,GPIO_Pin_8)


#define LED4(a) if (a)

GPIO_SetBits(GPIOF,GPIO_Pin_9);

else

GPIO_ResetBits(GPIOF,GPIO_Pin_9)


void LED_GPIO_Config(void);


#endif





这里用到了两个库函数和一个用户自定义函数


分别是:GPIO_SetBits(GPIOF,GPIO_Pin_x);


GPIO_ResetBits(GPIOF,GPIO_Pin_x);


void LED_GPIO_Config(void);


很明显前面两个是对相应的GPIO管脚进行配置高地电平的,Set = 1 , Reset = 0


同时看上的宏定义和条件编译,LED(ON)显然就是对应的GPIO_ResetBits(GPIOF,GPIO_Pin_x);为什么呢?因为前面已经介绍过电路原理图了,低电平是点亮LED,所以Reset对应的是LED(ON);




接下来我们去看看led.c中用户自定义的函数是如何编写的吧




led.c


#include "led.h"


void LED_GPIO_Config(void)

{


GPIO_InitTypeDef GPIO_InitStructure;



RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);



GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;



GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;



GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;



GPIO_Init(GPIOF,&GPIO_InitStructure);



GPIO_SetBits(GPIOF,GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9);

}






虽然上面有注释了,我还是一句一句来讲解下


1. 定义了一个GPIO_InitTypeDef类型的结构体,要想看到结构体中的内容,可以从stm32f10x.h中找到其结构体内部包含了哪些变量


2.开启GPIOF的外设时钟,为什么要开启外设时钟呢?这里有必要解释一下,因为STM32为了实现低功耗,设计了很复杂的时钟系统,每个外设配置使用前都要开启外设时钟,如果对stm32时钟树不是很了解,去看看STM32中文参考手册吧,里面很详细的介绍了STM32时钟。


3. 连着看下面的三句,选择要控制的GPIOF引脚、设置引脚模式为通用推挽输出、设置引脚速率为50MHz。这里是选择对应的GPIO管脚,设置输出方式和配置引脚速率,因为stm32的GPIO有8中工作方式,不详细介绍了,可自行去看stm32中文参考手册。出现了两个新的结构体GPIO_InitStructure.GPIO_Mode 和GPIO_InitStructure.GPIO_Speed,找其出处参考前面寻找GPIO_InitTypeDef


4.GPIO_Init(GPIOF,&GPIO_InitStructure);很明显是把上面配置的信息写入这个结构体中,也叫对引脚配置的初始化


5. 置为高电平,关闭LED灯




照着上面的例子将看是否对应你自己开发板的GPIO和LED,如果不会一样的,修改GPIO引脚就可以了,别忘了led.h中也要修改,等修改成中自己开发板对应的之后,我们去写main函数,因为我们知道,程序的起点是从main函数开始执行的


main.c




#include "stm32f10x.h"

#include "led.h"


void Delay(__IO u32 nCount);




int main(void)

{


LED_GPIO_Config();


while(1)

{

LED1(ON);

Delay(0x0FFFEF);

LED1(OFF);


LED2(ON);

Delay(0x0FFFEF);

LED2(OFF);


LED3(ON);

Delay(0x0FFFEF);

LED3(OFF);


LED4(ON);

Delay(0x0FFFEF);

LED4(OFF);

}

}


void Delay(__IO u32 nCount)

{

for(; nCount !=0; nCount--);

}


这个程序就不详细介绍了,就是点亮一个灯,延时然后关掉,唯一要是的是延时程序中 __IO u32这个数据类型,32对应就是32位数据了,我们使用库开发时,库文件中已经把原本的unsigned intchar宏定义为u32 u16 u8等等数据类型了,这样我们使用起来是不是很方便,这就是库开发的好处之一了。


如果到了这一步,恭喜你,可以点亮流水灯了,我们编译的时候只选择编译的前两个编译按钮就行了,第三个是将所有的文件都重新编译一次,耗时巨大。然后插上J-Link仿真线接通开发板电源,点击Load,程序就会自动下载到开发板了,我们就会看到开发板上的四个LED灯循环的亮起来了,是不很开心!这就对了,当一个新手第一次完成一个小程序而且能看到自己的成果出现在眼前时确实是很激动的,想当初我在大学的时候学习51,点亮LED灯那个激动!跨出第一步,先给自己信心和力量,相信自己你可以的!


关键字:STM32  库开发  流水灯 引用地址:STM32库开发和流水灯

上一篇:STM32学习记录 通用定时器TIM
下一篇:IAR首次给单片机STM32下载解锁flash

推荐阅读最新更新时间:2024-11-07 22:10

关于STM32的除以0运算问题
有人使用STM32G4系列芯片开发产品。他发现程序中如果遇到除以0的操作时,会跑进出错异常中断而影响程序运行。他想知道能否通过设置,即使发生除以0操作也不让程序跑进异常中断,并期望此时的除法运行结果【也就是商】直接等于当前变量类型所支持的最大值,比如,若被除数为16位变量,则经过该除以零操作后直接为其赋值为0xffff。【实际应用中客户的需求往往也是五彩斑斓的。^_^】 事实上是否可以如该STM32用户所愿呢?我们不妨一起看看。 首先,这个问题不属于STM32外设相关的,而是内核相关的。客户选用的是Cortex M4的内核STM32芯片,那我们就从M4内核手册中寻找相关内容。 我们通过查看ARM M4的内核手册,可以看
[单片机]
学习分享STM32时钟系统小结
在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 1、HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③、LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 其中40kHz的LSI供独立看门狗IWDG使用,另外它还可以被选择为实时时钟RTC的时钟源。另外,实时时钟RTC的时钟源还可以选择LS
[单片机]
使用DFU方案实现STM32单片机的高级开发
什么是 DFU DFU全称为Device Firmware update,是ST官方推出的一个通过USB接口进行IAP升级的方案,同串口ISP一样,他们都集成在了芯片内部的Bootloader区段,可以通过配置boot引脚来启动。(具体可参照ST文档:AN2606)。不过内置DFU的芯片大部分型号都比较新,如果你用的型号没有内置DFU程序,没关系我们也可以通过CubeMX来快速生成和移植一个DFU功能程序到你的Flash中来使用。 DFU方案完整的组件包括单片机DFU Demo代码、PC端升级程序、PC端Demo代码以及相关资料手册等。通过使用DFU方案,我们可以快速的集成升级功能到开发的产品中,同时还能够快速的开发与之配套的
[单片机]
使用DFU方案实现<font color='red'>STM32</font>单片机的高级<font color='red'>开发</font>
STM32中PWM外设的原理,使用与配置
至于什么是PWM,百度即可,其实内容简单。 首先STM32中PWM功能是使用计数器实现的,与51里相似,但也有区别。51使用计数器的中断调节占空比,占用MCU的时间。而STM32使用硬件实现PWM的功能,故PWM属于外设功能。(计数器的向上计数,向下计数,中央对齐模式不介绍了)。 PWM主要对2个寄存器的配置。TIMx_ARR = T (设置周期T,频率的设置) TIMx_CCRx = t(设置占空比,这个一条库函数就行了) **附:PWM仍进入挂接的TIMx的中断操作。不过51中断是中断作为一小份进入中断再计数进行pwm调制。而STM32是到ti则进入,已经调制好 #include PWM.h void PWM_i
[单片机]
STM32 USB学习笔记2
主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:STM32F103C8T6 开发库:STM32F1Cube库和STM32_USB_Device_Library STM32Cube库中提供了一些有关USB的例程,在其工程目录下的Applications目录中,这里打开STM3210E_EVAL目录,可以看到如下例程: 这里选取一个简单的例子CDC_Standalone,为一个USB通信例程,具体实现是一个USB转串口的功能,相当于USB串口线。把示例里面的inc和src目录下的文件拷贝到新建工程中,这里是把跟usb通信相关的文件放到了vcp目录下。文件目录结构如下:
[单片机]
<font color='red'>STM32</font> USB学习笔记2
STM32 SysTick延时的使用说明
/*初始化时钟*/ void Init_SysTick(void) { if(SysTick_Config(SystemCoreClock / 1000)) //注意:3.5库中 SystemFrequency 被 SystemCoreClock 取代。 while(1); } /*延时1ms函数*/ __IO uint32_t TimingDelay; void delay_ms(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0); } /*stm32f10x_it.c中的void SysTick_Handler(v
[单片机]
stm32 串口下载错误解决方法
由于我的J-LINK 坏了,新买的还没到,就用串口工具进行下载。 信息提示框提示下载内容不在0x08000000 与0x20000000范围内,即不在程序FLASH或SRAM上。而读器件信息,清除芯片就没问题,表示我的串口下载工具没有问题。我的IAR是新安装的,由于之前在进行.icf文件进行配置的时候使用的是相对寻址,所以也不存在文件夹目录变更后不能使用的问题。 不放心仍然打开IAR看了下.ICF文件的路径,确认没有问题。又在文件夹中打开,icf文件,确认了下载地址没有问题。编译下载还是提示相同的错误。我就在IAR中编辑选项查看ICF文件,看了一下没有改动保存。再次编译下载问题消失。 所以这个可能是IAR的bug吧,我用的
[单片机]
<font color='red'>stm32</font> 串口下载错误解决方法
stm32看门狗复位技巧编辑
一、看门狗复位的应用技巧包括三个方面: 1:判断是否需要使用。如果要使用看门狗的话,需要做一些寄存器的配置,在程序区的某些地方也要加入喂狗指令来防止看门狗复位,有一定的工作量,所以用与不用需要考虑一下。能不使用看门狗的场合,要求是系统即使死机也问题不大,等待人过来断电复位即可的情况。但是这种情况已经很少了,所以绝大多数情况下看门狗都要加上。比如有温控功能的电热水器,假如电加热已经启动,但是系统死机了,温控失效,电加热也不会关闭,这时水温就会一直升高,直到水被蒸干,然后电加热损坏或引发火灾,或者人被开水烫伤。这时有看门狗复位,系统就会恢复正常,检测到温度够了,就会关闭电加热的。 2、保证看门狗工作正常。看门狗除了进行寄存器配置之外,
[单片机]
<font color='red'>stm32</font>看门狗复位技巧编辑
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved