打印
[LOOK]

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

[复制链接]
2886|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 Swallow_0322 于 2011-12-6 13:14 编辑

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

部分源程序:
LOOK_SPI_PDMA_V111018.CPP
 
#include "main.h"
instance_task_LOOK_SPI_PDMA_V111018_t task_LOOK_SPI_PDMA_V111018(0); // 任务实例
// 任务类 task_LOOK_SPI_PDMA_V111018_t 的例程
void task_LOOK_SPI_PDMA_V111018_t::routine()
{
// TODO: 在此编写例程的内容
using namespace sfr::gpio;
uart0.puts("\n");
uart0.puts("/*==========================\n");
uart0.puts("======菜农250助学计划=======\n");
uart0.puts("========NUC120助学板========\n");
    uart0.puts("===Lee老师旧版的UART程序====\n");
uart0.puts("=====LOOK_V20111018学习=====\n");
uart0.puts("DATE:"__DATE__"-TIME:"__TIME__"\n\r");
uart0.puts("===========第一帖==========\n");
uart0.puts("=====LED1闪烁及UART小练====\n");
uart0.puts("\n");
while (true) {
  // TODO: 在此编写例程的内容
  GPIOA.DOUT().DOUT2(0);   //GPIOA.2清零 即点亮LED1
  uart0.puts(">>LED1 ON!<<\n");
  delay(LOOK_TICKS_PER_SEC/2); //延时1S
  GPIOA.DOUT().DOUT2(1);   //GPIOA.2置位 即熄灭LED1
  uart0.puts(">>LED1 OFF!<<\n");
  delay(LOOK_TICKS_PER_SEC/2); //延时1S
}
}
LOOK_UART.CPP
 
#include "main.h"
// uart0 构造函数
__INLINE uart0_t::uart0_t()
{
using namespace sfr::uart;
    attach(UART0_IRQn);
    vector_t::enable(UART0_IRQn);
using namespace sfr::gcr;
    SYS.IPRSTC2().UART0_RST = 1;  //UART0 模块复位
    SYS.IPRSTC2().UART0_RST = 0;  //UART0 模块正常工作
    UART0.FCR()
      .TFR(1)    //TX 软件复位
         .RFR(1)    //RX 软件复位
         .RFITL(0x00);   //Rx FIFO中断 (INT_RDA) 触发级别   1位
   
UART0.LCR()
      .SPE(0)    //无校验  奇偶使能位
      .EPE(0)                //  0----奇校验 1----偶校验
      .PBE(0)   
         .WLS(0b011)   //字长度选择 8bits
         .NSB(0);    //1位停止位
   
UART0.BAUD()
      .BRD(0x66)   //外部12MHz 115200bps  对波特率分频寄存器的设置波特率分频设置即该句必须放在第一位
      .DIV_X_EN(1)   //使能分频X
      .DIV_X_ONE(1);   //Divider X equal 1
UART0.IER().RDA_IEN = 1;   //使能接收中断
    /*
     DIV_X_EN  DIV_X_ONE  Divider X  BRD  波特率公式
Disable       0         B        A   UART_CLK / [16 * (A+2)]
Enable        0         B        A   UART_CLK / [(B+1) * (A+2)] , B must >= 8
Enable        1         B        A   UART_CLK / (A+2), A must >=3
*/
}
// uart0 输出
void uart0_t::puts(const char* str)
{
    fillfifo(str);                  // 填充 fifo
using namespace sfr::uart;
    UART0.IER().THRE_IEN = 1;   // 允许发送中断
    task = &scheduler.get_current_task();
    delay();                        // 阻塞任务
}
void uart0_t::put_numeral(uint8_t data)
{
char str[2];
char *p;
str[0] = ((data/16%16>9)?(data/16%16+'A'-10)data/16%16+'0'));
str[1] = ((data%16>9)?(data%16+'A'-10)data%16+'0'));
p = &str[0];
puts(p);
}
// uart0 中断服务例程
bool uart0_t::isr(int vector)
{
using namespace sfr::uart;
if (UART0.ISR().THRE_INT)
{
  //UART0发送中断
     const char* str = buffer;
     if (str == 0) {                     // 无数据
         UART0.IER().THRE_IEN = 0;   // 禁止发送中断
         return true;
     }
     fillfifo(str);                      // 填充 fifo
     return false;
}
if (UART0.ISR().RDA_INT)
{
  //UART0接收中断
  /* Get all the input characters */
  while(UART0.ISR().RDA_IF)
  {
   /* Get the character from UART Buffer */
   char Received_Data = UART0.DATA;
   switch (Received_Data)
   {
    case 'R':
    case 'r':
     //Flag_SPI.do_set_bits(0b01);
     break;
    case 'U':
    case 'u':
     //Flag_SPI.do_set_bits(0b010);
     break;
    case 'D':
    case 'd':
    // Flag_SPI.do_set_bits(0b0100);
     break;
    case 'M':
    case 'm':
     //Flag_SPI.do_set_bits(0b01000);
     break;
    default:
        break;
   }
   return false;
  }
}
return false;
}
// uart0 中断滞后服务例程
// 所有数据发送完成后,dsr() 被调用
void uart0_t::dsr(int vector, uintptr_t count)
{
    task->do_wakeup();              // 唤醒任务
}
// uart0 填充 fifo
void uart0_t::fillfifo(const char* str)
{
using namespace sfr::uart;
    do {
        char ch;
        ch = *str++;
        if (ch == 0) {
            str = 0;
            break;
        }
        UART0.DATA = ch;
    } while (!UART0.FSR().TX_FULL);
    buffer = str;
}
uart0_t uart0;              // 创建 uart0 对象
工程框架:


运行截图:


工程包:

LOOK_SPI_PDMA_V111018.1.rar (2.73 MB)
编辑原因:工程包未上传成功 20111206 13:39

相关帖子

沙发
lixiaoxu2meng| | 2011-12-6 12:48 | 只看该作者
顶啊

使用特权

评论回复
板凳
Ryanhsiung| | 2011-12-6 12:49 | 只看该作者
这个要顶!

使用特权

评论回复
地板
Swallow_0322|  楼主 | 2011-12-6 13:39 | 只看该作者
多谢支持!
晕!网速太不给力,电脑也不给力,重启3次,此贴发了三条,辛苦大叔把其余两个删除了吧!

使用特权

评论回复
5
lixiaoxu2meng| | 2011-12-6 13:46 | 只看该作者
4# Swallow_0322
呵呵

使用特权

评论回复
6
plc_avr| | 2011-12-6 13:52 | 只看该作者
顶!

使用特权

评论回复
7
mcs8098| | 2011-12-20 13:41 | 只看该作者
:lol

使用特权

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

本版积分规则

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

121

主题

1393

帖子

4

粉丝