单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6205|回复: 2
打印 上一主题 下一主题
收起左侧

Cortex-M3学习LPC1768 - 按键实验

[复制链接]
跳转到指定楼层
楼主
xiongxiao 发表于 2015-5-27 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有输出总会有输入,今天测试一下按键的功能,第一节已经说过了与GPIO端口相关的寄存器,这里不在重复,想要从端口读取数据,首先把FIODIR这个寄存器设置为输入,再从 FIOPIN寄存器读取数据就可以了,这个寄存器具有读写功能。下面说一下这个实验的电路图,如下所示:


图1-1 Joystick按键连线图

            
这次实验没有涉及到外部中断,都是做普通的IO输入使用的,所以在这里外部中断就做学习总结了。下面给出这次实验的主程序:
/*********************************************************************************
文件名称:mian.c
功    能: 主要调度函数及应用函数                                                                                          
编译环境: MDKV4.12                                                   
时    钟: 外部12Mhz                                                                                                                                             
日    期: 11/08/16                                                         
作    者: 懒猫爱飞
备    注:NULL
---------------------------------------------------------------------------------
修改内容:NULL
修改日期:XXXX年xx月xx日      xx时xx分
修改人员:xxx xxx xxx                                                                                                                                      
**********************************************************************************/
#include"main.h"
volatile unsigned long SysTickCnt;      /* 用于系统时钟计数 */
/********************************************************************************
* 函数名称 :void SysTick_Handler (void)
* 函数功能 : 系统节拍定时器中断函数,每1ms计数一次
* 入口参数 : 无
* 出口参数 : 无
* 备    注 :无
*******************************************************************************/
void SysTick_Handler (void)
{         
  SysTickCnt++;
}
/********************************************************************************
* 函数名称 :void Delay (unsigned long tick)
* 函数功能 : 毫秒级延时函数
* 入口参数 : unsigned long tick -- 延时时长
* 出口参数 : 无
* 备    注 :无
*******************************************************************************/
void DelayMs (unsigned long tick)
{     
  unsigned long systickcnt;
  systickcnt = SysTickCnt;
  while ((SysTickCnt - systickcnt) < tick);
}
/********************************************************************************
* 函数名称 :void PortInit(void)
* 函数功能 : 端口初始化
* 入口参数 : 无
* 出口参数 : 无
* 备    注 :无
*******************************************************************************/
void PortInit(void)
{
   GPIO1->FIODIR = 0xB0000000;           /* LEDs on PORT1 defined as Output    */
   GPIO2->FIODIR = 0x0000007C;           /* LEDs on PORT2 defined as Output    */
   LedAllOff();                                                                                                /* 初始化时熄灭所有的灯 */
}
/********************************************************************************
* 函数名称 :int main(void)
* 函数功能 : 主函数
* 入口参数 : 无
* 出口参数 : 无
* 备    注 :无
*******************************************************************************/
int main(void)
{
    unsigned char LedFlag = 1;  // 记录LED状态
               SystemInit();     /* 系统初始化,函数在system_LPC17xx.c文件夹中定义 */
               SysTick_Config(SystemFrequency/1000 - 1);   /* 配置时钟中断,每1ms中断一次 */
                                                           /* 在core_cm3.h中定义*/
    PortInit();       /* 端口初始化 */
               while(1)
               {
                             if(!LedFlag)
                             {
                                           Led1On();  // 点亮LED     
                             }
                             else
                             {
                                           Led1Off(); // 熄灭LED         
                             }
                           
                   if(!KEY_VAL)
                             {
                                           DelayMs(10);
                                 while(!KEY_VAL);
                                           LedFlag ^=1;  // Led状态改变一次         
                             }
                           
                             if(!KEY_EN)       // 此处是为了测试摇杆按键的功能是否正常
                             {
                                           DelayMs(10);
                                           while(!KEY_EN);
                                 Led8Neg();  // 点亮LED // Led状态改变一次     
                             }
               }
}

上一节对程序没有做过多的解释,这里详细分析一下,工程中包含的源文件如下图所示:

