[LOOK] LOOK_V20111018学习 第一帖:LED闪烁及UART

[复制链接]
 楼主| Swallow_0322 发表于 2011-12-6 11:14 | 显示全部楼层 |阅读模式
本帖最后由 Swallow_0322 于 2011-12-6 13:14 编辑

      新唐CortexM0的学习因工作和家事比较繁忙搁置了好久,为庆祝第四届选美顺利结束及Lee老师更新LOOK,今天抽空完成LOOK_V20111018学习第一贴。
      具体实现内容如下:
      助学板上LED1闪烁,并在LED1状态改变时通过UART0发送LED1的状态!

部分源程序:
LOOK_SPI_PDMA_V111018.CPP

  1. #include "main.h"
  2. instance_task_LOOK_SPI_PDMA_V111018_t task_LOOK_SPI_PDMA_V111018(0); // 任务实例
  3. // 任务类 task_LOOK_SPI_PDMA_V111018_t 的例程
  4. void task_LOOK_SPI_PDMA_V111018_t::routine()
  5. {
  6. // TODO: 在此编写例程的内容
  7. using namespace sfr::gpio;
  8. uart0.puts("\n");
  9. uart0.puts("/*==========================\n");
  10. uart0.puts("======菜农250助学计划=======\n");
  11. uart0.puts("========NUC120助学板========\n");
  12.     uart0.puts("===Lee老师旧版的UART程序====\n");
  13. uart0.puts("=====LOOK_V20111018学习=====\n");
  14. uart0.puts("DATE:"__DATE__"-TIME:"__TIME__"\n\r");
  15. uart0.puts("===========第一帖==========\n");
  16. uart0.puts("=====LED1闪烁及UART小练====\n");
  17. uart0.puts("\n");
  18. while (true) {
  19.   // TODO: 在此编写例程的内容
  20.   GPIOA.DOUT().DOUT2(0);   //GPIOA.2清零 即点亮LED1
  21.   uart0.puts(">>LED1 ON!<<\n");
  22.   delay(LOOK_TICKS_PER_SEC/2); //延时1S
  23.   GPIOA.DOUT().DOUT2(1);   //GPIOA.2置位 即熄灭LED1
  24.   uart0.puts(">>LED1 OFF!<<\n");
  25.   delay(LOOK_TICKS_PER_SEC/2); //延时1S
  26. }
  27. }
