STM32学习手记①-GPIO的输入、输出、检测

发布者:电子创意达人最新更新时间:2012-08-31 来源: 51hei关键字:STM32  学习手记  GPIO 手机看文章 扫描二维码
随时随地手机看文章
/****************************************************************************

*

* 文件名: main.c

* 内容简述: 本例程演示如何操作GPIO输入和输出。

* 通过检测USER1、USER2按键的状态,点亮不同的LED,同时输出键值到串口1

*

*   按键口线分配:

* USER1键     : PC6  (低电平表示按下)

* USER2键     : PC7  (低电平表示按下)

*

* LED口线分配:

* LED1 : PE0  (输出0点亮)

* LED2 : PE1  (输出0点亮)

*

*/

#include "stm32f10x_lib.h"


GPIO_InitTypeDef GPIO_InitStructure;


extern u32 TimingDelay;


/******************************************************************************************

* 函数名称    :void RCC_Configuration()

* 功能描述    : 复位和时钟控制 配置

* 参数        :  无

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无

******************************************************************************************/

void RCC_Configuration()

{

ErrorStatus HSEStartUpStatus;     //定义外部高速晶振启动状态枚举变量

RCC_DeInit();     //复位RCC外部寄存器到默认值

RCC_HSEConfig(RCC_HSE_ON);     //打开外部高速晶振

HSEStartUpStatus=RCC_WaitForHSEStartUp();     //等待外部高速时钟准备好


if(HSEStartUpStatus==SUCCESS){ //外部高速时钟已经准备好


FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法,位置:RCC初始化子函数里面,时钟起振之后

FLASH_SetLatency(FLASH_Latency_2); //FLASH时序延迟几个周期,等待总线同步操作。推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。


RCC_HCLKConfig(RCC_SYSCLK_Div1);       //配置AHB(HCLK)==系统时钟/1

RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(高速)(PCLK2)==系统时钟/1 

RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(低速)(PCLK1)==系统时钟/2

//注:AHB主要负责外部存储器时钟。PB2负责AD,I/O,高级TIM,串口1。APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM。



RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL时钟==(外部高速晶体时钟/1)* 9 ==72MHz

RCC_PLLCmd(ENABLE); //使能PLL时钟

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL时钟就绪

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟==PLL时钟

while(RCC_GetSYSCLKSource()!=0x08); //等待系统时钟源的启动

}


//------------------------以下为开启外设时钟的操作-----------------------//

//   RCC_AHBPeriphClockCmd (ABP2设备1 | ABP2设备2 , ENABLE); //启动AHB设备

//   RCC_APB2PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //启动ABP2设备

//   RCC_APB1PeriphClockCmd(ABP2设备1 | ABP2设备2 , ENABLE); //启动ABP1设备


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC,ENABLE);   //打开APB2外设

} 

 

/******************************************************************************************

* 函数名称    :GPIO_Configuration()

* 功能描述    : GPIO配置

* 参数        :  无

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无

******************************************************************************************/

void GPIO_Configuration()

{

GPIO_InitTypeDef GPIO_InitStructure;      //定义GPIO初始化结构体


GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;  //管脚位置定义,标号可以是NONE、ALL、0至15。

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;  //输出速度2MHz

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  //推挽输出模式 Out_PP

GPIO_Init(GPIOE,&GPIO_InitStructure);  //E组GPIO初始化


GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;  //管脚位置定义

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_2MHz;  //输出速度2MHz  

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;  //浮空输入 IN_FLOATING  

GPIO_Init(GPIOC,&GPIO_InitStructure);   //C组GPIO初始化


// 由于将GPIO设置为输出时,GPIO输出寄存器的值缺省是0,因此会驱动LED点亮

// 这是我们不希望的,因此在改变GPIO为输出前,先修改输出寄存器的值为1  

GPIO_SetBits(GPIOE,GPIO_Pin_0|GPIO_Pin_1);

}


/******************************************************************************************

* 函数名称    :SysTick_Configuration()

* 功能描述    : systick(系统滴答定时器)初始化函数

* 参数        :  无

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无

******************************************************************************************/

void SysTick_Configuration()

