历史上的今天
返回首页

历史上的今天

今天是:2025年01月29日(星期三)

2019年01月29日 | STM32基础设计(1)---点亮LED灯

2019-01-29 来源:eefocus

首先,总结全文,用STM32f103c8点亮LED的大概步骤为:


定义GPIO口结构体

使能相关gpio口的时钟

如果GPIO口有其他重映射功能,先失能其重映射。

操纵相应GPIO口,实现LED灯的亮灭。

下面详细解释具体步骤:


1,定义GPIO口

库函数中GPIO结构体:


typedef struct

{

  uint16_t GPIO_Pin;             /*!< Specifies the GPIO pins to be configured.

                                      This parameter can be any value of @ref GPIO_pins_define */

 

  GPIOSpeed_TypeDef GPIO_Speed;  /*!< Specifies the speed for the selected pins.

                                      This parameter can be a value of @ref GPIOSpeed_TypeDef */

 

  GPIOMode_TypeDef GPIO_Mode;    /*!< Specifies the operating mode for the selected pins.

                                      This parameter can be a value of @ref GPIOMode_TypeDef */

}GPIO_InitTypeDef;

根据库函数,博主是这样定义的:

GPIO_InitTypeDef B_IO;

根据此结构体就可以明确使用GPIOx口的某个引脚,引脚的最大速率以及引脚的使用模式。


模式分别有:模拟输入模式,浮空输入模式(复位口的状态)、上拉/下拉输入模式、通用推挽输出模式、通用开漏输出模式、复用功能推挽输出模式、复用功能开漏输出模式。


速率可根据相应要求,设置为10Mhz、2Mhz、50Mhz。


接下来给GPIO口赋值:


B_IO.GPIO_Pin = GPIO_Pin_3;

B_IO.GPIO_Speed = GPIO_Speed_50MHz;

B_IO.GPIO_Mode = GPIO_Mode_Out_PP;//此为推挽输出

GPIO_Init(GPIOB,&B_IO);//通过GPIO_Init()函数初始化GPIO口。

2.使能相关gpio口的时钟

函数库中相关的函数为:


void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)

详细内容请自查。


博主用的STM32板子上GPIOB的第3引脚连接了LED灯,但是根据STM32中文手册,这个引脚重映射了,所以要关闭其重映射,才可以用GPIOB_Pin_3引脚。


调整引脚映射需要用到这个库函数:


void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState)

另外,对寄存器AFIO_MAPR,AFIO_EXTICRX和AFIO_EVCR进行读写操作前,应当首先打开AFIO时钟。

AFIO_MAPR:配置复用功能重映射


AFIO_EXTICRX:配置外部中断线映射


AFIO_EVCR: 配置EVENTOUT事件输出


RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);


4.控制引脚信号,实现LED灯的亮灭

定义了GPIO口变量,又使能了时钟,这样相关引脚就可以直接控制了。


delay(1000);

GPIOB->BSRR = GPIO_Pin_3;//Pin_3置1

delay(1000);

GPIOB->BRR = GPIO_Pin_3;//置0

delay(1000);

GPIOB->BSRR = GPIO_Pin_3;

可以通过GPIO寄存器BRR、BSRR来设置相关引脚的信号。


简单地说:


对于低16位而言,BRR是用来置0的,BSRR是用来置1的。


对于高16位而言,BRR的高16位保留,BSRR的高16位是用来置0的。


具体的请自查STM32中文手册115页。


因为PB3引脚接着一个电源,故PB3为低电平时灯亮,高电平时灯灭。


详细代码如下:


#include

#define uint unsigned int

#define uchar unsigned char

void delay(uint n)

{

int i,j;

for(i=0;i

for(j=0;j<8500 ; j++);

}

int main(void)

{

GPIO_InitTypeDef B_IO;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

 

B_IO.GPIO_Pin = GPIO_Pin_3;

B_IO.GPIO_Speed = GPIO_Speed_50MHz;

B_IO.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&B_IO);

GPIOB->BRR=GPIO_Pin_3;

while(1)

{

delay(1000);

GPIOB->BSRR = GPIO_Pin_3;

delay(1000);

GPIOB->BRR = GPIO_Pin_3;

delay(1000);

GPIOB->BSRR = GPIO_Pin_3;

}

}

推荐阅读

史海拾趣

智烽维(CDA)公司的发展小趣事

在超级电容器领域不断取得突破的同时,智烽维也在积极探索新的技术领域。2018年,公司成功实现了锂离子电容器的研发突破。这一成果不仅填补了公司在这一领域的空白,也为公司未来的发展开辟了新的道路。锂离子电容器以其高能量密度、高功率密度和长寿命等特点,在新能源汽车、智能电网等领域具有广阔的应用前景。

CMD公司的发展小趣事

