废话一番,余自五月得板,值喜庆学习之际,突逢火患,破财挡灾,幸人无恙,留安全大训,一时忙乱纷扰致岁末,枉费多多。
先发学习贴,并望各位达者解惑。
1. 寄存器解锁写入的“59h”, “16h” “88h”是何来历?
2. Delay指令是否跟51一样 为12个机器周期?程序所带附件包所示如下,是否为
void DrvSYS_Delay(uint32_t us)
{
SysTick->LOAD = us * CyclesPerUs;
SysTick->VAL = (0x00);
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk;
/* Waiting for down-count to zero */
while((SysTick->CTRL & (1 << 16)) == 0);
}
而
uint32_t SystemCoreClock = __HSI; /*!< System Clock Frequency (Core Clock) */
uint32_t CyclesPerUs = (__HSI / 1000000); /* Cycles per micro second */
#include <stdio.h>
#include"NUC1xx.h"
#include"DrvGPIO.h"
#include"DrvSYS.h"
int main(void)
{
// 有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,这些寄存器在上电复位到用
// 户解锁之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到寄存器REGWRPROT (地址:
// 0x5000_0100)解锁定。在这三个数据之间写入任何其他数据,不同时序或写入其他地址都会中止
// 整个时序,导致无法解锁.
// 解锁后,用户可以检测解锁指示位:0x5000_0100 的bit0,“1“表示已经解锁定,”0“表示锁定。
// 用户可以更新目标寄存器的值,向“0x5000_0100”写入任何值,就可以重锁保护寄存器.
// 该位寄存器用于禁止/使能保护寄存器,读取得到REGPROTDIS状态
int32_t DrvSYS_UnlockProtectedReg(void);
// PWRCON地址为CLK_BA(0x5000_0200)+0x00,复位后值为0x0000_001X,在bit0该位的缺省值由flash控制
// 器设置,用户配置寄存器config0 [26:24]. 当缺省时钟源为4~24 MHz晶振. 该位自动置1
// 1 = 使能外部4~24 MHz 高速晶振, 0 = 禁止外部4~24 MHz 高速晶振
// 在flash Config0 (Address = 0x0030_0000)中,复位后CPU时钟源选择
// FOSC[2:0] 时钟源
// 000 外部4~24 MHz 高速晶振时钟
// Others 保留
// 复位后,CFOSC的值将被加载到系统寄存器CLKSEL0.HCLK_S[2:0].
DrvSYS_SetOscCtrl (E_SYS_XTL12M, 1);
LOCKREG(); //锁寄存器
while(1)
{
DrvGPIO_ClrBit(E_GPA, 2); // LED1 亮
DrvSYS_Delay(12000000);
DrvGPIO_SetBit(E_GPA, 2);
DrvGPIO_ClrBit(E_GPA, 3); // LED2 亮
DrvSYS_Delay(12000000);
DrvGPIO_SetBit(E_GPA, 3);
DrvGPIO_ClrBit(E_GPA, 4); // LED3 亮
DrvSYS_Delay(12000000);
DrvGPIO_SetBit(E_GPA, 4);
DrvGPIO_ClrBit(E_GPA, 5); // LED4 亮
DrvSYS_Delay(12000000);
DrvGPIO_SetBit(E_GPA, 5);
}
}
|