STM32 之 KEY

发布者:lqs1975最新更新时间:2016-10-06 来源: eefocus关键字:STM32  KEY 手机看文章 扫描二维码
随时随地手机看文章
在win7下的rcc始终不对,在xp下面就是正常。现在还没有明白原因。

包含文件  STM32 之 KEY - wanghengzhi@126 - 代码豆子

 

(1)Main

C语言: Codee#14612

/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 实验平台 : ST 官方三合一套件 
+ 硬件     : STM32F103C8T6
+ 开发平台 : IAR For ARM 5.40
+ 仿真器   : J-Link
+ 日期     : 2010-10-26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

#include "includes.h"

/*******************************************************************************
                             == Main 函数 == 
*******************************************************************************/
int main(void)
{
RCC_Configuration();    //配置系统时钟 
NVIC_Configuration();   //配置 NVIC 和 Vector Table 

GPIO_Configuration(); 


LED1_HIGH ; LED2_HIGH ; LED3_HIGH ; LED4_HIGH ; // 初始化让灯全灭

//主循环 
while (1)
{
      if( KEY_UP == 0 )
      { LED1_LOW ;}
      if( KEY_DOWN == 0 )
      { LED2_LOW ;}
      if( KEY_LEFT == 0 )
      { LED3_LOW ;}
      if( KEY_RIGHT == 0 )
      { LED4_LOW ;}
      
      if( KEY_SELECT == 0x00 )
      { LED1_HIGH ; LED2_HIGH ; LED3_HIGH ; LED4_HIGH ; }

}
}

(2)Init_External_Device.c

 

 

C语言: Codee#14614

#include "includes.h"

/*******************************************************************************
* Function Name : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;

//将外设 RCC寄存器重设为缺省值
RCC_DeInit();

//设置外部高速晶振(HSE)
RCC_HSEConfig(RCC_HSE_ON);

//等待 HSE 起振 
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if(HSEStartUpStatus == SUCCESS)
{
    //预取指缓存使能
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

     //设置代码延时值
    //FLASH_Latency_2 2 延时周期
    FLASH_SetLatency(FLASH_Latency_2);

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

     //设置高速 AHB 时钟(PCLK2)
    //RCC_HCLK_Div2 APB1 时钟 = HCLK / 2 
    RCC_PCLK2Config(RCC_HCLK_Div2);

    //设置低速 AHB 时钟(PCLK1)
    //RCC_HCLK_Div2 APB1 时钟 = HCLK / 2 
    RCC_PCLK1Config(RCC_HCLK_Div2);

    // PLLCLK = 8MHz * 9 = 72 MHz 
    //设置 PLL 时钟源及倍频系数
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    //使能或者失能 PLL
    RCC_PLLCmd(ENABLE);

    //等待指定的 RCC 标志位设置成功 等待PLL初始化成功
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }


    //设置系统时钟(SYSCLK) 设置PLL为系统时钟源
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    //等待PLL成功用作于系统时钟的时钟源
    // 0x00:HSI 作为系统时钟 
    // 0x04:HSE作为系统时钟 
    // 0x08:PLL作为系统时钟 
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
}

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL, ENABLE);


//使能或者失能 APB2 外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

}


/*******************************************************************************
* Function Name : NVIC_Configuration
* Description    : Configures NVIC and Vector Table base location.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
#ifdef VECT_TAB_RAM
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}

/*******************************************************************************
* Function Name : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure_LED_PORTB;
GPIO_InitTypeDef GPIO_InitStructure_KEY_PORTA;
GPIO_InitTypeDef GPIO_InitStructure_KEY_PORTB;
GPIO_InitTypeDef GPIO_InitStructure_KEY_PORTC;

//==== LED =======================================================
GPIO_InitStructure_LED_PORTB.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
GPIO_InitStructure_LED_PORTB.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_LED_PORTB.GPIO_Mode = GPIO_Mode_Out_PP;   //推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure_LED_PORTB); 

//==== KEY =======================================================
GPIO_InitStructure_KEY_PORTA.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure_KEY_PORTA.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_KEY_PORTA.GPIO_Mode = GPIO_Mode_IPU ;     //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure_KEY_PORTA); 

GPIO_InitStructure_KEY_PORTB.GPIO_Pin = GPIO_Pin_7 ;
GPIO_InitStructure_KEY_PORTB.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_KEY_PORTB.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure_KEY_PORTB); 

GPIO_InitStructure_KEY_PORTC.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 ;
GPIO_InitStructure_KEY_PORTC.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure_KEY_PORTC.GPIO_Mode = GPIO_Mode_IPU;      //上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure_KEY_PORTC); 

}

/*******************************************************************************
* Function Name : 延时函数
*******************************************************************************/
void delay()
{
int i;
for (i=0; i<0xfffff; i++)
    ;
}

