STM32菜鸟成长记录---GPIO的使用
? #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++); } }
步骤一声明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,表示推挽输出模式。 ? 推挽输出——>(输出高电平电流和输出低电平电流一样大) ????? ???????推挽电路适用于低电压大电流的场合,广泛应用于功放电路和开关电源中。 优点是:结构简单,开关变压器磁芯利用率高,推挽电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小。 缺点是:变压器带有中心抽头,而且开关管的承受电压较高;由于变压器原边漏感的存在,功率开关管关断的瞬间,漏源极会产生较大的电压尖峰,另外输入电流的纹波较大,因而输入滤波器的体积较大。 ???????三极管的推挽部分的简化电路图如图
? 步骤三 调用函数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 ? 承诺!这周五前一定要发表关于系统时钟--嘀嗒定时器,普通定时器,485通信的几篇文章,因为时间关系一直没能整理成博客,在此承诺给自己一点压力!做不到丢自己的脸! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Cocos2D v2.0至v3.x简洁转换指南(三)
- React从入门到精通系列之(21)React顶级API
- C/C++指针,ptr 1 = ptr 1字节或ptr 1 * sizeof(pointer_typ
- Windows下编写批处理脚本来启动和重置Oracle数据库
- cocos2dx 高性能高斯模糊(包含lua接口)
- 《从零开始学Swift》学习笔记(Day 20)――函数中参数的传
- iphone – 左侧的PushViewController – 简单?
- 数组 – 在PostgreSQL 9.2,9.3和9.4中追加(推送)和从JSON数
- Flex 中google map 多边形的编码折线
- Ajax和WEB服务数据格式:JSON JSONP