进入21世纪,随着数据存储需求的爆炸式增长,CMD公司敏锐地捕捉到了这一市场机遇。公司开始重点研发光纤通道和SCSI RAID控制器方案,并在这一领域取得了显著的突破。CMD的产品被广泛应用于PC和嵌入设备中,其IDE/UltraATA及通用串行总线的半导体器件在市场上占据了重要地位。

AMICC [AMIC TECHNOLOGY]公司的发展小趣事

随着产品线的不断丰富和技术实力的不断提升,AMICC开始积极拓展国内外市场。公司通过与大型电子企业建立战略合作关系,成功打入国际市场。同时,AMICC还积极参加各类行业展会和交流活动,提升品牌知名度和影响力。在市场拓展的过程中,AMICC始终坚持客户至上的原则,为客户提供优质的产品和服务,赢得了客户的信任和好评。

Anderson Electronics Inc公司的发展小趣事

Anderson Electronics Inc公司成立于电子行业的初期,创始人凭借对电子技术的深厚造诣和对市场需求的敏锐洞察,成功开发出了一款具有划时代意义的电子产品。这款产品以其卓越的性能和稳定的品质迅速占领了市场,为公司赢得了良好的口碑和丰厚的利润。在创业初期,公司注重技术创新和研发投入,不断推出新产品,逐步在电子行业中崭露头角。

芯佰微(Corebai)公司的发展小趣事

随着技术的不断发展,芯佰微逐步拓展了自己的产品线,覆盖了放大器、接口电路、电源管理、时间数字转换器、DAC数模转换、ADC模数转换等多个领域。同时,公司积极开拓国内外市场,与众多知名企业建立了合作关系,将产品广泛应用于手持移动终端、消费类电子产品、个人电脑及周边设备、网络通信设备、医疗设备、办公设备等多个领域。这些努力使得芯佰微的产品在市场上获得了广泛认可。

Cembre SPA公司的发展小趣事

随着技术的不断进步,Cembre SPA不断加大对研发的投入,推出了一系列创新产品。其中,公司的电缆接头技术取得了重大突破,不仅提高了接头的可靠性和安全性,还降低了安装和维护的成本。这些技术创新使得Cembre SPA在市场中脱颖而出,成为行业的领导者。

问答坊 | AI 解惑

原创--IAR for AVR入门学习笔记

AVR单片机的编译软件五花八门,用宋丹丹的话就是:那是相当的多 汇编语言的开发平台就不说了(俺不大会,呵呵,说不出什么道道来)。 简单列举几个高级语言的开发平台: WINAVR(GNU GCC AVR); ICC AVR CodeVison AVR IAR for AVR BASIC ...…

查看全部问答>

关于SIM300短信发送的问题

大家好,我是正在使用sim300 GPRS模块,我用AVR mega16单片机控制模块进行短息发送,我用串口调试过了,一点问题也没有,但是我用单片机进行调试的时候就有问题了,大家可以给点建议?…

查看全部问答>

硬盘求救!!!

进系统前提示reboot and select proper boot device or insert boot media in selected boot device and press a key 拿去给售后的人修,说是硬盘坏了,根本就进不去,无法检测,说是只能拿到深圳总部去修。 请问这是怎么回事啊?我看了很多关于 ...…

查看全部问答>

用按纽稳定,用导电橡胶就不稳?

最近做了一块板,按键部分最头痛了! 按键平时10K上拉,按键按下后就会接地,取低电平,按键值会存在一个队列中,在两边接上按键,按按键一切正常。板子上对应每个按键还有一个接触面,用导电橡胶接触,当用导电橡胶碰接触面是,反应有时正常,有 ...…

查看全部问答>

51单片机程序求教怎么才能操作4次那?谢谢了

void zhengti(void) { for (b=0;b 0 && PCA0L >= TIMEOUT)   //高电平持续时间超过120us              {                       ...…

查看全部问答>

关于有符号数和无符号数

通常在8086系统中,计算机是如何判断 有符号数与无符号数呢,例如:1000110100101,如何判断它是一个有符号数,还是无符号数呢? 谢谢各位楼主了,…

查看全部问答>

变卖兰州瑞德研磨机各个部件图纸

变卖兰州瑞德研磨机各个部件图纸 如果需要请联系QQ:790650751 验证:eeworld…

查看全部问答>

大虾,麻烦快给解答下。keil c ,debug 后总是进汇编模式下,还返回不到C,怎么回事

keil c ,debug 后总是进汇编模式下,还返回不到C,怎么回事,刚才还好好的,我也没动那阿。…

查看全部问答>

请教高人register file 和sram 的区别

register file 和sram 是不是内部结构都一样,就是外围电路不同啊另外为什么register file一般都只做成two port的啊,也就是说register file 只作一个端口读一个端口写的忘高人指点!…

查看全部问答>

没有人回答吗?技术保密吗?

初学DSP,以前没有接触过,想省点时间,问问DSP的3.3V的PWM输出如何去驱动IGBT…

查看全部问答>