工程中startup_LPC17XX.s是M3的启动文件,启动文件由汇编语言写的,它的作用一般是下面这几个:
1)堆和栈的初始化
2)向量表定义
3)地址重映射及中断向量表的转移
4)设置系统时钟频率
5)中断寄存器的初始化
6)进入C应用程序
工程中main.c是我写的应用程序,也就是这次实验的程序,core_cm3.c与core_cm3.h主要是M3外围驱动源代码与头文件,使用时一般不需要修改,直接调用就可以。system_LPC17xx.c与system_LPC17xx.h是关于系统的文件,里面主要提供了系统初始化函数SystemInit(),文件中默认情况下定义的晶振的大小为12M,使用的是外部晶振,还使用了PLL0倍频,关于倍频的问题,以后慢慢再总结。芯片LPC1768的初始化主要包括时钟配置,电源管理,功耗管理等。相比较而言,时钟配置相对复杂,因为它包括两个PLL倍频电路,一个是主PLL0主要是为系统和USB提供时钟,另一个是PLL1专门 为USB提供48M时钟,但也可以不使用它们。由于时钟配置比较灵活,所以相以设置这些参数也比较复杂,但是这些在系统文件中已有明确的定义,所以想要变动时只需修改系统文件中相应的宏或函数即可。
下面简要总结一下main()函数,首先是系统初始化函数SystemInit(),上面说过它在system_LPC17xx.c这个源文件中,这个函数主要完成了对时钟的配置,系统功耗PCONP,时钟输出,flash加速等系统资源配置。如果要进行修改可以参考源文件的修改方法,虽然是英文注释,但都非常简单,有兴趣的可以打开看看,不过一般情况下我们拿来直接用就好了不用修改的。
函数          SysTick_Config(SystemFrequency/1000 - 1) 是用来配置系统时钟节拍的,它的原型在core_m3.c这个源文件中。实验程序中用的延时函数都是硬件延时,其实就是系统节拍定时器所产生的。使用硬件延时的原因是1、不占用软件系统资源,2、比较精确。系统定时器配置很简单,使用也很方便,专为系统软件或系统管理软件提供间隔中断。系统节拍定时器的时钟源可以是内核时钟也,可以是外部时钟,外部时钟P3.26脚引入,当然想从这个引脚输入时钟,需要将这个引脚先配置成STCLK功能。系统节拍定时器是一个24位定时器,当计数值达到0时产生中断。系统节拍定时器的功能就是为下一次中断提供前提供一个固定时间间隔。由于节拍定时器是24位的,所以使用时不能与其它定时器混为一谈,一定要注意定时时长的限制,不能超过界限。
最后再说一下数据类型的问题,在8位机中数据位找一般就是8位的所以,定义变量时一般选用单字节处理速度会快些,但到了32位机中,数据位宽一般是32位的,所以定义变量时一般用4字节会好些。在core_cm3.c中有关于数据类型的定义,有兴趣的可以打开看看。

完整程序源代码工程文件下载地址: 7009541134820.rar (141.72 KB, 下载次数: 42)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