{

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); //配置SysTick时钟==HCLK(AHB时钟) 


SysTick_SetReload(72000);    //若AHB时钟HCLK为72MHz,则计数72000耗时1ms


SysTick_ITConfig(ENABLE);    //SysTick中断使能

}


/******************************************************************************************

* 函数名称    :Delay(u32 nTime)

* 功能描述    : 精确延时函数

* 参数        :  nTime

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无

******************************************************************************************/

void Delay(u32 nTime)

{

SysTick_CounterCmd(SysTick_Counter_Enable);               //开启SysTick计数器


TimingDelay=nTime;

  

while(TimingDelay!=0);


SysTick_CounterCmd(SysTick_Counter_Disable);   //关闭SysTick计数器


SysTick_CounterCmd(SysTick_Counter_Clear);   //SysTick计数器的计数值清0


}


/******************************************************************************************

* 函数名称    :main()

* 功能描述    : 主函数

* 参数        :  无

* 返回值      :  无

* 全局变量    :  无

* 全局静态变量:  无

* 局部静态变量:  无

******************************************************************************************/

int main()

{

 


RCC_Configuration();

GPIO_Configuration();

SysTick_Configuration();


while(1){

if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)==Bit_RESET){

GPIO_ResetBits(GPIOE,GPIO_Pin_0);

while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_6)==Bit_RESET);

}

else{

GPIO_SetBits(GPIOE,GPIO_Pin_0); 

}

 

if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)==Bit_RESET){

GPIO_ResetBits(GPIOE,GPIO_Pin_1);

while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7)==Bit_RESET);

}

else{

GPIO_SetBits(GPIOE,GPIO_Pin_1); 

}

} 

}
关键字:STM32  学习手记  GPIO 引用地址:STM32学习手记①-GPIO的输入、输出、检测

上一篇:STM32学习手记 -USART中断
下一篇:基于STM32的单通道示波器制作成功

推荐阅读最新更新时间:2024-03-16 13:07

