本帖最后由 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 |