本帖最后由 slotg 于 2015-4-6 09:38 编辑
这个方案是使用新唐的 NuTiny-SDK-M051 开发板外接 MAX7219 显示模块做一个计时器,每10ms计数一次,并安排2个按键用来 开始/停止计时 与 归零计时 ,编写这个程序的目的是想熟悉 M051 的串行外设接口(SPI)与定时器 TIMER 中断的使用。
M051 与 MAX7219 显示模块的连接:
P1.4 (SPISS0) -> CS
P1.5 (MOSI_0) -> DIN
P1.7 (SPICLK0) -> CLK
MAX7219 规格书上写着最高时钟频率为10MHz,因此我们在程序中对于 SPI 的时钟频率也就设定为 10MHz。
void SPI_Init(void)
{
/* Configure as a master, clock idle low, 16-bit transaction, drive output on falling clock edge and latch input on rising edge. */
/* Set IP clock divider. SPI clock rate = 10MHz */
SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 16, 10000000);
/* Enable the automatic hardware slave select function. Select the SS pin and configure as low-active. */
SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);
}
虽然我们设定了时钟频率是10MHz,不过 SPI_Open 函数会返回一个实际上运行的频率数据,为了查看这个返回值我们在程式调试时安排了一个全局变量 u32Test 来存放这个数据,并且在主回路中显示出来。在程序运行之后显示器上显示了 6000000,这表示实际运行的频率是 6MHz,由于手上没有量测工具因此也无法确定这个频率是否正确!
u32Test = SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 16, 10000000);
Ds_Data(u32Test);
程序中使用了定时器 TIMER0 并设定每 10ms 中断一次,计时器的计数动作就放在 TIMER0 中断回路里面处理
// TIMER0 interrupt
void TMR0_IRQHandler(void)
{
/* Clear Timer0 time-out interrupt flag */
TIMER_ClearIntFlag(TIMER0);
if(fg_action)
{
Ds_Data(++u32Counter);
}
}
规画2个按键,功能分别是:
开始/停止键 按一下开始计时再按一下停止计时,安排在 P3.2 管脚。
清零键 计时值清零,安排在 P3.3 管脚。
设定一个全局变量 fg_action 来指示计时器是否要计时,我们在主回路里面处理按键的判断与相应的动作。
ffg1 = ffg2 = FALSE;
while(1)
{
if(!P32) // START/STOP KEY
{
if(!ffg1)
{
fg_action = !fg_action;
ffg1 = TRUE;
}
CLK_SysTickDelay(20000);
while(!P32) // wait KEY un_press
{
CLK_SysTickDelay(20000);
}
}
else
{
ffg1 = FALSE;
}
if(!P33) // RESET KEY
{
if(!fg_action && !ffg2)
{
u32Counter = 0;
Ds_Data(u32Counter);
}
}
else
{
ffg2 =FALSE;
}
}
視頻演示:
http://v.youku.com/v_show/id_XOTI3OTIyOTY0.html
NuTiny-SDK-M051 開發板使用手冊
NuTiny-SDK-M051 User Manual EN V1.0.pdf
(1 MB)
工程文件,使用 KEIL 4.72 與 M051_Series_BSP_CMSIS_Rev3.00.002 庫
D004.rar
(1.26 MB)
|