(3)includes.h

C语言: Codee#14615
#ifndef INCLUDES
#define INCLUDES 1

//==============================================================================
//             ★★☆☆★★      包含文件         ★★☆☆★★                      
//==============================================================================
#include "stm32f10x_lib.h"
#include "stm32f10x_type.h"
#include "stm32f10x_it.h"

//==============================================================================
//             ★★☆☆★★      全局变量       ★★☆☆★★                      
//==============================================================================

//==============================================================================
//             ★★☆☆★★      调用函数         ★★☆☆★★                      
//==============================================================================
//##### 时钟部分 #############################################################
    void RCC_Configuration(void);       //配置系统时钟 
    void NVIC_Configuration(void);      //配置 NVIC 和 Vector Table 
    
//##### I/O部分 ##############################################################
    void GPIO_Configuration(void);      //配置使用的GPIO口
    
//##### 其他常用函数 #########################################################
    void delay(void);

    
//==============================================================================
//             ★★☆☆★★      IO口定义       ★★☆☆★★                      
//==============================================================================
    #define LED1_HIGH   ( GPIO_SetBits(GPIOB, GPIO_Pin_12) )
    #define LED2_HIGH   ( GPIO_SetBits(GPIOB, GPIO_Pin_13) )
    #define LED3_HIGH   ( GPIO_SetBits(GPIOB, GPIO_Pin_14) )
    #define LED4_HIGH   ( GPIO_SetBits(GPIOB, GPIO_Pin_15) )
    
    #define LED1_LOW    ( GPIO_ResetBits(GPIOB, GPIO_Pin_12) )
    #define LED2_LOW    ( GPIO_ResetBits(GPIOB, GPIO_Pin_13) )
    #define LED3_LOW    ( GPIO_ResetBits(GPIOB, GPIO_Pin_14) )
    #define LED4_LOW    ( GPIO_ResetBits(GPIOB, GPIO_Pin_15) )
    
    #define KEY_UP      ( GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_14) )
    #define KEY_DOWN    ( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) )
    #define KEY_LEFT    ( GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15) )
    #define KEY_RIGHT   ( GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) )
    #define KEY_SELECT ( GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_7) )   
    

#endif

关键字:STM32  KEY 引用地址:STM32 之 KEY

上一篇:STM32 之 SysTick
下一篇:STM32 之 LED

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

