OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7794|回复: 6

I/O口复用怎么设置啊,跪求各位大仙指点

[复制链接]

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2011-5-4
在线时间
0 小时
发表于 2011-6-3 22:04:08 | 显示全部楼层 |阅读模式
我想把STM32F103RBT6板子上的例程用库函数自己编一下(用IAR),就是想实现实验2(按键输入)功能,但是在遇到按键时候,有I/O口复用,我如下设置了但是还是不行啊,跪求解:
/***********按键控制函数******************/
#include "stm32f10x_lib.h"
//========================================
#define JTAG_SWD_DISABLE 0X02
#define SWD_ENABLE 0X01
#define JTAG_SWD_ENABLE 0X00
//========================================
ErrorStatus HSEStartUpStatus
//=======Private function prototypes======
void JTAG_Set(u8 mode);
u8 KEY_Scan(void);
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  RCC_HSEConfig(RCC_HSE_ON);    /* Enable HSE */

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
 
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_3);

    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
}
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_GPIOD, ENABLE);
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPD;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
  
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOA,&GPIO_InitStruct); 
    
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;;
    GPIO_Init(GPIOD,&GPIO_InitStruct);
}

void delay_nus(u32 n)    //延时n us:n>=6,最小延时单位6us
{
    u32 j;
    while(n--)           //外部晶振:8M;PLL:9;    8M X 9=72MHz
    {
        j=8;             //微调参数,保证延时的精度
        while(j--);
    }
}
void delay_nms(u32 n)
{
    while(n--)          //外部晶振:8M;PLL:9;    8M X 9=72MHz
      delay_nus(1100);   //1ms延时补偿
}
//========================================
//========================================
int main(void)
{
  
  #ifdef DEBUG
  debug();
  #endif
  
  u8 t;
  RCC_Configuration();
  GPIO_Configuration();
  while(1)
  {
     t=KEY_Scan();
     if(t)
     {
        switch(t)
        {
        case 1:if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)==0)
                  GPIO_SetBits(GPIOA, GPIO_Pin_8);
               else
                  GPIO_ResetBits(GPIOA, GPIO_Pin_8);
               break;
        case 2:if(GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)==0)
                  GPIO_SetBits(GPIOD, GPIO_Pin_2);
               else
                  GPIO_ResetBits(GPIOD, GPIO_Pin_2);
               break;
        case 3:if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)==0)
                  GPIO_SetBits(GPIOA, GPIO_Pin_8);
               else
                  GPIO_ResetBits(GPIOA, GPIO_Pin_8);
               
               if(GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2)==0)
                  GPIO_SetBits(GPIOD, GPIO_Pin_2);
               else
                  GPIO_ResetBits(GPIOD, GPIO_Pin_2);
               break;
        }
     }
  }
  
}



void JTAG_Set(u8 mode)
{
  u32 temp;
  temp=mode;
  temp<<=25;
  RCC->APB2ENR|=1<<0;
  //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  AFIO->MAPR&=0XF8FFFFFF;        //清除MARP的[26;24]
  AFIO->MAPR|=temp;               //设置JTAG模式
}

u8 KEY_Scan(void)
{
  static u8 key_up=1;      //按键松开标志 
  JTAG_Set(JTAG_SWD_DISABLE);
  if(key_up&&((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13)==0)
              ||(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)==0)
              ||(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)))
  {
    delay_nms(10);
    key_up=0;
    if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13)==0)
    {
      JTAG_Set(SWD_ENABLE);
      return 1;
    } 
    else 
       if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)==0)
         {
           JTAG_Set(SWD_ENABLE);
            return 2;
         }  
         else 
           if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
           {
             JTAG_Set(SWD_ENABLE);
             return 3;
           } 
  }
  else if((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_13)==1)
           &&(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15)==1)
           &&(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0))
          key_up=1;
          JTAG_Set(SWD_ENABLE);
        return 0;               //无按键按下
}
                 
#ifdef  DEBUG
/*******************************************************************************
* Function Name : assert_failed
* Description   : Reports the name of the source file and the source line number
*                  where the assert_param error has occurred.
* Input         : - file: pointer to the source file name
*                  - line: assert_param error line source number
* Output         : None
* Return         : None
*******************************************************************************/
void assert_failed(u8* file, u32 line)
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

出现下列错误:





                

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-6-4 00:27:23 | 显示全部楼层
回复【楼主位】michael_tan:
---------------------------------
最后一张图,看到了.
这种错误一般是你代码编辑的错误.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-6-4 12:31:41 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,我想问下,若用库函数的话,就实验2(按键输入)I/O口复用怎么设置啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-6-5 07:23:23 | 显示全部楼层
库函数,我确实不熟。你看看我们光盘提供给你的库函数版本实验吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-6-5 22:25:26 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢 原子哥
回复 支持 反对

使用道具 举报

10

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2013-5-6
在线时间
3 小时
发表于 2013-5-25 22:12:13 | 显示全部楼层
 u8 KEY_Scan(u8 mode)

 static u8 key_up=1;//按键按松开标志
 if(mode)key_up=1;  //支持连按   
 if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1))
 {
  delay_ms(10);//去抖动
  key_up=0;
  if(KEY0==0)return 1;
  else if(KEY1==0)return 2;
  else if(KEY2==0)return 3;
  else if(KEY3==1)return 4;
 }else if(KEY0==1&&KEY1==1&&KEY2==1&&KEY3==0)key_up=1;     
  return 0;// 无按键按下
}


 static u8 key_up=1;//按键按松开标志
 if(mode)key_up=1;  //支持连按   
这两句的作用是什么?老弟 请指点
回复 支持 反对

使用道具 举报

27

主题

118

帖子

0

精华

高级会员

Rank: 4

积分
850
金钱
850
注册时间
2015-12-8
在线时间
176 小时
发表于 2015-12-15 22:16:29 | 显示全部楼层
回复【6楼】吴月涛:
---------------------------------
用static定义的变量在下次再调用所在函数时,所定义的变量的值就是函数中最后一次赋给该变量的值,它不会再执行一次变量的赋初值语句,即
“static u8 key_up=1”这句,当mode为1时,就会执行“key_up=1;”再次将1赋给key_up,这样就可以再次进入
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1)){......},判断是哪个键按下,如key_up为0是不可能进入if(key_up&&(KEY0==0||KEY1==0||KEY2==0||KEY3==1)){......}的。我也刚学没多久,不知道解会不会对你有用
为自己掌握新的知识感到快乐
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 07:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表