OpenEdv-开源电子网

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

关于A13 A14 A15端口复用问题。

[复制链接]

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-4-16
在线时间
19 小时
发表于 2018-6-7 22:23:21 | 显示全部楼层 |阅读模式
25金钱
作为一个小白,在做矩阵键盘和24L01,由于IO口冲突,想把PA8-PA15用作矩阵键盘。结果不管使,在网上查了下说是要重映射。我也重映射了,可是键盘还是没反应,肯求各位大神指点一二。下边贴上程序。

最佳答案

查看完整内容[请看2#楼]

对照着这个表看吧,想用什么IO口,然后就配置什么
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

163

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2762
金钱
2762
注册时间
2017-5-17
在线时间
430 小时
发表于 2018-6-7 22:23:22 | 显示全部楼层
对照着这个表看吧,想用什么IO口,然后就配置什么
QQ图片20180608100120.png
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-4-16
在线时间
19 小时
 楼主| 发表于 2018-6-7 22:25:04 | 显示全部楼层
[mw_shl_code=c,true]#include "ScanKey.h"
#include "delay.h"
#include "led.h"


            
//°′¼ü3õê¼»ˉoˉêy
u16 keyz=0;

void KEY_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//ê1ÄüPORTAê±Öó
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);

       
        GPIO_InitStructure.GPIO_Pin  = KEYOUT;              //¾ØÕó¼üÅìμÄDD
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //éèÖÃ3éíÆíìêä3ö  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin  = KEYIN;               //¾ØÕó¼üÅìμÄáD
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;       //éèÖÃ3ééÏà-êäèë  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);       
        GPIO_SetBits(GPIOA,KEYIN);
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;               //¾ØÕó¼üÅìμÄáD
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //éèÖÃ3ééÏà-êäèë  
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);       
        REAL_OUT_L;
}

