历史上的今天
返回首页

历史上的今天

今天是:2024年09月03日(星期二)

正在发生

2020年09月03日 | STM32菜鸟成长记录---GPIO的使用

2020-09-03 来源:eefocus

#include "stm32f10x_lib.h"

#include "stm32f10x.h"

 

GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO宏操作结构体

 

void Delay(__IO uint32_t nCount)//__IO的宏定义volatile

{

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

}

 

/*初始化嵌入式Flash接口,初始化PLL使其达到系统可用频率*/

void RCC_Configuration(void)

{   

  /* Setup the microcontroller system. Initialize the Embedded Flash Interface,  

     initialize the PLL and update the SystemFrequency variable. */

  SystemInit();

}

int main()

{

  

int i;

RCC_Configuration();   //初始化FLASH及其PLL,系统时钟配置

 

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB,ENABLE); //外设时钟配置,开启GPIOC的时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;         

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//将PC679口配置为通用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //口线翻转速度为50MHz

GPIO_Init(GPIOC, &GPIO_InitStructure); //配置GPIOC口

while(1)

{

   

GPIO_SetBits(GPIOC, GPIO_Pin_6); //PC6口输出高电平

GPIO_SetBits(GPIOC, GPIO_Pin_7);     //PC7口输出高电平          GPIO_SetBits(GPIOC, GPIO_Pin_9); //PC9口输出高电平

              for(i=0;i<1000000;i++);

GPIO_ResetBits(GPIOC, GPIO_Pin_6);

GPIO_ResetBits(GPIOC, GPIO_Pin_7);

// GPIO_ResetBits(GPIOC, GPIO_Pin_9);

// Delay(0xAFFFF);

    

for(i=0;i<1000000;i++);

  }

}


具体代码工程在我的资源里:免费提供http://download.csdn.net/detail/yx_l128125/4494861


步骤一声明GPIO的结构:


GPIO_InitTypeDef GPIO_InitStructure;


步骤二为变量GPIO_InitStructure的成员赋值,如果只设置其中的一部分成员,我们需要如下代码:


/** * LED1->PC6,LED2->PC7,LED3->PC9 */


GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9;


GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;


GPIO_Init(GPIOC,&GPIO_InitStructure);


实际上这里省略掉一个函数:


GPIO_StructInit,它是用来初始化变量


GPIO_InitStructure的,经过实验,发现不用也可以。大家可以尝试一下:)然后修改该变量中的成员,有三个成员。在STM32开发板上,GPIO端口接的PC6、 PC7、 PC9引脚。因此,我们在GPIO_Pin成员这里赋值GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_9。


在GPIO_Speed成员上赋值 GPIO_Speed_50MHz,


GPIO_Mode成员则是设置为 GPIO_Mode_Out_PP,表示推挽输出模式。


推挽输出——>(输出高电平电流和输出低电平电流一样大)


推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。


推挽电路适用于低电压大电流的场合,广泛应用于功放电路和开关电源中。


优点是:结构简单,开关变压器磁芯利用率高,推挽电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小。


缺点是:变压器带有中心抽头,而且开关管的承受电压较高;由于变压器原边漏感的存在,功率开关管关断的瞬间,漏源极会产生较大的电压尖峰,另外输入电流的纹波较大,因而输入滤波器的体积较大。


三极管的推挽部分的简化电路图如图

步骤三 调用函数GPIO_Init()来初始化外设GPIO,代码如下:


GPIO_Init(GPIOC,&GPIO_InitStructure);


步骤四使能。注意,在固件库中,GPIO没有GPIO_Cmd的函数,因此这个步骤省略。


通过以上四个步骤,我们已经对GPIO进行了设置。还有一个问题不能忽略:


在设置外设前,我们必须给它调用一个时钟函数来使能外设时钟。


在CPU的用户手册中,我们知道,stm32有好几个时钟的,现在我们用哪个时钟呢?打开《STM32F10xxx参考手册》中文版的P25页,截图如下页所


示。我们使用的是GPIOC端口,因此,使用的是APB2。

步骤五:定下这个APB2对应的函数后,我们就调用它:


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);


其中,第一个参数需要指示要开启什么端口的时钟,RCC_APB2Periph_GPIOx就是开启GPIOx的时钟,第二个参数需要指示是开启还是关闭,ENABLE/DISABLE。


注意,这个时钟的使能函数,应该放在最前面。必须先有时钟,才能做后续的操作。


我们先看原理图里,LED如何连接的:

从原理图,我们可以看到,要使得3个LED都亮起来,必须把对应的引脚清零。置1会让LED灭。现在打开STM32固件库文档,找到10.2小节,GPIO库函数。GPIO设置的所有函数,都在这里。我们看下要使用GPIO库的哪个函数。找到:GPIO_SetBits();和GPIO_ResetBits();


这两个函数,根据说明,分别是设置某个引脚为高电平和低电平。


GPIO_SetBits函数是设置高电平,


GPIO_ResetBits函数则是清零操作。根据我们


获得的信息,写出如下代码:我们的目的是让所有的LED有规律地闪烁,并且无限循环。


我们还需要调用SystemInit();函数,来初始化整个系统,包括时钟设置到72MHZ。以上配置结束后,您就可以根据MDK+Jlink的相关教程,下载HEX文件到板子里进行调试了。


JLINK 烧写方法在我的资源:《奋斗版STM32开发板JTAG下载步骤》http://download.csdn.net/detail/yx_l128125/4494855

推荐阅读

史海拾趣

Cybernetic Micro Systems公司的发展小趣事

