搜索
bottom↓
回复: 5

KE02读取端口状态问题(已结帖)

[复制链接]

出0入0汤圆

发表于 2015-3-1 10:37:09 | 显示全部楼层 |阅读模式
本帖最后由 土豆-Nanne 于 2015-3-1 14:19 编辑

麻烦问一下,KE02单片机设置成输入后,能读取单个IO口的状态吗?如果可以的话,该如何操作?

我现在是使用GPIO_Read()函数读取整个PTB,但是读取回来的值为全零。(已设置PTB0和PTB1为输入上拉模式)

出0入0汤圆

发表于 2015-3-1 11:12:41 | 显示全部楼层
把程序贴上来说吧

出0入0汤圆

 楼主| 发表于 2015-3-1 11:38:49 | 显示全部楼层
holts2 发表于 2015-3-1 11:12
把程序贴上来说吧

你好,以下是程序,谢谢了

/******************************************************************************
* Header file
******************************************************************************/
#include "all.h"


/******************************************************************************
* Constants and macros
******************************************************************************/
#define PROGRAM_VERSION "20150214V0001"


/******************************************************************************
* Global variables
******************************************************************************/


/******************************************************************************
* Local variables
******************************************************************************/
volatile uint16_t u16Ch0Value,u16Ch1Value;
volatile uint16_t u16Ch5Value;
volatile uint8_t u8IntMark;

u32 temp, temp2;


/******************************************************************************
* Local functions
******************************************************************************/
void RTC_Task(void);
void FTM2_Task(void);
void RTC_Configuration(void);
void FTM2_Configuration(void);
void Delay(uint16 x);


/******************************************************************************
* Local function prototypes
******************************************************************************/
void RTC_Configuration(void)       
{
        RTC_ConfigType  sRTCConfig;
        RTC_ConfigType  *pRTCConfig = &sRTCConfig;

        /* configure RTC to 1Hz interrupt frequency */
        pRTCConfig->u16ModuloValue = 9;
        pRTCConfig->bInterruptEn   = RTC_INTERRUPT_ENABLE;     /* enable interrupt */
        pRTCConfig->bClockSource   = RTC_CLKSRC_1KHZ;          /* clock source is 1khz */
        pRTCConfig->bClockPresaler = RTC_CLK_PRESCALER_100;    /* prescaler is 100 */
        RTC_SetCallback(RTC_Task);
        RTC_Init(pRTCConfig);
}

void FTM2_Configuration(void)
{
#if 0
        /* Ouput FTM0 ch1 to PTB3 which is connected to J2 Pin8 */
        SIM->PINSEL |= SIM_PINSEL_FTM0PS1_MASK;
        /* FTM0 output compare mode, channel 1 toggles when match */
        /* FTM0 output squre wave, period is 10000, pulse width is 5000 */
        FTM_OutputCompareInit(FTM0, FTM_CHANNEL_CHANNEL1, FTM_OUTPUT_TOGGLE);
        /* set MOD value */
//        FTM_SetModValue(FTM0, 4999);
        FTM_SetModValue(FTM0, 1000);
        /* set C1V value */
//        FTM_SetChannelValue(FTM0, FTM_CHANNEL_CHANNEL1, 2000);
        /* set clock source and start the counter */
        FTM_ClockSet(FTM0, FTM_CLOCK_SYSTEMCLOCK, FTM_CLOCK_PS_DIV1);
#endif
#if 0
        /* configure FTM2 ch5, to measure the input wave period */
        FTM_InputCaptureInit(FTM2, FTM_CHANNEL_CHANNEL5, FTM_INPUTCAPTURE_BOTHEDGE);
        FTM_ClockSet(FTM2, FTM_CLOCK_SYSTEMCLOCK, FTM_CLOCK_PS_DIV1);
        FTM_SetCallback(FTM2, FTM2_Task);
        NVIC_EnableIRQ(FTM2_IRQn);
        FTM_EnableChannelInt(FTM2, FTM_CHANNEL_CHANNEL5);
#else
        /* configure FTM2 ch5, to measure the input wave period */
        FTM_SetCallback(FTM2, FTM2_Task);
        FTM_InputCaptureInit(FTM2, FTM_CHANNEL_CHANNEL5, FTM_INPUTCAPTURE_FALLINGEDGE);
        FTM_ClockSet(FTM2, FTM_CLOCK_SYSTEMCLOCK, FTM_CLOCK_PS_DIV16);
#endif
}

void GPIO_Configuration(void)
{
        GPIO_PinInit(GPIO_PTB0, GPIO_PinInput_InternalPullup);                //按键SW8
        GPIO_PinInit(GPIO_PTB1, GPIO_PinInput_InternalPullup);                //按键SW9

//        GPIO_PinInit(GPIO_PTB2, GPIO_PinInput_InternalPullup);                //按键SW8
//        GPIO_PinInit(GPIO_PTB3, GPIO_PinInput_InternalPullup);                //按键SW9
//        GPIO_PinInit(GPIO_PTB4, GPIO_PinInput_InternalPullup);                //按键SW8
//        GPIO_PinInit(GPIO_PTB5, GPIO_PinInput_InternalPullup);                //按键SW9
//        GPIO_PinInit(GPIO_PTB6, GPIO_PinInput_InternalPullup);                //按键SW8
//        GPIO_PinInit(GPIO_PTB7, GPIO_PinInput_InternalPullup);                //按键SW9
}