u8 KEY_Scan(void)
{
        u16 LIE,HANG,k,i=0;
       
        GPIO_Write(GPIOA, 0xf000);                          //B0-B3êä3öμí  B4-B7éèÖÃÎa¸ßμçÆ½ 1111 0000 0000 0000
        if((GPIO_ReadInputData(GPIOA)&0xF000)!=0xF000)        //óD°′¼ü°′Ï  ò»¶¨»áê1Ä3¸öμçÆ½±äμí 1110 0000 0000 0000
        {
          delay_ms(20);                                     //Ïû¶¶
           if((GPIO_ReadInputData(GPIOA)&0xF000)!=0xF000)   //Ôù′ÎÅD¶ÏêÇ·ñ°′Ï 1110 0000¿Ï¶¨2»μèóú1111 0000
           {

                   LIE=GPIO_ReadInputData(GPIOA)&0xff00;                 //¶áè¡°′¼ü°′ÏÂoóμÃμ½μÄ′úÂë áD£o1110 0000 0000 0000
                   HANG=LIE;                                      //½«′úÂë¸′ÖÆ¸øDD           DD£o1110 0000
                   LIE=~LIE;                                      //½«¼üÂëè¡·′               áD£o0001 1111
                   LIE=LIE&0Xf000;                                //μÃμ½                     áD£o0001 0000
                   for(i=0;i<4&&((HANG&0xF000)!=0xF000);i++)        //                         DD£o1110 0000ê&#199;·&#241;μèóú1111 0000
                                                                        //                          2&#187;μèóú&#212;ò&#189;&#248;DD&#209;°&#213;ò&#207;àó|μ&#196;£&#172;μèóú&#212;òì&#248;1yfor&#209;-&#187;·
                   {                                              //&#182;áμ&#189;&#214;&#174;&#199;°&#188;ì2aμ&#189;&#206;aμíμ&#196;áD±&#228;&#184;&#223;&#212;òí&#203;3&#246;
         GPIO_Write(GPIOA, (HANG&0xF000)|(0x0100<<i));  //&#189;&#248;DDDDé¨&#195;è£&#172;&#214;e′&#206;&#189;&#171;DD&#191;ú&#207;&#223;à-&#184;&#223;£&#172;áD±£3&#214;&#206;a°′&#207;&#194;ê±μ&#196;×′ì&#172;
                     delay_ms(1);  
                                 HANG=GPIO_ReadInputData(GPIOA)&0xff00;            //&#182;áè&#161;IO&#191;ú£&#172;ó&#195;ò&#212;&#197;D&#182;&#207;ê&#199;·&#241;é¨&#195;èμ&#189;DD×&#248;±ê                          
                   }
                   HANG&=0x0F00;                                    //&#189;&#171;DD&#214;μè&#161;3&#246;
                   k=LIE|HANG;                                    //DDáD&#207;à&#188;ó&#212;òμ&#195;μ&#189;&#188;ü&#194;&#235;
                   GPIO_Write(GPIOA, 0xF000);                       //D0-D3à-μí£&#172;D4-D7à-&#184;&#223;£&#172;′&#203;′|ó&#195;à′&#189;&#171;DDáD×′ì&#172;3&#245;ê&#188;&#187;ˉ&#206;a&#206;′°′&#207;&#194;ê±μ&#196;×′ì&#172;
             while((GPIO_ReadInputData(GPIOA)&0xF000)!=0xF000)  //&#197;Dêí·&#197;,μ±&#195;&#187;êí·&#197;ê±oòò&#187;&#214;±&#209;-&#187;·
                   {
                   delay_ms(20);                                //oó&#209;&#216;&#207;&#251;&#182;&#182;£&#172;ê±&#188;&#228;Dè3¤ò&#187;μ&#227;£&#172;D&#161;°′&#188;ü&#207;&#251;&#182;&#182;ê±&#188;&#228;&#191;éò&#212;&#182;ìò&#187;μ&#227;£&#172;′ó°′&#188;ü&#182;&#182;&#182;ˉ&#209;&#207;&#214;&#216;&#207;&#251;&#182;&#182;Dè3¤ò&#187;μ&#227;
                   }
                         REAL_OUT_H;                                  //&#213;&#230;&#213;yêí·&#197;oó£&#172;°&#209;&#213;&#230;ê&#199;±ê&#214;&#190;&#206;&#187;à-μí&#161;£
                   k=(k>>8)&0x00ff;
                         return k;                                       //·μ&#187;&#216;&#188;ü&#194;&#235;
           }
        }
       
        else  REAL_OUT_L; return 0x0000;                                //&#206;T&#188;ü°′&#207;&#194;,·μ&#187;&#216;0
        //return 0;
}


void RealPRES(void)
{
        TIM_Cmd(TIM5,DISABLE);//óD°′&#188;üμ&#196;ê±oò£&#172;1&#216;±&#213;&#182;¨ê±&#198;÷5
        GPIO_WriteBit(GPIOB,GPIO_Pin_5,Bit_SET);
        Backlight_ON;         //′ò&#191;a±31aμ&#198;  
        TIM_Cmd(TIM5,ENABLE); //&#198;&#244;&#182;ˉ&#206;T2ù×÷ê±&#207;T&#182;¨ê±&#198;÷
}
u8 KEY_Value(void)
{
        u16 key_1;
                keyz=KEY_Scan();
                if(keyz!=0x0000)
                {
                        //keyz=0x88;
                        switch(keyz)//keyz
                        {
                                case 0x11: key_1=KEY13_PRES;RealPRES();break;
                                case 0x21: key_1=KEY14_PRES;RealPRES();break;
                                case 0x41: key_1=KEY15_PRES;RealPRES();break;
                                case 0x81: key_1=KEY16_PRES;RealPRES();break;
                                case 0x12: key_1=KEY9_PRES ;RealPRES();break;
                                case 0x22: key_1=KEY10_PRES;RealPRES();break;
                                case 0x42: key_1=KEY11_PRES;RealPRES();break;
                                case 0x82: key_1=KEY12_PRES;RealPRES();break;
                                case 0x14: key_1=KEY5_PRES ;RealPRES();break;
                                case 0x24: key_1=KEY6_PRES ;RealPRES();break;
        case 0x44: key_1=KEY7_PRES ;RealPRES();break;       
                    case 0x84: key_1=KEY8_PRES ;RealPRES();break;                               
                                case 0x18: key_1=KEY1_PRES ;RealPRES();break;
                                case 0x28: key_1=KEY2_PRES ;RealPRES();break;
        case 0x48: key_1=KEY3_PRES ;RealPRES();break;       
                    case 0x88: key_1=KEY4_PRES ;RealPRES();break;               
                                default:break;
                        }
                }
        return key_1;
}
[/mw_shl_code]