沙发
 楼主| xiongxiao 发表于 2015-5-27 19:12 | 只看该作者
  1. /******************************************************************************
  2. * @file:    system_LPC17xx.c
  3. * @purpose: CMSIS Cortex-M3 Device Peripheral Access Layer Source File
  4. *           for the NXP LPC17xx Device Series
  5. * @version: V1.1
  6. * @date:    18th May 2009
  7. *----------------------------------------------------------------------------
  8. *
  9. * Copyright (C) 2008 ARM Limited. All rights reserved.
  10. *
  11. * ARM Limited (ARM) is supplying this software for use with Cortex-M3
  12. * processor based microcontrollers.  This file can be freely distributed
  13. * within development tools that are supporting such ARM based processors.
  14. *
  15. * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
  16. * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
  18. * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
  19. * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
  20. *
  21. ******************************************************************************/


  22. #include <stdint.h>
  23. #include <lpc17xx.h>

  24. /*
  25. //-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
  26. */

  27. /*--------------------- Clock Configuration ----------------------------------
  28. //
  29. // <e> Clock Configuration
  30. //   <h> System Controls and Status Register (SCS)
  31. //     <o1.4>    OSCRANGE: Main Oscillator Range Select
  32. //                     <0=>  1 MHz to 20 MHz
  33. //                     <1=> 15 MHz to 24 MHz
  34. //     <e1.5>       OSCEN: Main Oscillator Enable
  35. //     </e>
  36. //   </h>
  37. //
  38. //   <h> Clock Source Select Register (CLKSRCSEL)
  39. //     <o2.0..1>   CLKSRC: PLL Clock Source Selection
  40. //                     <0=> Internal RC oscillator
  41. //                     <1=> Main oscillator
  42. //                     <2=> RTC oscillator
  43. //   </h>
  44. //
  45. //   <e3> PLL0 Configuration (Main PLL)
  46. //     <h> PLL0 Configuration Register (PLL0CFG)
  47. //                     <i> F_cco0 = (2 * M * F_in) / N
  48. //                     <i> F_in must be in the range of 32 kHz to 50 MHz
  49. //                     <i> F_cco0 must be in the range of 275 MHz to 550 MHz
  50. //       <o4.0..14>  MSEL: PLL Multiplier Selection
  51. //                     <6-32768><#-1>
  52. //                     <i> M Value
  53. //       <o4.16..23> NSEL: PLL Divider Selection
  54. //                     <1-256><#-1>
  55. //                     <i> N Value
  56. //     </h>
  57. //   </e>
  58. //
  59. //   <e5> PLL1 Configuration (USB PLL)
  60. //     <h> PLL1 Configuration Register (PLL1CFG)
  61. //                     <i> F_usb = M * F_osc or F_usb = F_cco1 / (2 * P)
  62. //                     <i> F_cco1 = F_osc * M * 2 * P
  63. //                     <i> F_cco1 must be in the range of 156 MHz to 320 MHz
  64. //       <o6.0..4>   MSEL: PLL Multiplier Selection
  65. //                     <1-32><#-1>
  66. //                     <i> M Value (for USB maximum value is 4)
  67. //       <o6.5..6>   PSEL: PLL Divider Selection
  68. //                     <0=> 1
  69. //                     <1=> 2
  70. //                     <2=> 4
  71. //                     <3=> 8
  72. //                     <i> P Value
  73. //     </h>
  74. //   </e>
  75. //
  76. //   <h> CPU Clock Configuration Register (CCLKCFG)
  77. //     <o7.0..7>  CCLKSEL: Divide Value for CPU Clock from PLL0
  78. //                     <2-256:2><#-1>
  79. //   </h>
  80. //
  81. //   <h> USB Clock Configuration Register (USBCLKCFG)
  82. //     <o8.0..3>   USBSEL: Divide Value for USB Clock from PLL1
  83. //                     <0-15>
  84. //                     <i> Divide is USBSEL + 1
  85. //   </h>
  86. //
  87. //   <h> Peripheral Clock Selection Register 0 (PCLKSEL0)
  88. //     <o9.0..1>    PCLK_WDT: Peripheral Clock Selection for WDT
  89. //                     <0=> Pclk = Cclk / 4
  90. //                     <1=> Pclk = Cclk
  91. //                     <2=> Pclk = Cclk / 2
  92. //                     <3=> Pclk = Hclk / 8
  93. //     <o9.2..3>    PCLK_TIMER0: Peripheral Clock Selection for TIMER0
  94. //                     <0=> Pclk = Cclk / 4
  95. //                     <1=> Pclk = Cclk
  96. //                     <2=> Pclk = Cclk / 2
  97. //                     <3=> Pclk = Hclk / 8
  98. //     <o9.4..5>    PCLK_TIMER1: Peripheral Clock Selection for TIMER1
  99. //                     <0=> Pclk = Cclk / 4
  100. //                     <1=> Pclk = Cclk
  101. //                     <2=> Pclk = Cclk / 2
  102. //                     <3=> Pclk = Hclk / 8
  103. //     <o9.6..7>    PCLK_UART0: Peripheral Clock Selection for UART0
  104. //                     <0=> Pclk = Cclk / 4
  105. //                     <1=> Pclk = Cclk
  106. //                     <2=> Pclk = Cclk / 2
  107. //                     <3=> Pclk = Hclk / 8
  108. //     <o9.8..9>    PCLK_UART1: Peripheral Clock Selection for UART1
  109. //                     <0=> Pclk = Cclk / 4
  110. //                     <1=> Pclk = Cclk
  111. //                     <2=> Pclk = Cclk / 2
  112. //                     <3=> Pclk = Hclk / 8
  113. //     <o9.12..13>  PCLK_PWM1: Peripheral Clock Selection for PWM1
  114. //                     <0=> Pclk = Cclk / 4
  115. //                     <1=> Pclk = Cclk
  116. //                     <2=> Pclk = Cclk / 2
  117. //                     <3=> Pclk = Hclk / 8
  118. //     <o9.14..15>  PCLK_I2C0: Peripheral Clock Selection for I2C0
  119. //                     <0=> Pclk = Cclk / 4
  120. //                     <1=> Pclk = Cclk
  121. //                     <2=> Pclk = Cclk / 2
  122. //                     <3=> Pclk = Hclk / 8
  123. //     <o9.16..17>  PCLK_SPI: Peripheral Clock Selection for SPI
  124. //                     <0=> Pclk = Cclk / 4
  125. //                     <1=> Pclk = Cclk
  126. //                     <2=> Pclk = Cclk / 2
  127. //                     <3=> Pclk = Hclk / 8
  128. //     <o9.20..21>  PCLK_SSP1: Peripheral Clock Selection for SSP1
  129. //                     <0=> Pclk = Cclk / 4
  130. //                     <1=> Pclk = Cclk
  131. //                     <2=> Pclk = Cclk / 2
  132. //                     <3=> Pclk = Hclk / 8
  133. //     <o9.22..23>  PCLK_DAC: Peripheral Clock Selection for DAC
  134. //                     <0=> Pclk = Cclk / 4
  135. //                     <1=> Pclk = Cclk
  136. //                     <2=> Pclk = Cclk / 2
  137. //                     <3=> Pclk = Hclk / 8
  138. //     <o9.24..25>  PCLK_ADC: Peripheral Clock Selection for ADC
  139. //                     <0=> Pclk = Cclk / 4
  140. //                     <1=> Pclk = Cclk
  141. //                     <2=> Pclk = Cclk / 2
  142. //                     <3=> Pclk = Hclk / 8
  143. //     <o9.26..27>  PCLK_CAN1: Peripheral Clock Selection for CAN1
  144. //                     <0=> Pclk = Cclk / 4
  145. //                     <1=> Pclk = Cclk
  146. //                     <2=> Pclk = Cclk / 2
  147. //                     <3=> Pclk = Hclk / 6
  148. //     <o9.28..29>  PCLK_CAN2: Peripheral Clock Selection for CAN2
  149. //                     <0=> Pclk = Cclk / 4
  150. //                     <1=> Pclk = Cclk
  151. //                     <2=> Pclk = Cclk / 2
  152. //                     <3=> Pclk = Hclk / 6
  153. //     <o9.30..31>  PCLK_ACF: Peripheral Clock Selection for ACF
  154. //                     <0=> Pclk = Cclk / 4
  155. //                     <1=> Pclk = Cclk
  156. //                     <2=> Pclk = Cclk / 2
  157. //                     <3=> Pclk = Hclk / 6
  158. //   </h>
  159. //
  160. //   <h> Peripheral Clock Selection Register 1 (PCLKSEL1)
  161. //     <o10.0..1>   PCLK_QEI: Peripheral Clock Selection for the Quadrature Encoder Interface
  162. //                     <0=> Pclk = Cclk / 4
  163. //                     <1=> Pclk = Cclk
  164. //                     <2=> Pclk = Cclk / 2
  165. //                     <3=> Pclk = Hclk / 8
  166. //     <o10.2..3>   PCLK_GPIO: Peripheral Clock Selection for GPIOs
  167. //                     <0=> Pclk = Cclk / 4
  168. //                     <1=> Pclk = Cclk
  169. //                     <2=> Pclk = Cclk / 2
  170. //                     <3=> Pclk = Hclk / 8
  171. //     <o10.4..5>   PCLK_PCB: Peripheral Clock Selection for the Pin Connect Block
  172. //                     <0=> Pclk = Cclk / 4
  173. //                     <1=> Pclk = Cclk
  174. //                     <2=> Pclk = Cclk / 2
  175. //                     <3=> Pclk = Hclk / 8
  176. //     <o10.6..7>   PCLK_I2C1: Peripheral Clock Selection for I2C1
  177. //                     <0=> Pclk = Cclk / 4
  178. //                     <1=> Pclk = Cclk
  179. //                     <2=> Pclk = Cclk / 2
  180. //                     <3=> Pclk = Hclk / 8
  181. //     <o10.10..11> PCLK_SSP0: Peripheral Clock Selection for SSP0
  182. //                     <0=> Pclk = Cclk / 4
  183. //                     <1=> Pclk = Cclk
  184. //                     <2=> Pclk = Cclk / 2
  185. //                     <3=> Pclk = Hclk / 8
  186. //     <o10.12..13> PCLK_TIMER2: Peripheral Clock Selection for TIMER2
  187. //                     <0=> Pclk = Cclk / 4
  188. //                     <1=> Pclk = Cclk
  189. //                     <2=> Pclk = Cclk / 2
  190. //                     <3=> Pclk = Hclk / 8
  191. //     <o10.14..15> PCLK_TIMER3: Peripheral Clock Selection for TIMER3
  192. //                     <0=> Pclk = Cclk / 4
  193. //                     <1=> Pclk = Cclk
  194. //                     <2=> Pclk = Cclk / 2
  195. //                     <3=> Pclk = Hclk / 8
  196. //     <o10.16..17> PCLK_UART2: Peripheral Clock Selection for UART2
  197. //                     <0=> Pclk = Cclk / 4
  198. //                     <1=> Pclk = Cclk
  199. //                     <2=> Pclk = Cclk / 2
  200. //                     <3=> Pclk = Hclk / 8
  201. //     <o10.18..19> PCLK_UART3: Peripheral Clock Selection for UART3
  202. //                     <0=> Pclk = Cclk / 4
  203. //                     <1=> Pclk = Cclk
  204. //                     <2=> Pclk = Cclk / 2
  205. //                     <3=> Pclk = Hclk / 8
  206. //     <o10.20..21> PCLK_I2C2: Peripheral Clock Selection for I2C2
  207. //                     <0=> Pclk = Cclk / 4
  208. //                     <1=> Pclk = Cclk
  209. //                     <2=> Pclk = Cclk / 2
  210. //                     <3=> Pclk = Hclk / 8
  211. //     <o10.22..23> PCLK_I2S: Peripheral Clock Selection for I2S
  212. //                     <0=> Pclk = Cclk / 4
  213. //                     <1=> Pclk = Cclk
  214. //                     <2=> Pclk = Cclk / 2
  215. //                     <3=> Pclk = Hclk / 8
  216. //     <o10.26..27> PCLK_RIT: Peripheral Clock Selection for the Repetitive Interrupt Timer
  217. //                     <0=> Pclk = Cclk / 4
  218. //                     <1=> Pclk = Cclk
  219. //                     <2=> Pclk = Cclk / 2
  220. //                     <3=> Pclk = Hclk / 8
  221. //     <o10.28..29> PCLK_SYSCON: Peripheral Clock Selection for the System Control Block
  222. //                     <0=> Pclk = Cclk / 4
  223. //                     <1=> Pclk = Cclk
  224. //                     <2=> Pclk = Cclk / 2
  225. //                     <3=> Pclk = Hclk / 8
  226. //     <o10.30..31> PCLK_MC: Peripheral Clock Selection for the Motor Control PWM
  227. //                     <0=> Pclk = Cclk / 4
  228. //                     <1=> Pclk = Cclk
  229. //                     <2=> Pclk = Cclk / 2
  230. //                     <3=> Pclk = Hclk / 8
  231. //   </h>
  232. //
  233. //   <h> Power Control for Peripherals Register (PCONP)
  234. //     <o11.1>      PCTIM0: Timer/Counter 0 power/clock enable
  235. //     <o11.2>      PCTIM1: Timer/Counter 1 power/clock enable
  236. //     <o11.3>      PCUART0: UART 0 power/clock enable
  237. //     <o11.4>      PCUART1: UART 1 power/clock enable
  238. //     <o11.6>      PCPWM1: PWM 1 power/clock enable
  239. //     <o11.7>      PCI2C0: I2C interface 0 power/clock enable
  240. //     <o11.8>      PCSPI: SPI interface power/clock enable
  241. //     <o11.9>      PCRTC: RTC power/clock enable
  242. //     <o11.10>     PCSSP1: SSP interface 1 power/clock enable
  243. //     <o11.12>     PCAD: A/D converter power/clock enable
  244. //     <o11.13>     PCCAN1: CAN controller 1 power/clock enable
  245. //     <o11.14>     PCCAN2: CAN controller 2 power/clock enable
  246. //     <o11.15>     PCGPIO: GPIOs power/clock enable
  247. //     <o11.16>     PCRIT: Repetitive interrupt timer power/clock enable
  248. //     <o11.17>     PCMC: Motor control PWM power/clock enable
  249. //     <o11.18>     PCQEI: Quadrature encoder interface power/clock enable
  250. //     <o11.19>     PCI2C1: I2C interface 1 power/clock enable
  251. //     <o11.21>     PCSSP0: SSP interface 0 power/clock enable
  252. //     <o11.22>     PCTIM2: Timer 2 power/clock enable
  253. //     <o11.23>     PCTIM3: Timer 3 power/clock enable
  254. //     <o11.24>     PCUART2: UART 2 power/clock enable
  255. //     <o11.25>     PCUART3: UART 3 power/clock enable
  256. //     <o11.26>     PCI2C2: I2C interface 2 power/clock enable
  257. //     <o11.27>     PCI2S: I2S interface power/clock enable
  258. //     <o11.29>     PCGPDMA: GP DMA function power/clock enable
  259. //     <o11.30>     PCENET: Ethernet block power/clock enable
  260. //     <o11.31>     PCUSB: USB interface power/clock enable
  261. //   </h>
  262. //
  263. //   <h> Clock Output Configuration Register (CLKOUTCFG)
  264. //     <o12.0..3>   CLKOUTSEL: Selects clock source for CLKOUT
  265. //                     <0=> CPU clock
  266. //                     <1=> Main oscillator
  267. //                     <2=> Internal RC oscillator
  268. //                     <3=> USB clock
  269. //                     <4=> RTC oscillator
  270. //     <o12.4..7>   CLKOUTDIV: Selects clock divider for CLKOUT
  271. //                     <1-16><#-1>
  272. //     <o12.8>      CLKOUT_EN: CLKOUT enable control
  273. //   </h>
  274. //
  275. // </e>
  276. */
  277. #define CLOCK_SETUP           1
  278. #define SCS_Val               0x00000020
  279. #define CLKSRCSEL_Val         0x00000001
  280. #define PLL0_SETUP            1
  281. #define PLL0CFG_Val           0x0000000B
  282. #define PLL1_SETUP            1
  283. #define PLL1CFG_Val           0x00000003
  284. #define CCLKCFG_Val           0x00000003
  285. #define USBCLKCFG_Val         0x00000000
  286. #define PCLKSEL0_Val          0x00000000
  287. #define PCLKSEL1_Val          0x00000000
  288. #define PCONP_Val             0x042887DE
  289. #define CLKOUTCFG_Val         0x00000000


  290. /*--------------------- Flash Accelerator Configuration ----------------------
  291. //
  292. // <e> Flash Accelerator Configuration
  293. //   <o1.0..1>   FETCHCFG: Fetch Configuration
  294. //               <0=> Instruction fetches from flash are not buffered
  295. //               <1=> One buffer is used for all instruction fetch buffering
  296. //               <2=> All buffers may be used for instruction fetch buffering
  297. //               <3=> Reserved (do not use this setting)
  298. //   <o1.2..3>   DATACFG: Data Configuration
  299. //               <0=> Data accesses from flash are not buffered
  300. //               <1=> One buffer is used for all data access buffering
  301. //               <2=> All buffers may be used for data access buffering
  302. //               <3=> Reserved (do not use this setting)
  303. //   <o1.4>      ACCEL: Acceleration Enable
  304. //   <o1.5>      PREFEN: Prefetch Enable
  305. //   <o1.6>      PREFOVR: Prefetch Override
  306. //   <o1.12..15> FLASHTIM: Flash Access Time
  307. //               <0=> 1 CPU clock (for CPU clock up to 20 MHz)
  308. //               <1=> 2 CPU clocks (for CPU clock up to 40 MHz)
  309. //               <2=> 3 CPU clocks (for CPU clock up to 60 MHz)
  310. //               <3=> 4 CPU clocks (for CPU clock up to 80 MHz)
  311. //               <4=> 5 CPU clocks (for CPU clock up to 100 MHz)
  312. //               <5=> 6 CPU clocks (for any CPU clock)
  313. // </e>
  314. */
  315. #define FLASH_SETUP           1
  316. #define FLASHCFG_Val          0x0000303A

  317. /*
  318. //-------- <<< end of configuration section >>> ------------------------------
  319. */

  320. /*----------------------------------------------------------------------------
  321.   Check the register settings
  322. *----------------------------------------------------------------------------*/
  323. #define CHECK_RANGE(val, min, max)                ((val < min) || (val > max))
  324. #define CHECK_RSVD(val, mask)                     (val & mask)

  325. /* Clock Configuration -------------------------------------------------------*/
  326. #if (CHECK_RSVD((SCS_Val),       ~0x00000030))
  327.    #error "SCS: Invalid values of reserved bits!"
  328. #endif

  329. #if (CHECK_RANGE((CLKSRCSEL_Val), 0, 2))
  330.    #error "CLKSRCSEL: Value out of range!"
  331. #endif

  332. #if (CHECK_RSVD((PLL0CFG_Val),   ~0x00FF7FFF))
  333.    #error "PLL0CFG: Invalid values of reserved bits!"
  334. #endif

  335. #if (CHECK_RSVD((PLL1CFG_Val),   ~0x0000007F))
  336.    #error "PLL1CFG: Invalid values of reserved bits!"
  337. #endif

  338. #if ((CCLKCFG_Val != 0) && (((CCLKCFG_Val - 1) % 2)))
  339.    #error "CCLKCFG: CCLKSEL field does not contain only odd values or 0!"
  340. #endif

  341. #if (CHECK_RSVD((USBCLKCFG_Val), ~0x0000000F))
  342.    #error "USBCLKCFG: Invalid values of reserved bits!"
  343. #endif

  344. #if (CHECK_RSVD((PCLKSEL0_Val),   0x000C0C00))
  345.    #error "PCLKSEL0: Invalid values of reserved bits!"
  346. #endif

  347. #if (CHECK_RSVD((PCLKSEL1_Val),   0x03000300))
  348.    #error "PCLKSEL1: Invalid values of reserved bits!"
  349. #endif

  350. #if (CHECK_RSVD((PCONP_Val),      0x10100821))
  351.    #error "PCONP: Invalid values of reserved bits!"
  352. #endif

  353. #if (CHECK_RSVD((CLKOUTCFG_Val), ~0x000001FF))
  354.    #error "CLKOUTCFG: Invalid values of reserved bits!"
  355. #endif

  356. /* Flash Accelerator Configuration -------------------------------------------*/
  357. #if (CHECK_RSVD((FLASHCFG_Val), ~0x0000F07F))
  358.    #error "FLASHCFG: Invalid values of reserved bits!"
  359. #endif


  360. /*----------------------------------------------------------------------------
  361.   DEFINES
  362. *----------------------------------------------------------------------------*/
  363.    
  364. /*----------------------------------------------------------------------------
  365.   Define clocks
  366. *----------------------------------------------------------------------------*/
  367. #define XTAL        (12000000UL)        /* Oscillator frequency               */
  368. #define OSC_CLK     (      XTAL)        /* Main oscillator frequency          */
  369. #define RTC_CLK     (   32000UL)        /* RTC oscillator frequency           */
  370. #define IRC_OSC     ( 4000000UL)        /* Internal RC oscillator frequency   */


  371. /*----------------------------------------------------------------------------
  372.   Clock Variable definitions
  373. *----------------------------------------------------------------------------*/
  374. uint32_t SystemFrequency = IRC_OSC; /*!< System Clock Frequency (Core Clock)  */


  375. /**
  376. * Initialize the system
  377. *
  378. * @param  none
  379. * @return none
  380. *
  381. * @brief  Setup the microcontroller system.
  382. *         Initialize the System and update the SystemFrequency variable.
  383. */
  384. void SystemInit (void)
  385. {
  386. #if (CLOCK_SETUP)                       /* Clock Setup                        */
  387.   SC->SCS       = SCS_Val;
  388.   if (SCS_Val & (1 << 5)) {             /* If Main Oscillator is enabled      */
  389.     while ((SC->SCS & (1 << 6)) == 0);  /* Wait for Oscillator to be ready    */
  390.   }

  391.   SC->CCLKCFG   = CCLKCFG_Val;          /* Setup Clock Divider                */

  392. #if (PLL0_SETUP)
  393.   SC->CLKSRCSEL = CLKSRCSEL_Val;        /* Select Clock Source for PLL0       */
  394.   SC->PLL0CFG   = PLL0CFG_Val;
  395.   SC->PLL0CON   = 0x01;                 /* PLL0 Enable                        */
  396.   SC->PLL0FEED  = 0xAA;
  397.   SC->PLL0FEED  = 0x55;
  398.   while (!(SC->PLL0STAT & (1 << 26)));  /* Wait for PLOCK0                    */

  399.   SC->PLL0CON   = 0x03;                 /* PLL0 Enable & Connect              */
  400.   SC->PLL0FEED  = 0xAA;
  401.   SC->PLL0FEED  = 0x55;
  402. #endif

  403. #if (PLL1_SETUP)
  404.   SC->PLL1CFG   = PLL1CFG_Val;
  405.   SC->PLL1CON   = 0x01;                 /* PLL1 Enable                        */
  406.   SC->PLL1FEED  = 0xAA;
  407.   SC->PLL1FEED  = 0x55;
  408.   while (!(SC->PLL1STAT & (1 << 10)));  /* Wait for PLOCK1                    */

  409.   SC->PLL1CON   = 0x03;                 /* PLL1 Enable & Connect              */
  410.   SC->PLL1FEED  = 0xAA;
  411.   SC->PLL1FEED  = 0x55;
  412. #else
  413.   SC->USBCLKCFG = USBCLKCFG_Val;        /* Setup USB Clock Divider            */
  414. #endif

  415.   SC->PCLKSEL0  = PCLKSEL0_Val;         /* Peripheral Clock Selection         */
  416.   SC->PCLKSEL1  = PCLKSEL1_Val;

  417.   SC->PCONP     = PCONP_Val;            /* Power Control for Peripherals      */

  418.   SC->CLKOUTCFG = CLKOUTCFG_Val;        /* Clock Output Configuration         */
  419. #endif

  420.   /* Determine clock frequency according to clock register values             */
  421.   if (((SC->PLL0STAT >> 24) & 3) == 3) {/* If PLL0 enabled and connected      */
  422.     switch (SC->CLKSRCSEL & 0x03) {
  423.       case 0:                           /* Internal RC oscillator => PLL0     */
  424.       case 3:                           /* Reserved, default to Internal RC   */
  425.         SystemFrequency = (IRC_OSC *
  426.                           (((2 * ((SC->PLL0STAT & 0x7FFF) + 1))) /
  427.                           (((SC->PLL0STAT >> 16) & 0xFF) + 1))   /
  428.                           ((SC->CCLKCFG & 0xFF)+ 1));
  429.         break;
  430.       case 1:                           /* Main oscillator => PLL0            */
  431.         SystemFrequency = (OSC_CLK *
  432.                           (((2 * ((SC->PLL0STAT & 0x7FFF) + 1))) /
  433.                           (((SC->PLL0STAT >> 16) & 0xFF) + 1))   /
  434.                           ((SC->CCLKCFG & 0xFF)+ 1));
  435.         break;
  436.       case 2:                           /* RTC oscillator => PLL0             */
  437.         SystemFrequency = (RTC_CLK *
  438.                           (((2 * ((SC->PLL0STAT & 0x7FFF) + 1))) /
  439.                           (((SC->PLL0STAT >> 16) & 0xFF) + 1))   /
  440.                           ((SC->CCLKCFG & 0xFF)+ 1));
  441.         break;
  442.     }
  443.   } else {
  444.     switch (SC->CLKSRCSEL & 0x03) {
  445.       case 0:                           /* Internal RC oscillator => PLL0     */
  446.       case 3:                           /* Reserved, default to Internal RC   */
  447.         SystemFrequency = IRC_OSC / ((SC->CCLKCFG & 0xFF)+ 1);
  448.         break;
  449.       case 1:                           /* Main oscillator => PLL0            */
  450.         SystemFrequency = OSC_CLK / ((SC->CCLKCFG & 0xFF)+ 1);
  451.         break;
  452.       case 2:                           /* RTC oscillator => PLL0             */
  453.         SystemFrequency = RTC_CLK / ((SC->CCLKCFG & 0xFF)+ 1);
  454.         break;
  455.     }
  456.   }

  457. #if (FLASH_SETUP == 1)                  /* Flash Accelerator Setup            */
  458.   SC->FLASHCFG  = FLASHCFG_Val;
  459. #endif
  460. }
复制代码
回复

使用道具 举报

板凳
470798745 发表于 2019-3-11 01:57 | 只看该作者
谢谢啦学习学习楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

快速回复 返回顶部 返回列表