void Delay(uint16 x)
{
        uint16 i, j;
        for(i = 0; i < x; i++) {
                for(j = 0; j < 650; j++) {}
        }
}


/********************************************************************/
int main (void)
{
        sysinit();
        RTC_Configuration();
        FTM2_Configuration();
        GPIO_Configuration();


//        GPIO_PinInit(GPIO_PTD4, GPIO_PinOutput);        //数码管1
//        GPIO_PinClear(GPIO_PTD4);
//        GPIO_PinInit(GPIO_PTD0, GPIO_PinOutput);        //数码管2
//        GPIO_PinClear(GPIO_PTD0);
//        GPIO_PinInit(GPIO_PTB4, GPIO_PinOutput);        //强度
//        GPIO_PinClear(GPIO_PTB4);
//        GPIO_PinInit(GPIO_PTB3, GPIO_PinOutput);        //各图标
//        GPIO_PinSet(GPIO_PTB3);

//        GPIO_PinInit(GPIO_PTD3, GPIO_PinOutput);
//        GPIO_PinClear(GPIO_PTD3);
//        GPIO_PinInit(GPIO_PTD2, GPIO_PinOutput);
//        GPIO_PinClear(GPIO_PTD2);
//        GPIO_PinInit(GPIO_PTA3, GPIO_PinOutput);
//        GPIO_PinClear(GPIO_PTA3);
//        GPIO_PinInit(GPIO_PTA2, GPIO_PinOutput);
//        GPIO_PinClear(GPIO_PTA2);
//        GPIO_PinInit(GPIO_PTA1, GPIO_PinOutput);
//        GPIO_PinClear(GPIO_PTA1);
//        GPIO_PinInit(GPIO_PTA0, GPIO_PinOutput);
//        GPIO_PinClear(GPIO_PTA0);
//        GPIO_PinInit(GPIO_PTE2, GPIO_PinOutput);
//        GPIO_PinClear(GPIO_PTE2);

//        u8Ch = UART_GetChar(TERM_PORT);
//        UART_PutChar(TERM_PORT, u8Ch);


        /* echo chars received from terminal */
        while(1)
        {
#if 1
                if(IRKeyValidFlag == TRUE) {
                        printf("Succeed! Key number is %d. ", IRKey);
                        IRKeyValidFlag = FALSE;
                }
#endif

                temp = GPIO_Read(GPIOB);
//                temp2 = temp - 1;

        }
}

/*****************************************************************************//*!
*
* @brief callback routine of RTC driver which does what you want to do at
*        every RTC period.
*        
* @param  none
*
* @return none
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void RTC_Task(void)
{
        GPIO_PinToggle(GPIO_PTD3);

//        temp = GPIO_Read(GPIOB);

//        temp = 0x12345678;

        UART_PutChar(TERM_PORT, temp>>24);
        UART_PutChar(TERM_PORT, temp>>16);
        UART_PutChar(TERM_PORT, temp>>8);
        UART_PutChar(TERM_PORT, temp);

}

出0入0汤圆

 楼主| 发表于 2015-3-1 11:49:28 | 显示全部楼层
现在的情况是,KE02在读取端口状态的时候,GPIO_Read(GPIOA)可以正常读取,但是GPIO_Read(GPIOB)读出来的值全部是0,这是什么原因呢?

出0入84汤圆

发表于 2015-3-1 13:49:41 | 显示全部楼层
飞思卡尔的程序写的很烂

库中的GPIOB 和PTB不是一个概念

GPIOA是PTA PTB PTC PTD  GPIOB 是PTE 往后  各32位 最多支持64个IO

没有读取单个端口的函数 可以自己写。

u8 GetGPIOBIT(GPIO_PinType GPIO_Pin)
{
                if (GPIO_Pin < GPIO_PTE0)
        {
                        /* PTA0-7, PTB0-7, PTC0-7, PTD0-7 */
                        if(GPIOA->PDIR & (1<<GPIO_Pin))return 1;
                     else return 0;
        }else
           {
                        /* PTE0-7, PTF0-7, PTH0-7, PTI0-7 */
                        if(GPIOB->PDIR & (1<<(GPIO_Pin - GPIO_PTE0)))return 1;
                            else return 0;
           }
}

出0入0汤圆

 楼主| 发表于 2015-3-1 14:04:35 | 显示全部楼层
boyiee 发表于 2015-3-1 13:49
飞思卡尔的程序写的很烂

库中的GPIOB 和PTB不是一个概念

正如你说的那样,非常感谢!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-9 14:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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