打印
[新手园地]

不知道为什么M0外部中断0和中断1不能同时使用

[复制链接]
4237|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dong_abc|  楼主 | 2011-4-8 23:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dong_abc 于 2011-5-29 20:07 编辑
#include <ucos_ii.h>
//#include "app_cfg.h"
#include "cpu.h"

#include <stdio.h>
#include "DrvUART.h"
#include "DrvGPIO.h"
#include "NUC1xx.h"
#include "DrvSYS.h"

#include <includes.h>

//用户自定义任务栈配置
#define STACKSIZE 128

//用户自定义任务信息
OS_STK TaskMain_Stack[STACKSIZE];
void TaskMain(void *Id);
#define TaskMain_Prio 20

//用户自定义消息
char EINT0_Msg=0x01;
char EINT1_Msg=0x02;

//用户自定义消息邮箱
OS_EVENT *EINT0_Mbox;
OS_EVENT *EINT1_Mbox;


void SysTick_Handler(void)
{
OS_CPU_SR cpu_sr;

OS_ENTER_CRITICAL();;
OSIntNesting++;
OS_EXIT_CRITICAL();

OSTimeTick();

OSIntExit();
}

void EINT0Callback(void)
{
printf("EINT0 Interrupt!\n");
OSMboxPost(EINT0_Mbox, (void *)&EINT0_Msg);
}

void EINT1Callback(void)
{
printf("EINT1 Interrupt!\n");
OSMboxPost(EINT1_Mbox, (void *)&EINT1_Msg);
}


void Uart_Init(void)
{
STR_UART_T param;

DrvSYS_SelectIPClockSource(E_SYS_UART_CLKSRC, 0); // 使能UART时钟
DrvGPIO_InitFunction(E_FUNC_UART0); // 复用功能引脚设置

param.u32BaudRate = 115200; // 波特率
param.u8cDataBits = DRVUART_DATABITS_8; // 数据位
param.u8cStopBits = DRVUART_STOPBITS_1; // 停止位
param.u8cParity = DRVUART_PARITY_NONE; // 校验位
param.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; // FIFO存储深度 1 字节
param.u8TimeOut = 0; // FIFO超时设定
DrvUART_Open(UART_PORT0, ¶m); // 串口开启、结构体整体赋值

}

void Buzzer_Disable(void)
{
DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT); // 设置GPB10端口为输出模式
DrvGPIO_ClrBit(E_GPB, 10); // 清GPB10端口 蜂鸣器不叫唤
}

void Buzzer_Enable(void)
{
DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT); // 设置GPB10端口为输出模式
DrvGPIO_SetBit(E_GPB, 10); // 清GPB10端口 蜂鸣器不叫唤
}

int main (void)
{
UNLOCKREG(); // 芯片注册解锁
SYSCLK->WRCON.XTL12M_EN = 1; // 设定12M外部晶振
DrvSYS_Delay(5000); // 等待时钟就绪

OSInit();

Uart_Init();

Buzzer_Disable();

DrvGPIO_InitFunction(E_FUNC_EXTINT0);
DrvGPIO_InitFunction(E_FUNC_EXTINT1);

DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_LEVEL, EINT0Callback);
DrvGPIO_EnableEINT1(E_IO_BOTH_EDGE, E_MODE_EDGE, EINT1Callback);

EINT0_Mbox = OSMboxCreate((void *)0);
EINT1_Mbox = OSMboxCreate((void *)0);

OSTaskCreate(TaskMain, (void *)0, (OS_STK *)&TaskMain_Stack[STACKSIZE-1], TaskMain_Prio);

OSStart();
}


void TaskMain(void *Id)
{
INT8U err;
char *pmsg;
for(;;)
{

//EINT0消息处理
pmsg = (char*)OSMboxPend(EINT0_Mbox, 0, &err);
if (err == OS_ERR_NONE)
{
printf("get EINT0_Msg:0x%02x!\n", *pmsg);
Buzzer_Enable();
}
else
{
//printf("TaskMain get EINT0_Msg timeout\n");
}
/*
//EINT1消息处理
pmsg = (char*)OSMboxPend(EINT1_Mbox, 0, &err);
if (err == OS_ERR_NONE)
{
//printf("get EINT1_Msg:0x%02x!\n", *pmsg);
Buzzer_Disable();
}
else
{
//printf("TaskMain get EINT1_Msg timeout\n");
}
*/
}
}



纠结了老半天了,工程如下。
NUC1xx_uCOS_II.rar (313.26 KB)

相关帖子

沙发
dong_abc|  楼主 | 2011-4-9 16:25 | 只看该作者
本帖最后由 dong_abc 于 2011-4-9 20:32 编辑

可以中断,就是不能用printf输出消息值,用semihost输出试试!

使用特权

评论回复
板凳
dong_abc|  楼主 | 2011-4-19 01:15 | 只看该作者
有始有终:printf在中断函数中容易引起重入问题,有时会失效。

使用特权

评论回复
地板
hotpower| | 2011-4-19 15:06 | 只看该作者
奇怪

使用特权

评论回复
5
tear086| | 2011-4-30 09:13 | 只看该作者
可以同时用。

使用特权

评论回复
6
bossa| | 2013-1-5 10:23 | 只看该作者
本帖最后由 bossa 于 2013-1-5 10:25 编辑

8051之所以在国内市场大,就是因为国内的大学老师不思上进,还在用20年期的教材应付学生呢,教出来学生只会51,又不想费神学习新单片机。10年前8051就被PIC取代,后来又被AVR取代,现在被M0取代。如果说性价比,目前当然是新唐M0,如果说最低单价,也轮不上51,三星SAMS3,STM8,还有台湾的,都比51编程简单,调试容易,电路简单,价格一样低。

使用特权

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

本版积分规则

个人签名:此id已冬眠...

43

主题

5074

帖子

22

粉丝