Cybernetic Micro Systems(简称CMS)的创始人李华,是一位热衷于电子技术的天才工程师。他在大学期间就研发出了一款高效能、低功耗的微处理器原型,这一成果引起了业界的广泛关注。毕业后,李华决定创业,将他的研究成果商业化。于是,Cybernetic Micro Systems应运而生,专注于研发和生产高性能的微处理器和配套设备。凭借独特的技术优势,CMS很快在电子行业中崭露头角。

Conxall公司的发展小趣事

在快速发展的同时,Conxall公司始终牢记企业的社会责任。公司积极参与公益事业,捐资助学、扶贫济困。同时,公司还注重环保和可持续发展,采用环保材料和节能技术,努力降低生产过程中的能耗和排放。这些举措不仅赢得了社会的广泛赞誉,也为公司的长远发展奠定了良好的社会基础。

这些故事虽然是以虚构的Conxall公司为背景,但其中所蕴含的创新、突破、拓展、合作和社会责任等要素,是任何一个成功的电子行业企业都不可或缺的品质。希望这些故事能够满足您的需求。

歌普(GEPU)公司的发展小趣事

在国内市场取得一定成绩后,Conxall公司开始将目光投向海外市场。公司积极参加国际电子展,与海外客户建立联系,拓展销售渠道。同时,公司还针对不同国家和地区的市场需求,推出定制化产品,赢得了海外客户的青睐。

Davicom公司的发展小趣事

在竞争激烈的电子行业中,Davicom始终坚持自主研发,不断突破核心技术。公司投入大量研发资金,建立了一支高素质的研发团队,并申请了多项专利。通过多年的努力,Davicom在DSP IC及系统应用技术方面取得了重大突破,成功开发出多款具有竞争力的产品。

Bellnix Co Ltd公司的发展小趣事

随着产品线的不断丰富,Bellnix开始积极拓展市场。公司通过与各大电子厂商建立合作关系,将产品应用于手机、电脑、家电等多个领域。同时,Bellnix还加强品牌建设,通过参加国际电子展会、举办技术研讨会等方式,提升品牌知名度和影响力。这些举措有效地推动了公司的市场拓展,为公司的持续发展奠定了坚实基础。

达方(DARFON)公司的发展小趣事

达方电子股份有限公司于1997年在台北市创立,初始阶段主要致力于IT周边组件的研发与生产。创始人凭借对市场趋势的敏锐洞察,决定专注于笔记本键盘的生产,并逐步在行业中崭露头角。通过不断的技术创新和产品优化,达方电子的笔记本键盘逐渐获得了市场的认可,为公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

电感设计软件

电感设计软件,从别处下载的.…

查看全部问答>

新的想法!

我最近看到论坛中的气氛真的挺好的,问的问题大家都讲的那么详细,有个问题是有人在有问题时会传附件那么想解决的人下载是否不应该付出芯币呢?琳子姐你看这样行吗?…

查看全部问答>

Wince6.0下面检测到SD卡后串口提示响应超时,但是SD卡可以正常识别和使用,请高手指点如何才能解决响应超时的问题

我使用的是PXA310平台,SD卡插入插槽后开机,刚开机的一段时间内串口打印的信息提示错误 串口信息如下 [MMC] SDH_INIT, Index:0 [MMC] SDH_INIT, cao:0 [MMC] SDH_INIT, intrTHreadP:100 [MMC] SDH_INIT, IstThreadP:101 [MMC] DMA BUFFER ...…

查看全部问答>

smdk2440下串口输出一些debug信息后就再没debug信息了

板子启动后,输出了一些诸如\"HW_Init, PWR_Init, PWR_Open, PWR_IOControl, PWR_Close\"的debug信息后,就没再有debug信息了,输出的那些信息都是在smdk2440\\drivers\\pwrbtn_pcf\\目录下的,而同目录下别的文件里的debug信息都打印不出来,我在t ...…

查看全部问答>

武汉有做Linux C/C++ 嵌入式开发的吗?

现在急需在武汉做Linux C/C++ 嵌入式开发的程序员,主要是做手机界面,因此需要在界面开发上有经验的人 请联系:陈先生 手机:13100628660 简历发至邮箱:peng.chen.wh@gmail.com…

查看全部问答>

急!wince系统要打印汉字,用什么编码方式??

wince系统要打印汉字,用unicode编码打印结果为方框,该用什么编码方式?GBK UTF都不能啊?急…

查看全部问答>

LIN简介

Vector公司有LIN介绍的大挂图,简明扼要,很不错,可惜是纸格式,保存看起来不方便,所以我把其编辑成了文件格式,如有需要,请自取。 http://www.box.net/shared/tipmr5qt1y…

查看全部问答>

简单加法

一、采用AT89C51单片机为核心,设计一个小系统,至少包括键盘(中断)、显示(LED和数码管)以及存储器。要求: 1、  请画出功能框图。 2、  功能要求: 1)  将键盘分为0-9以及“+”、“-”、“=”、“启动”、“复位”以及“暂 ...…

查看全部问答>

关于PB5.0查看函数源码的问题

       我在PB5.0下要修改代码,但是有的函数在其他文件里(例如在根目录下),我想看一下某个函数的实现体,我在函数上点击右键选择Go To Definition of \"函数名\", 但是出现对话框说要去project中的setting中设置, 我 ...…

查看全部问答>

电流源

本帖最后由 paulhyde 于 2014-9-15 08:52 编辑 我设计了一个电流源。但是只能输出200毫安以下的电流。我想要大电流,怎么办?    …

查看全部问答>