[mw_shl_code=c,true]#ifndef __SCANKEY_H
#define __SCANKEY_H         
#include "sys.h"

#define KEYOUT GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11   //DD&#207;&#223;
#define KEYIN  GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15   //áD&#207;&#223;

#define KEY1_PRES          0X01;                //&#188;ü&#214;μ
#define KEY2_PRES          0X02;                 
#define KEY3_PRES          0X03;                       
#define KEY4_PRES          0X04;
#define KEY5_PRES          0X05;
#define KEY6_PRES          0X06;
#define KEY7_PRES          0X07;
#define KEY8_PRES          0X08;
#define KEY9_PRES          0X09;
#define KEY10_PRES        0X0A;         
#define KEY11_PRES  0X0B;
#define KEY12_PRES        0X0C;
#define KEY13_PRES        0X0D;
#define KEY14_PRES        0X0E;
#define KEY15_PRES        0X0F;
#define KEY16_PRES        0X10;        

#define REAL_OUT_H     GPIO_SetBits(GPIOB,GPIO_Pin_5)
#define REAL_OUT_L     GPIO_ResetBits(GPIOB,GPIO_Pin_5)

void KEY_Init(void);  //IO3&#245;ê&#188;&#187;ˉ
u8 KEY_Scan(void);          //°′&#188;üé¨&#195;èoˉêy               
u8 KEY_Value(void);
#endif[/mw_shl_code]
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-4-16
在线时间
19 小时
 楼主| 发表于 2018-6-7 22:25:51 | 显示全部楼层
请大神指点一二
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-6-8 01:52:17 | 显示全部楼层
禁止了JTAG和SWD么?
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-6-8 18:22:51 | 显示全部楼层
不知道你用的是不是F103的芯片,是的话可以禁用JTAG函数  。2楼的老哥贴出了代码,可以参考
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-4-16
在线时间
19 小时
 楼主| 发表于 2018-6-11 18:49:32 | 显示全部楼层
正点原子 发表于 2018-6-8 01:52
禁止了JTAG和SWD么?

对,不过现在解决了,不怎么逛论坛,谢谢原子哥。另外可能是后边的矩阵键盘程序有点问题,现在更换到B口的低8位就好了。
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-4-16
在线时间
19 小时
 楼主| 发表于 2018-6-11 18:50:06 | 显示全部楼层
39035605 发表于 2018-6-8 10:02
对照着这个表看吧,想用什么IO口,然后就配置什么

谢谢老哥,已经解决了
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-4-16
在线时间
19 小时
 楼主| 发表于 2018-6-11 18:50:24 | 显示全部楼层
peng1554 发表于 2018-6-8 18:22
不知道你用的是不是F103的芯片,是的话可以禁用JTAG函数  。2楼的老哥贴出了代码,可以参考

谢谢老哥,已经解决了
回复

使用道具 举报

2

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2017-4-16
在线时间
19 小时
 楼主| 发表于 2018-6-11 18:55:46 | 显示全部楼层
关于把PA13 PA14 PA15当做IO口的方法,楼楼将这两句话放在主函数的最开始的位置,然后用示波器小测了一下IO口的输出电平,就圆满解决了。具体的代码贴一下。另外感谢大家。
[mw_shl_code=c,true]int main()
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//主函数一运行先把这个问题解决,下边代码就能够正常了

/**********以下为正常使用的代码**********/
function1();
}[/mw_shl_code]
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 13:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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