stm32之GPIO库函数开发

关于GPIO库函数的重点函数:P122

  GPIO_Init() :根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器;

  GPIO_ReadInputDataBit():读取指定端口管脚的输入;

  GPIO_SetBits():设置指定的数据端口位;

  GPIO_ResetBits(): 清除指定的数据端口位;

  GPIO_PinRemapConfig(): 改变指定管脚的映射;----------端口映射是很有特色的功能;也是重点知识

  GPIO_EXTILineConfig():选择GPIO管脚用作外部中断线路;

  1 /*Include---------------------------*/
  2 #include"stm32f10x_lib.h"        //包含所有的头文件
  3 #include<stdio.h>
  4
  5 //----------------函数声明--------------------
  6 void Delay_MS(u16 dly);
  7 void RCC_Configuration(void);
  8 void GPIO_Configuration(void);
  9
 10
 11 /*******************************************************************************
 12 * Function Name  : main
 13 * Description    : Main program.
 14 * Input          : None
 15 * Output         : None
 16 * Return         : None
 17 *******************************************************************************/
 18 int main(void)
 19 {
 20     u8  data, i;
 21     #ifdef DEBUG
 22     debug();
 23     #endif
 24     //------------初始化------------
 25     RCC_Configuration();
 26     GPIO_Configuration();
 27
 28     //------------164通信-----------
 29     //CLK:PB5 上升沿 CLR:PE11置1 DATA:PE10
 30     GPIO_SetBits(GPIOE, GPIO_Pin_11);
 31     data = 0x30;
 32     for(i=0;i<8;++i)
 33     {
 34         GPIO_ResetBits(GPIOB, GPIO_Pin_5);    //PB5清零
 35         if((data&0x80) == 0x00)
 36             GPIO_ResetBits(GPIOE, GPIO_Pin_10);
 37         else
 38             GPIO_SetBits(GPIOE, GPIO_Pin_10);
 39         data<<=1;    //左移一位并赋值给data
 40         GPIO_SetBits(GPIOB, GPIO_Pin_5);    //PB5置1,为了产生上升沿
 41     }
 42
 43
 44     while(1)
 45     {
 46         GPIO_SetBits(GPIOA, GPIO_Pin_3);
 47         Delay_MS(1000);
 48         GPIO_ResetBits(GPIOA, GPIO_Pin_3);
 49         Delay_MS(1000);
 50     }
 51
 52 }
 53
 54 /*******************************************************************************
 55 * Function Name  : Delay_Ms
 56 * Description    : delay 1 ms.
 57 * Input          : dly (ms)
 58 * Output         : None
 59 * Return         : None
 60 *******************************************************************************/
 61 void Delay_MS(u16 dly)
 62 {
 63     u16 i,j;
 64     for(i=0;i<dly;i++)
 65         for(j=1000;j>0;j--);
 66 }
 67
 68 /*******************************************************************************
 69 * Function Name  : RCC_Configuration
 70 * Description    : Configures the different system clocks.
 71 * Input          : None
 72 * Output         : None
 73 * Return         : None
 74 *******************************************************************************/
 75 void RCC_Configuration(void)
 76 {
 77     //----------使用外部RC晶振-----------
 78     RCC_DeInit();            //初始化为缺省值
 79     RCC_HSEConfig(RCC_HSE_ON);    //使能外部的高速时钟
 80     while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);    //等待外部高速时钟使能就绪
 81
 82     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);    //Enable Prefetch Buffer
 83     FLASH_SetLatency(FLASH_Latency_2);        //Flash 2 wait state
 84
 85     RCC_HCLKConfig(RCC_SYSCLK_Div1);        //HCLK = SYSCLK
 86     RCC_PCLK2Config(RCC_HCLK_Div1);            //PCLK2 =  HCLK
 87     RCC_PCLK1Config(RCC_HCLK_Div2);            //PCLK1 = HCLK/2
 88     RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);    //PLLCLK = 8MHZ * 9 =72MHZ
 89     RCC_PLLCmd(ENABLE);            //Enable PLLCLK
 90
 91     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);    //Wait till PLLCLK is ready
 92     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);    //Select PLL as system clock
 93     while(RCC_GetSYSCLKSource()!=0x08);        //Wait till PLL is used as system clock source
 94
 95     //---------打开相应外设时钟--------------------
 96     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);    //使能APB2外设的GPIOA的时钟
 97     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);
 98 }
 99
100 /*******************************************************************************
101 * Function Name  : GPIO_Configuration
102 * Description    : 初始化GPIO外设
103 * Input          : None
104 * Output         : None
105 * Return         : None
106 *******************************************************************************/
107 void GPIO_Configuration(void)
108 {
109     //CLK:PB5  CLR:PE11 DATA:PE10
110     GPIO_InitTypeDef    GPIO_InitStructure;        //声明一个结构体变量
111     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;     //选择PB.5
112     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //管脚频率为50MHZ
113     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //输出模式为推挽输出
114     GPIO_Init(GPIOB,&GPIO_InitStructure);                 //初始化GPIOB寄存器
115
116     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 |GPIO_Pin_10 ;     //选择PE.10 PE.11
117     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //管脚频率为50MHZ
118     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //输出模式为推挽输出
119     GPIO_Init(GPIOE,&GPIO_InitStructure);                 //初始化GPIOE寄存器
120
121     //开启时钟    必须在RCC_Configuration中设置
122 } 

 

时间: 2024-10-21 14:24:36

