打印
[Kinetis]

关于ke06z板子uart中断写法问题

[复制链接]
3621|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bigfly|  楼主 | 2015-1-28 15:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 bigfly 于 2015-1-28 15:59 编辑

    大家好。我是一名在校学生,刚接触学习单片机。
   
    现在使用ke06z板子,想通过串口实现上位机控制板子上led,比如我输入a,红灯亮。
   
    如果不使用中断,直接写在while(1)里就可以。我想着是使用中断,在中断服务程序中判断输入字符是什么,然后控制灯的亮灭,但是不知道怎么样才能通过输入一个字符,让主程序进入中断服务程序。
   
    看了ke6z的uart-interrupt_Demo的演示程序,但是这个程序是通过中断读取一串字符串,自己看的也不是太懂。求各位朋友能告诉我应该怎么做。

相关帖子

沙发
bigfly|  楼主 | 2015-1-29 08:45 | 只看该作者
自己顶一下

使用特权

评论回复
板凳
FSL_TICS_ZJJ| | 2015-1-29 09:40 | 只看该作者
那你可以直接使用uart-interrupt_DEMO例程,然后以稍微修改下。
你可以在中断中判断下输入的字符是不是你需要的字符。
或者你中断只管接收,存储到一个变量中,然后在主程序中判断是否是你需要的值,是则点灯,点完等清楚你的存储buff

使用特权

评论回复
地板
bigfly|  楼主 | 2015-1-29 10:19 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-29 09:40
那你可以直接使用uart-interrupt_DEMO例程,然后以稍微修改下。
你可以在中断中判断下输入的字符是不是你需 ...

DEMO是一个中断接收给定字符串的例子,修改demo在while(1)中让它输出相应字符,发现程序是在进入while(1)之前就接收完了整个字符串,demo程序如下:
/******************************************************************************
*
* Freescale Semiconductor Inc.
* (c) Copyright 2013 Freescale Semiconductor, Inc.
* ALL RIGHTS RESERVED.
*
***************************************************************************
*
* THIS SOFTWARE IS PROVIDED BY FREESCALE "AS IS" AND ANY EXPRESSED OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL FREESCALE OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************
*
* @file Uart_demo.c
*
* @author Freescale
*
* @version 0.0.1
*
* @date Jun-20-2013
*
* @brief providing framework of test cases for MCU.
*
*******************************************************************************/

#include "common.h"
#include "rtc.h"
#include "uart.h"
#include "UART_app.h"
#include "sysinit.h"

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

/******************************************************************************
* Constants and macros
******************************************************************************/
#define SEND_BUF_LEN    50

/******************************************************************************
* Local types
******************************************************************************/

/******************************************************************************
* Local function prototypes
******************************************************************************/

/******************************************************************************
* Local variables
******************************************************************************/
uint8_t send_buf[SEND_BUF_LEN];
volatile uint8_t u8IsSendDone;

/******************************************************************************
* Global functions
******************************************************************************/

void printf_int(int8* str)
{
        uint32 len = 0;
   
        u8IsSendDone = 0;                   /* send is in process to protect send_buf[] */
   
        while(*str)
        {
                send_buf[len++] = *str;
                str++;
                if (len >= (SEND_BUF_LEN-1))
                {
                        send_buf[SEND_BUF_LEN-1] = 0;
                        break;
                }
        }


    UART_SendInt(UART1, send_buf, len);

}

void UART_SendDone(void)
{
    u8IsSendDone = 1;
   
}

int main (void)
{
    UART_ConfigType sConfig;

    /* Perform processor initialization */
    sysinit();
   
    u8IsSendDone = 1;

    sConfig.u32SysClkHz = BUS_CLK_HZ;
    sConfig.u32Baudrate = UART_PRINT_BITRATE;
   
    UART_Init(UART1,&sConfig);  
    UART_SetTxDoneCallback(UART1, UART_SendDone);
    UART_SetCallback(UART_HandleInt);

    LED0_Init();
    printf("\nRunning the UART_Interrupt_demo project.\n");
         
          /* enable UART1 interrupts */      
    NVIC_EnableIRQ(UART1_IRQn);

    printf_int("\n\rPrint characters using interrupt mode.\n");
    while (!u8IsSendDone);          /* Waiting for send done */
   
    printf_int("\n\rrepeat Print characters using interrupt mode.\n");
    while (!u8IsSendDone);          /* Waiting for send done */
   
    while (1);
}

程序中没有接收字符就中断的函数,自己试着改了一下,在while(1)中让它亮对应的led灯,发现程序只要进入while(1),就没法中断,输入字符也没有用,不知道该用哪个函数,或者应该怎么办:'(,看了一下uart中断类型,里面也没有输入字符就中断的类型,希望指点一下

使用特权

评论回复
5
FSL_TICS_ZJJ| | 2015-1-29 13:23 | 只看该作者
bigfly 发表于 2015-1-29 10:19
DEMO是一个中断接收给定字符串的例子,修改demo在while(1)中让它输出相应字符,发现程序是在进入while ...

你中断服务函数怎么写的,中断和while(1)没有关系的。

使用特权