LOOK_UART.CPP

  1. #include "main.h"
  2. // uart0 构造函数
  3. __INLINE uart0_t::uart0_t()
  4. {
  5. using namespace sfr::uart;
  6.     attach(UART0_IRQn);
  7.     vector_t::enable(UART0_IRQn);
  8. using namespace sfr::gcr;
  9.     SYS.IPRSTC2().UART0_RST = 1;  //UART0 模块复位
  10.     SYS.IPRSTC2().UART0_RST = 0;  //UART0 模块正常工作
  11.     UART0.FCR()
  12.       .TFR(1)    //TX 软件复位
  13.          .RFR(1)    //RX 软件复位
  14.          .RFITL(0x00);   //Rx FIFO中断 (INT_RDA) 触发级别   1位
  15.    
  16. UART0.LCR()
  17.       .SPE(0)    //无校验  奇偶使能位
  18.       .EPE(0)                //  0----奇校验 1----偶校验
  19.       .PBE(0)   
  20.          .WLS(0b011)   //字长度选择 8bits
  21.          .NSB(0);    //1位停止位
  22.    
  23. UART0.BAUD()
  24.       .BRD(0x66)   //外部12MHz 115200bps  对波特率分频寄存器的设置波特率分频设置即该句必须放在第一位
  25.       .DIV_X_EN(1)   //使能分频X
  26.       .DIV_X_ONE(1);   //Divider X equal 1
  27. UART0.IER().RDA_IEN = 1;   //使能接收中断
  28.     /*
  29.      DIV_X_EN  DIV_X_ONE  Divider X  BRD  波特率公式
  30. Disable       0         B        A   UART_CLK / [16 * (A+2)]
  31. Enable        0         B        A   UART_CLK / [(B+1) * (A+2)] , B must >= 8
  32. Enable        1         B        A   UART_CLK / (A+2), A must >=3
  33. */
  34. }
  35. // uart0 输出
  36. void uart0_t::puts(const char* str)
  37. {
  38.     fillfifo(str);                  // 填充 fifo
  39. using namespace sfr::uart;
  40.     UART0.IER().THRE_IEN = 1;   // 允许发送中断
  41.     task = &scheduler.get_current_task();
  42.     delay();                        // 阻塞任务
  43. }
  44. void uart0_t::put_numeral(uint8_t data)
  45. {
  46. char str[2];
  47. char *p;
  48. str[0] = ((data/16%16>9)?(data/16%16+'A'-10)data/16%16+'0'));
  49. str[1] = ((data%16>9)?(data%16+'A'-10)data%16+'0'));
  50. p = &str[0];
  51. puts(p);
  52. }
  53. // uart0 中断服务例程
  54. bool uart0_t::isr(int vector)
  55. {
  56. using namespace sfr::uart;
  57. if (UART0.ISR().THRE_INT)
  58. {
  59.   //UART0发送中断
  60.      const char* str = buffer;
  61.      if (str == 0) {                     // 无数据
  62.          UART0.IER().THRE_IEN = 0;   // 禁止发送中断
  63.          return true;
  64.      }
  65.      fillfifo(str);                      // 填充 fifo
  66.      return false;
  67. }
  68. if (UART0.ISR().RDA_INT)
  69. {
  70.   //UART0接收中断
  71.   /* Get all the input characters */
  72.   while(UART0.ISR().RDA_IF)
  73.   {
  74.    /* Get the character from UART Buffer */
  75.    char Received_Data = UART0.DATA;
  76.    switch (Received_Data)
  77.    {
  78.     case 'R':
  79.     case 'r':
  80.      //Flag_SPI.do_set_bits(0b01);
  81.      break;
  82.     case 'U':
  83.     case 'u':
  84.      //Flag_SPI.do_set_bits(0b010);
  85.      break;
  86.     case 'D':
  87.     case 'd':
  88.     // Flag_SPI.do_set_bits(0b0100);
  89.      break;
  90.     case 'M':
  91.     case 'm':
  92.      //Flag_SPI.do_set_bits(0b01000);
  93.      break;
  94.     default:
  95.         break;
  96.    }
  97.    return false;
  98.   }
  99. }
  100. return false;
  101. }
  102. // uart0 中断滞后服务例程
  103. // 所有数据发送完成后,dsr() 被调用
  104. void uart0_t::dsr(int vector, uintptr_t count)
  105. {
  106.     task->do_wakeup();              // 唤醒任务
  107. }
  108. // uart0 填充 fifo
  109. void uart0_t::fillfifo(const char* str)
  110. {
  111. using namespace sfr::uart;
  112.     do {
  113.         char ch;
  114.         ch = *str++;
  115.         if (ch == 0) {
  116.             str = 0;
  117.             break;
  118.         }
  119.         UART0.DATA = ch;
  120.     } while (!UART0.FSR().TX_FULL);
  121.     buffer = str;
  122. }
  123. uart0_t uart0;              // 创建 uart0 对象
工程框架:


运行截图:


工程包:


编辑原因:工程包未上传成功 20111206 13:39

本帖子中包含更多资源

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

×
lixiaoxu2meng 发表于 2011-12-6 12:48 | 显示全部楼层
顶啊
Ryanhsiung 发表于 2011-12-6 12:49 | 显示全部楼层
这个要顶!
 楼主| Swallow_0322 发表于 2011-12-6 13:39 | 显示全部楼层
多谢支持!
晕!网速太不给力,电脑也不给力,重启3次,此贴发了三条,辛苦大叔把其余两个删除了吧!
lixiaoxu2meng 发表于 2011-12-6 13:46 | 显示全部楼层
4# Swallow_0322
呵呵
plc_avr 发表于 2011-12-6 13:52 | 显示全部楼层
顶!
mcs8098 发表于 2011-12-20 13:41 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:播种一种行为,收获一种习惯;播种一种习惯,收获一种性格;播种一种性格,收获一种人生!

121

主题

1393

帖子

4

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