STM32驱动16位精度A/D转换芯片ADS1120
一.电路连接 原理图中使用了两个通道。 二.相关寄存器 见ADS1120官方手册 三.代码编写顺序实例(官方伪代码) 四.STM32程序 void ADC_1120_AIN1_CONVER() { //********************************************** //ADC初始化 //********************************************** Delay_N_ms(1);//延时 ADC_CS_LOW;//选中ADC芯片 Delay_N_ms(1);//
[单片机]
STM32 DMA通道外设基地址的配置
简介:看了许多资料都没有讲如何配置DMA通道外设基地址 ADC 规则数据寄存器(ADC_DR)的地址偏移:4Ch #define ADC1_DR_Address ((u32)0x4001244C) 就是ADC1的外设基地址(0x4001 2400)加上ADC数据寄存器(ADC_DR)的偏移地址(0x4c)计算得到的。 Example: /************************************************************************************ * 文件名 :main.c * 描述 :串口1(USART1)向电脑发送当前ADC1的转换电压值 * 库版本 :ST3.5.0
[单片机]
STM32 RTC时钟日历
STM32内部有一个RTC实时时钟模块。RTC模块拥有一组连续技术的计数器。在相应软件配置下,可提供时钟日历的功能,修改计数器的值就可以重新设置系统当前的时间和日期。RTC模块和时钟配置系统是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。系统复位后,静止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写操作。 下面就讲讲怎么来配置STM32的时钟日历。还是基于我自己的规范工程。 1、工程的修改 1)首先当然要添加stm32f10x_rtc.c文件了,除此之外还要用到备份寄存器,所以要添加stm32f10x_bkp.c文件。由于使用了备份寄存器,那么还要添加stm32f10x_pwr.c 到STM3
[单片机]
<font color='red'>STM32</font> RTC时钟日历
STM32硬件结构学习
stm32硬件学习流水帐----电源 分类: 1.工作电源 2.备份域电源 3.adc供电参考电源 工作电源2-3.6v 备份域电源用于RTC时钟模块和备份域寄存器保存 adc供电参考电源:为提高精度ADC具有单独的工作电源和参考电源基准 注意100脚以上的stm32才有ADC参考电源基准,100脚以下ADC参考电源基准内部连接到ADC供电电源上 除此外还有内部1.8,由芯片内部调节器提供. stm32硬件学习流水帐----时钟 stm32有多个时钟源: 1.外部高速时钟HSE,可由外部输入时钟信号或者外接晶体构成振荡器构成. 2.内部高速时钟SHI,频率为8M,精度1% 3.外部低速时钟源LSE,接327
[单片机]
STM32 OLED相关笔记(库函数)
参考资料:正点原子STM32不完全手册OLED章节 有机发光二极管(Organic Light-Emitting Diode, OLED) 0.OLED不需要背光源,对比度高,注意:电压为3.3v,支持SPI 8080 6800 和iic 1.基于SSD1302芯片,一般为128*8*8的规格,称为12864 对于SSD1302芯片的操作: 0X81:设置对比度,包含两个字节,第一个0X81为命令,然后发送一个值来设置对比度,设置的值越大,则屏幕越亮(0X00--0XFF) 0XAE,0XAF:为关闭显示和开启显示 0x8D:为电荷泵的命令值,后面包括一个设置值,第二个字节的A2位表示是否开启电荷泵(0为关闭,1为开启
[单片机]
<font color='red'>STM32</font> OLED相关笔记(库函数)
stm32-afio的使用
1. AFIO的功能 为了优化64脚或100脚封装的外设数目,可以把一些复用功能重新映射到其他引脚上。设置复用重映射和调试I/O配置寄存器(AFIO_MAPR)实现引脚的重新映射。这时,复用功能不再映射到它们的原始分配上。 简言之,AFIO实现了复用功能的重新映射。 2. 在什么情况下,需要开启AFIO时钟? 参考手册中写道:对寄存器AFIO_EVCR, AFIO_MAPR和AFIO_EXTICRX进行读写操作前,应当首先打开AFIO的时钟。 在数据手册的引脚定义中(pin definitions),复用功能 Alternate functions 栏下分为两栏:默认 Default 和重映射 R
[单片机]
stm32-afio的使用
stm32之滴答定时器(2):滴答定时器地址与stm32结构体
上一篇讲了滴答定时器在内核什么位置,这篇讲讲滴答定时器结构体和地址的联系 不知道大家搜滴答定时地址的时候有没有注意到,SysTick_BASE的下面就是SysTick的定义 #define SysTick ((SysTick_Type *) SysTick_BASE) 这个东西第一次接触还是感觉挺绕的(初学者强烈推荐一本入门书《C和指针》(*^__^*) ),这句什么意思呢,通俗地讲,就是把SysTick定义为了指向SysTick_Type结构体的指针,而这个指针的地址呢,是个固定值, SysTick_BASE,也就是上一篇写的0xE000E010。 这个SysTick_Type结构体是什么,同样
[单片机]
<font color='red'>stm32</font>之滴答定时器(2):滴答定时器地址与<font color='red'>stm32</font>结构体
STM32是如何进入中断函数xxx_IRQHandler的
STM32是如何进入中断函数xxx_IRQHandler的,如:void USART1_IRQHandler(void) 前段时间开始接触STM32的时候遇到这样一个问题,程序里面配置好中断设置时,程序运行的时候是怎么进入中断函数的(当然这里所说的中断都是硬件中断),因为跑C程序的时候,本人的理解是,你总得有个“接力棒”或者一个“入口”吧,它才能进入到下一个函数中去。 以uart1配置作为例子, //中断初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStru
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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