TA的每日心情 | 开心 2021-12-10 15:56 |
---|
签到天数: 2675 天 连续签到: 1 天 [LV.Master]伴坛终老
|
这个方案是使用新唐的 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 来指示计时器是否要计时,我们在主回路里面处理按键的判断与相应的动作。- flg1 = flg2 = FALSE;
- while(1)
- {
- if(!P32) // START/STOP KEY
- {
- if(!flg1)
- {
- fg_action = !fg_action;
- flg1 = TRUE;
- }
-
- CLK_SysTickDelay(20000);
- while(!P32) // wait KEY un_press
- {
- CLK_SysTickDelay(20000);
- }
- }
- else
- {
- flg1 = FALSE;
- }
- if(!P33) // RESET KEY
- {
- if(!fg_action && !flg2)
- {
- u32Counter = 0;
- Ds_Data(u32Counter);
- }
- }
- else
- {
- flg2 =FALSE;
- }
-
- }
复制代码 视频演示:
http://v.youku.com/v_show/id_XOTI3OTIyOTY0.html
NuTiny-SDK-M051 开发板使用手册
NuTiny-SDK-M051 User Manual EN V1.0.pdf
(1 MB, 下载次数: 11)
|
|