评论回复
6
bigfly|  楼主 | 2015-1-29 14:03 | 只看该作者
FSL_TICS_ZJJ 发表于 2015-1-29 13:23
你中断服务函数怎么写的,中断和while(1)没有关系的。

中断服务程序
void abc(void)
{               
                u8Ch = UART_GetChar(TERM_PORT);
                if(u8Ch=='a')
                {
                        LED3_Toggle();
                }
                UART_PutChar(TERM_PORT, u8Ch);
}
现在苦于不知道给如何进入这个中断服务程序,我想着是只要有上位机给板子输入字符,就进入这个中断服务程序,但是不知道该怎么做

使用特权

评论回复
7
FSL_TICS_ZJJ| | 2015-1-29 14:43 | 只看该作者
bigfly 发表于 2015-1-29 14:03
中断服务程序
void abc(void)
{               

你现在是基于官方KEXX_DRIVERS_V1.2.1吗?
用的是什么IDE,IAR还是keil?
服务函数名称要链接到中断向量表中的。

使用特权

评论回复
8
bigfly|  楼主 | 2015-1-29 15:46 | 只看该作者
本帖最后由 bigfly 于 2015-1-29 15:51 编辑
FSL_TICS_ZJJ 发表于 2015-1-29 14:43
你现在是基于官方KEXX_DRIVERS_V1.2.1吗?
用的是什么IDE,IAR还是keil?
服务函数名称要链接到中断向量 ...

我是按照您回答另一个同学ke06连接问题配置的,应该是官方kexx-DRIVERS_V1.2.1.
然后用的opensda,编译环境是codewarrior。
我刚刚试着写了一下,加入了UART_ReceiveInt的函数,现在输入字符能跳到服务程序中了,但是只能跳一次,以后输入字符串就跳不进去了,不知道为什么,这是我写的主函数(基于demo改的):
int main (void)
{
    UART_ConfigType sConfig;
    uint8_t  u8Ch[100];
    /* Perform processor initialization */
    sysinit();
    LED1_Init();
    u8IsSendDone = 1;

    sConfig.u32SysClkHz = BUS_CLK_HZ;
    sConfig.u32Baudrate = UART_PRINT_BITRATE;
   
    UART_Init(UART1,&sConfig);  
   
    UART_SetRxDoneCallback(UART1,UART_slip);
    UART_SetCallback(UART_HandleInt);
    printf("\nRunning the UART_Interrupt_demo project.\n");
         
          /* enable UART1 interrupts */
   
    NVIC_EnableIRQ(UART1_IRQn);
   
    UART_ReceiveInt(UART1,u8Ch,1);
   
    while (1);
}
中断服务程序:
void UART_slip()
{
        
        LED1_Toggle();
}

使用特权

评论回复
9
FSL_TICS_ZJJ| | 2015-1-30 11:44 | 只看该作者
bigfly 发表于 2015-1-29 15:46
我是按照您回答另一个同学ke06连接问题配置的,应该是官方kexx-DRIVERS_V1.2.1.
然后用的opensda,编译环 ...

你开接收中断使能了吗?
看你程序没有使能。
你这样写吧

1:main.c 的main函数这样:
int main (void)
{
    UART_ConfigType sConfig;

    /* Perform processor initialization */
    sysinit();
   
    u8IsSendDone = 1;

    sConfig.u32SysClkHz = BUS_CLK_HZ;
    sConfig.u32Baudrate = UART_PRINT_BITRATE;
   
    UART_Init(UART1,&sConfig);  
     UART1->C2 |= UART_C2_RIE_MASK; //enable receive interrupt
    //UART_SetTxDoneCallback(UART1, UART_SendDone);
    //UART_SetCallback(UART_HandleInt);
  
   

    LED0_Init();
   // printf("\nRunning the UART_Interrupt_demo project.\n");
      
      /* enable UART1 interrupts */      
    NVIC_EnableIRQ(UART1_IRQn);

   // printf_int("\n\rPrint characters using interrupt mode.\n");
  //  while (!u8IsSendDone);          /* Waiting for send done */
   
   // printf_int("\n\rrepeat Print characters using interrupt mode.\n");
   // while (!u8IsSendDone);          /* Waiting for send done */
   
    while (1)
    {
      if(txflag == 1)
      {
        txflag = 0;
        LED0_Toggle();
      }
   
    }
}
:2:uart.c的 void UART1_Isr(void) 函数这样:
void UART1_Isr(void)
{
static unsigned char i=0;
    //UART_Callback(UART1);
/*
if(UART1->S1 & UART_S1_TDRE_MASK)
{
   UART1->D = 0X55;
}*/
        if (UART1->S1 & UART_S1_RDRF_MASK)//?óê?êy?Y
    {
           i= UART1->D;
           if( i == 0xaa)    txflag=1;
           else  txflag=0;
    }
}

3:uart.h 添加:
extern uint8_t txflag;
这个函数的功能就是,每次如果接收的数据是0XAA,则翻转LED0,否则不翻转。



使用特权

评论回复
10
FSL_TICS_ZJJ| | 2015-2-3 09:34 | 只看该作者
楼主如果还有问题,欢迎继续交流。
如果问题解决了,还请帮我们及时结贴。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

0

粉丝