stm32之GPIO库函数开发的相关文章

stm32之GPIO(二)

输入上拉:当IO口作为输入时,比如按键输入,而按键是与地连接,按下时为低电平,则没按下时该IO口应为高电平,上拉即是该IO口通过一个电阻与电源相连,则没按下时为高电平,按下即为低电平.      输入下拉:同理此时按键与电源相连,按下即为高电平,下拉就是该IO口通过一个电阻与地相连,没按下为低电平,按下为高电平.        推挽输出:作为普通的IO口输出高低电平 STM32的输入输出管脚有下面8种可能的配置:(4输入.2输出.2复用输出) 1.浮空输入_IN_FLOATING 2.带上拉输入

STM32中GPIO的8种工作模式

一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通的时候另一个截止.高低电平由IC的电源决定.形象点解释:推挽,就是有推有拉,任何时候IO口的电平都是确定的,不需要外接上拉或者下拉电阻.         推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小.效率高.输出既可以向负载灌电流,也可以从负载抽取电流.推拉式

MicroPython:STM32 上 的 Python 开发

虽然Python在国外是一门非常火的语言,在黑客界更是赫赫有名,然而中国的大学却极少开设 Python 课程,故而国内 Python 程序员多属自学.而一个没有MCU编程经验的初学者,要想让芯片跑起来,出现问题有时候要对照一两千页的英文文档来排查,这也绝非一天两天可以打下坚实的基础. Python是一门适合初学者的语言 相比于目前不少主流的编程语言,Python拥有更好的可读性,因此非常适合初学者.Python本身自带的各种模块加上丰富的第三方模块,免去了很多"重复造轮子"的工作,节省

stm32之GPIO

stm32有5组GPIO口,GPIOA GPIOB GPIOC GPIOD GPIOE 每个GPIO端口有: 2个配置寄存器GPIOx_CRL, GPIOx_CRH(32位): 2个数据寄存器GPIOx_IDR, GPIOx_ODR(32位): 1个置位/复位寄存器GPIOx_BSRR(32位): 1个复位寄存器GPIOx_BRR(16位): 1个锁定寄存器GPIOx_LCKR(32位): 输入模式: -输入浮空:顾名思义也就是输入什么信号才是什么信号,对于浮空输入要保证有明确的输入信号. ─

STM32 下的库函数和寄存器操作比较

以 led闪烁中的flashLed函数例子: 库函数操作简单,但是效率不如寄存器操作的高: 寄存器操作很复杂,因为要熟悉上百个寄存器,但是程序效率很高 /**下面是通过直接操作库函数的方式实现IO控制**/ while(1) { GPIO_ResetBits(GPIOB,GPIO_Pin_9); //LED0对应引脚GPIOF.9拉低,亮 等同LED0=0; GPIO_SetBits(GPIOB,GPIO_Pin_10); //LED1对应引脚GPIOF.10拉高,灭 等同LED1=1; del

STM32之使用库函数驱动LED灯

一.熟悉GPIO结构体 以下这个结构体是我从官方手册中获取的: typedef struct { u16 GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; } GPIO_InitTypeDef; 二.编写程序步骤 1.首先定义一个GPIO_InitTypeDef的结构体,给结构体起一个名字 GPIO_InitStructure; GPIO_initTypeDef GPIO_initStructure ; 2.初

android平台应用GPIO模拟IR控制车载DTV

 数字电视-DTV对我们来说早已不是一个新东西,在车载电子上DTV大多是以模块的形式独立存在的,是可配的.在车载的市场上,客户的需求是多种多样的,如果把DTV也做到车载导航主PCB上去,还是不灵活,不要DTV的就得是不同的PCB板,这对于售后维护.开发都不是一个好办法. DTV在家里,大家一般都是通过遥控器来操作,当然现在有些android的电视盒子可以通过手机来控制,有个泰捷遥控器的apk,通过同一个wifi热点的电视盒,可以用手机来操作也挺方便.但是在车上,怎么去操作DTV呢?在小车上,一般

STM32F4 输入输出(GPIO)模式理解

stm32的GPIO的配置模式有好几种,包括: 1. 模拟输入: 2. 浮空输入: 3. 上拉输入: 4. 下拉输入: 5. 开漏输出: 6. 推挽输出: 7. 复用开漏输出: 8. 复用推挽输出   如图是GPIO的结构原理图:     1.模拟输入   从上图我们可以看到,我觉得模拟输入最重要的一点就是,他不经过输入数据寄存器,所以我们无法通过读取输入数据寄存器来获取模拟输入的值,我觉得这一点也是很好理解的,因为输入数据寄存器中存放的不是0就是1,而模拟输入信号不符合这一要求,所以自然不能放

stm32-单片机跑上嵌入式系统ucosii以后,不用考虑顺序执行的问题吗

问题描述 单片机跑上嵌入式系统ucosii以后,不用考虑顺序执行的问题吗 原来裸机跑的时候,写程序都是按程序执行顺序一步一步来的,加了系统不用了吗?那程序是怎么跑的呢? 还有这个图中说道裸机的时候要考虑具体物理地址,如果是用stm32的库函数开发不是也不需要考虑的吗?跑上ucos以后是不是也是相当于他们给了一些这样的库函数,我们之间调用不用知道具体操作那些寄存器? 解决方案 在单独的进程线程看当然还是顺序执行,这里说的不是顺序执行是因为有多个进程,操作系统负责调度,也就是说它负责先什么时候让哪些