存储器系统的非对齐访问
我是之前在试验STM32G031G8U6单片机内部FLASH读操作时候发现的这个问题:STM32F103的flash数据可以从任意地址读,而STM32G031G8U6就不行,读数据地址不对齐的话会死机, 关于什么是非对齐访问,可以参考下图1,来源于CM3权威指南CH5相关内容: 图1 先说结论: 1.Cortex-M0内核不支持****非对齐访问 2.Cortex-M3内核支持非对齐访问 3.intel i5支持非对齐访问 4 .是否支持对存储器的非对齐访问取决于具体使用的内核 本次试验的完成耽误了很久,因为最近一周我得新冠了,体质差得新冠了啥也做不了。以下记录了我的 实验验证过程,过程很长, 没
[单片机]
存储器系统的非对齐访问
STM32下DS18B20的驱动
折腾了一晚上,才把DS18B20的驱动移植到STM32上来。以前在51上使用过单个和多个连接的DS18B20,有现成的程序了,以为很快就能弄好,结果还是被卡住了,下面说下几个关键点吧: 首先是延时的问题,STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。相比之下用SysTick来的简单方便点。 接着是STM32 IO脚的配置问题,因为51是双向的IO,所以作为输入输出都比较方便。STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。于是我也按规定做了,但调了老半天都不成功,是因为DS18B20没有响应的信号。
[单片机]
STM32 TIM定时器 库函数学习笔记
一些库函数的用法手册上讲得不甚详细,网上也几乎没有资料,把我个人理解的一些东西和大家分享一下,如有错漏请批评指正。 TIM_DeInit(TIM2); //注意:按缺省值复位后,时钟源为内部时钟,不必再调用函数设置。如需要更改定时器计时的时钟源, //调用后面的那几个相关函数就行。定时器的时钟不是直接来自APB1/2,而是来自于输入为APB1/2的一个倍频器。 //当APB1/2的预分频系数为1时,定时器的时钟频率等于APB1/2的频率; //当APB1/2的预分频系数为其它数值时,定时器的时钟频率等于APB1/2的频率两倍。 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructur
[单片机]
基于STM32的多路电压测量设计方案
1.引言 近年来,数据采集及其应用受到了人们越来越广泛的关注,数据采集系统也有了迅速的发展,它可以广泛的应用于各种领域。 数据采集技术是信息科学的重要分支之一,数据采集也是从一个或多个信号获取对象信息的过程。数据采集是工业控制等系统中的重要环节,通常采用一些功能相对独立的单片机系统来实现,作为测控系统不可缺少的部分,数据采集的性能特点直接影响到整个系统。 电压的测量最为普遍性,研究设计并提高电压测量精度的方法及仪器具有十分重要的意义。在电压测量设计中,单片机作为控制器,是整个设计的核心。除此之外,设计中还必须有模数转换器(ADC)。ADC用于直接采集模拟电压并将模拟信号转换成数字信号,它直接影响着数据采集的精度和速度。 2.系统概
[电源管理]
基于<font color='red'>STM32</font>的多路电压测量设计方案
关于STM32 定时器 PWM 实时调节占空比时,预装载特性
最近在调试项目的时候遇到一个奇怪的现象:在调试状态下,给定时器捕获比较寄存器赋不同值,能产生不同占空比的波形(图1)。反映到器件上也有不同的电压显示,但是在设备运行的时候,就不行了(图2)。 图1 图2 纠结了N天后,也没有办法解决,只好乖乖的看STM32 控制器手册找找看了,结果还真找到了。 从图中可以看到,如果使能预装载特性,则数据会立即写入寄存器中,如果没有使能,那就得等到有事件(?)发生了。这我就明白了,在调试状态下,给寄存器赋值,不会产生什么影响,因为人的反应速度很慢,但是在运行的时候,占空比是实时发生改变的,这样就不能及时写入到捕获比较寄存器中,输出就不会改变了。所以在配置定时器输出PWM的时候,还
[单片机]
关于<font color='red'>STM32</font> 定时器 PWM 实时调节占空比时,预装载特性
嵌入式开发之STM32开发之EXTI中断使用及踩坑
关键点 中断配置,中断触发 中断配置 中断必然要绑定一个触发中断的外部I/O口,这里我选PA0,对应EXIT0,因为PA0正好对应我板子上的K3键,我需要K3键去触发这个中断 GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* config the extiline(PB0) clock and AFIO clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);//GPIOA根据你自己板子设定
[单片机]
STM32_SPI驱动分析(SD卡)
SD卡有两个可选的通信协议:SD模式和SPI模式。为了电路和程序的简化,选用SPI模式。ZC09的SD与STM32通过SPI1连接。因为STM32内部集成了SPI控制器,所以只需简单的配置,就能实现SPI时序。 一、配置SPI1控制器 1、首先要打开SPI1的时钟,并且要打开SPI1信号线所在GPIO口的时钟。由于SPI1的信号线是在GPIOA上,所以用以下代码打开所需要时钟。这里要注意的是,打开SPI1和GPIOA 最好一起打开,因为本人试过先打开SPI1的时钟,然后再相隔了几行代码后才打开GPIOA的时钟,这样导致SD卡操作失败。 2、将GPIOA的5、6、7脚配置为复用推挽输出、50MHz 。 3、SD
[单片机]
使用STM32的射频模块以无线方式发送和接收数据
在嵌入式电子产品中制作无线项目变得非常重要和有用,因为没有杂乱的电线,这使得设备更加方便和便携。有各种无线技术,例如蓝牙、WiFi、433 MHz RF(射频)等。每种技术都有其自身的优缺点,例如成本、距离或范围传输、速度或吞吐量等。今天我们将使用STM32 的射频模块以无线方式发送和接收数据。 在这里,我们将连接一个 433MHz 射频无线模块与 STM32F103C8 微控制器。该项目分为两部分。发送器将与 STM32 连接,接收器将与 Arduino UNO 连接。发射和接收部分都会有不同的电路图和草图。 在本教程中,RF 发射器向接收器端发送两个值:使用超声波传感器测量的距离和电位计ADC值(0 到 4096),该
[单片机]
使用<font color='red'>STM32</font>的射频模块以无线方式发送和接收数据
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

更多精选电路图
换一换 更多 相关热搜器件
更多每日新闻
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved