今天有空可以休息,继续开始玩转XMC4700,在上一节介绍了如何使用官方的IDE,本节开始使用官方的IDE来创建学习XMC4700。本次我们使用第一个工程选项创建工程,如下:
如上就是我们基于XMC4700创建Easy Start Project,根据以前开发的经验,我们先从系统时钟开始分析XMC4700工程。
对于M内核的MCU来说,都是先从汇编启动文件,然后跑到系统配置函数,系统时钟默认配置文件为system_XMC4700.c,如下所示
打开文件,根据硬件我们可以知道系统外部时钟源为12M晶振,可以从代码中看到
- /*
- // <o> External crystal frequency [Hz]
- // <8000000=> 8MHz
- // <12000000=> 12MHz
- // <16000000=> 16MHz
- // <i> Defines external crystal frequency
- // <i> Default: 8MHz
- */
- #define OSCHP_FREQUENCY (12000000U)
-
- /* USB PLL settings, fUSBPLL = 48MHz and fUSBPLLVCO = 384 MHz */
- /* Note: Implicit divider of 2 and fUSBPLLVCO >= 260 MHz and fUSBPLLVCO <= 520 MHz*/
- #if OSCHP_FREQUENCY == 8000000U
- #define USB_PDIV (1U)
- #define USB_NDIV (95U)
-
- #elif OSCHP_FREQUENCY == 12000000U
- #define USB_PDIV (1U)
- #define USB_NDIV (63U)
-
- #elif OSCHP_FREQUENCY == 16000000U
- #define USB_PDIV (1U)
- #define USB_NDIV (47U)
-
- #else
- #error "External crystal frequency not supported"
-
- #endif
可以看到系统时钟为12M,符合硬件,代码中也给我出8M和16M对应的配置定义。
系统的时钟配置函数如下:
从上述代码可以看出系统的时钟配置,具体配置的信息如下:
/*
//
Clock tree
// System clock source selection
// <0=> fOFI
// <1=> fPLL
// Default: fPLL
// System clock divider <1-256><#-1>
// Default: 2
// CPU clock divider
// <0=> fCPU = fSYS
// <1=> fCPU = fSYS / 2
// Default: fCPU = fSYS
// Peripheral clock divider
// <0=> fPB = fCPU
// <1=> fPB = fCPU / 2
// Default: fPB = fCPU
// CCU clock divider
// <0=> fCCU = fCPU
// <1=> fCCU = fCPU / 2
// Default: fCCU = fCPU
// Enable WDT clock
// WDT clock source <0=> fOFI
// <1=> fSTDBY
// <2=> fPLL
// Default: fOFI
// WDT clock divider <1-256><#-1>
// Default: 1
//
// Enable EBU clock
// EBU clock divider <1-64><#-1>
// Default: 4
//
// Enable ETH clock
//
// Enable MMC clock
//
// Enable USB clock
// USB clock source <0=> fUSBPLL
// <1=> fPLL
// Default: fPLL
//
// Enable external clock
// External Clock Source Selection
// <0=> fSYS
// <2=> fUSB
// <3=> fPLL
// Default: fPLL
// External Clock divider <1-512><#-1>
// Default: 288
// Only valid for USB PLL and PLL clocks
// External Clock Pin Selection
// <0=> Disabled
// <1=> P0.8
// <2=> P1.15
// Default: Disabled
//
//
接下来分析main函数程序
- int main(void)
- {
- /* Setup the system timer to tick every 100us */
- SysTick_Config(SystemCoreClock / TICKS_PER_SECOND);
-
- /* Configure P3.9 (LED) */
- // P3.9 is used as GPIO for LED indication. Macros can be find in GPIO.h
- P5_9_set_mode(OUTPUT_PP_GP);
- P5_9_set_driver_strength(STRONG);
- P5_9_reset();
-
- /* Initialize and start ADC */
- ADC0_Init();
-
- /* Infinite loop */
- for(;;){
- do{
- adc_result = VADC_G0->RES[1];
- } while (!(adc_result >> VADC_G_RES_VF_Pos));
- // wait until ADC result register 0 value is valid
- // VADC.G0RES1.VF = 1: Valid Flag
- // Indicates a new result in bitfield RESULT or bit FCR.
- // 1B = Bitfield RESULT has been updated with new
- // result value and has not yet been read, or bit
- // FCR has been updated
-
- adc_result &= 0xFFF; // mask ADC result
- Delay100US((adc_result << 1) + 500);
- // tune minimum and maximum flashing time
-
- P5_9_toggle();
- // toggle P3.9 (toggle LED) using GPIO.h macros
- }
- return 0;
- }
先配置系统SysTick为100us中断一次,配置引脚5.9为输出引脚,引脚输出为强输出,先输出为低电平。然后初始化ADC0,并且启动ADC0转换。在while循环中,读取ADC转换的数据,用来产生延时的基数,翻转点灯。
对于DAVE的IDE发现有几个很好的功能,没有实际编译的代码为黑色背景,这样方便我们分析代码。
智能提醒,直接把鼠标停在代码上面,自动给出代码定义,比iar和mdk好很多,不需要再用第三方编辑器看代码。
此内容由EEWORLD论坛网友qwerghf原创,如需转载或用于商业用途需征得作者同意并注明出处
本帖最后由 qwerghf 于 2017-12-12 22:55 编辑