[新手园地] 不知道为什么M0外部中断0和中断1不能同时使用

[复制链接]
 楼主| dong_abc 发表于 2011-4-8 23:33 | 显示全部楼层 |阅读模式
本帖最后由 dong_abc 于 2011-5-29 20:07 编辑
  1. #include <ucos_ii.h>
  2. //#include "app_cfg.h"
  3. #include "cpu.h"

  4. #include <stdio.h>
  5. #include "DrvUART.h"
  6. #include "DrvGPIO.h"
  7. #include "NUC1xx.h"
  8. #include "DrvSYS.h"

  9. #include <includes.h>

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

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

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

  19. //用户自定义消息邮箱
  20. OS_EVENT *EINT0_Mbox;
  21. OS_EVENT *EINT1_Mbox;


  22. void SysTick_Handler(void)
  23. {
  24. OS_CPU_SR cpu_sr;

  25. OS_ENTER_CRITICAL();;
  26. OSIntNesting++;
  27. OS_EXIT_CRITICAL();

  28. OSTimeTick();

  29. OSIntExit();
  30. }

  31. void EINT0Callback(void)
  32. {
  33. printf("EINT0 Interrupt!\n");
  34. OSMboxPost(EINT0_Mbox, (void *)&EINT0_Msg);
  35. }

  36. void EINT1Callback(void)
  37. {
  38. printf("EINT1 Interrupt!\n");
  39. OSMboxPost(EINT1_Mbox, (void *)&EINT1_Msg);
  40. }


  41. void Uart_Init(void)
  42. {
  43. STR_UART_T param;

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

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

  53. }

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

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

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

  69. OSInit();

  70. Uart_Init();

  71. Buzzer_Disable();

  72. DrvGPIO_InitFunction(E_FUNC_EXTINT0);
  73. DrvGPIO_InitFunction(E_FUNC_EXTINT1);

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

  76. EINT0_Mbox = OSMboxCreate((void *)0);
  77. EINT1_Mbox = OSMboxCreate((void *)0);

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

  79. OSStart();
  80. }


  81. void TaskMain(void *Id)
  82. {
  83. INT8U err;
  84. char *pmsg;
  85. for(;;)
  86. {

  87. //EINT0消息处理
  88. pmsg = (char*)OSMboxPend(EINT0_Mbox, 0, &err);
  89. if (err == OS_ERR_NONE)
  90. {
  91. printf("get EINT0_Msg:0x%02x!\n", *pmsg);
  92. Buzzer_Enable();
  93. }
  94. else
  95. {
  96. //printf("TaskMain get EINT0_Msg timeout\n");
  97. }
  98. /*
  99. //EINT1消息处理
  100. pmsg = (char*)OSMboxPend(EINT1_Mbox, 0, &err);
  101. if (err == OS_ERR_NONE)
  102. {
  103. //printf("get EINT1_Msg:0x%02x!\n", *pmsg);
  104. Buzzer_Disable();
  105. }
  106. else
  107. {
  108. //printf("TaskMain get EINT1_Msg timeout\n");
  109. }
  110. */
  111. }
  112. }



纠结了老半天了,工程如下。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 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 | 显示全部楼层
奇怪
tear086 发表于 2011-4-30 09:13 | 显示全部楼层
可以同时用。
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

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:此id已冬眠...

43

主题

5074

帖子

22

粉丝
快速回复 在线客服 返回列表 返回顶部