找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stm32 NAND闪存 读写一个页 程序 成功版

[复制链接]
跳转到指定楼层
楼主
ID:82781 发表于 2015-6-14 01:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
努力没有白费,闪存今天搞定了,搞完了真有“原来 如此”的感觉!一个字,爽!虽然没有坏块处理算法,但是对我来说这就很爽了,闪存很有用,尤其是下一步要做摄像头,可以用他来存储,他的容量是海量的,1GB,加油吧!

天津第四项目部 宿舍
                             吼吼     熬好熬好!    巴嘎
  以下是源代码!下一步对部分操作进行封装就行了!!!!

  1. /**
  2.   ******************************************************************************
  3. 本程序为GPIO驱动NAND 闪存的程序,初步完成了读写一个页的功能,无坏块处理和算法,
  4. 耗时近9小时!值得注意的是:
  5. ***************************************************
  6. ***********在写数据以前一定要先擦除,因为FLASH技术不能把0变1,只能1变0,切忌切忌**************
  7. ***********在写数据以前一定要先擦除,因为FLASH技术不能把0变1,只能1变0,切忌切忌****************************************
  8.    在写数据以前一定要先擦除,因为FLASH技术不能把0变1,只能1变0,切忌切忌
  9.    在写数据以前一定要先擦除,因为FLASH技术不能把0变1,只能1变0,切忌切忌


  10.    2011年8月28日
  11.    天津第四项目部宿舍内
  12.    王均伟

  13. /* Includes ------------------------------------------------------------------*/
  14. #include "stm32f10x.h"
  15. #include "stm32f10x_flash.h"
  16. #define SET_CLE GPIO_SetBits(GPIOD, GPIO_Pin_6)
  17. #define CLR_CLE GPIO_ResetBits(GPIOD, GPIO_Pin_6)
  18. #define SET_ALE GPIO_SetBits(GPIOD, GPIO_Pin_5)
  19. #define CLR_ALE GPIO_ResetBits(GPIOD, GPIO_Pin_5)
  20. #define SET_CE GPIO_SetBits(GPIOD, GPIO_Pin_7)
  21. #define CLR_CE GPIO_ResetBits(GPIOD, GPIO_Pin_7)
  22. #define SET_WE GPIO_SetBits(GPIOD, GPIO_Pin_14)
  23. #define CLR_WE GPIO_ResetBits(GPIOD, GPIO_Pin_14)
  24. #define SET_RE GPIO_SetBits(GPIOD, GPIO_Pin_15)
  25. #define CLR_RE GPIO_ResetBits(GPIOD, GPIO_Pin_15)
  26. uint8_t tabel[2111];
  27. void mysysinit(void);//系统时钟初始
  28. void my_USART_init(void);//初始化
  29. void my_send_byte(unsigned char send_date); //发送一个字节
  30. GPIO_InitTypeDef GPIO_InitStructure;//GPIO的属性结构体变量定义
  31. void READ_NAND_ID(void);//读闪存的ID
  32. void delay_1us(uint32_t);//延时1微秒程序
  33. void my_NAND_INIT(void ); //nand flash 初始化
  34. void wait_NAND_readay(void);//等待闪存准倍完毕
  35. void write_nand_addrrs(uint8_t a);
  36. void write_nand_commond(uint8_t comm);
  37. void write_nand_date(uint8_t da);
  38. uint8_t read_nand_date(void);
  39. void write_NAND_PAGE(void);//写闪存的一页
  40. void read_NAND_PAGE(void); //读闪存的一页
  41. void erase_NAND_BLOK(void);//擦出闪存的一个块
  42. //*说多无益*///
  43. int main()
  44. {
  45.      


  46. mysysinit();//RCC初始化,系统时钟设置72MHZ
  47.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能APB2的GPIO_D时钟
  48.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能APB2的GPIO_D时钟
  49.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能APB2的GPIO_B时钟
  50. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);//使能APB2的GPIO_E时钟
  51. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//使能APB2的GPIO_E时钟
  52.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能APB1的USART2时钟
  53.   /* led*/
  54.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
  55.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  57.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  58.   /* 设置PB.5用于控制NAND的为上拉输入 */
  59.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
  60.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  61.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  62.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  63.   /* 设置PD口用于控制NAND的为输出 */
  64.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_14| GPIO_Pin_15;
  65.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  66.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  67.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  68.    my_USART_init();
  69.             
  70.    
  71.       

  72.         wait_NAND_readay();//忙则等待;

  73.                 my_send_byte(0);
  74.           my_send_byte(1);
  75.        my_send_byte(2);
  76.     my_send_byte(3);

  77.   
  78. READ_NAND_ID(); //读闪存ID
  79. erase_NAND_BLOK();//擦除闪存的一个块
  80. write_NAND_PAGE();//写一个页

  81. read_NAND_PAGE();//读一个页
  82. while(1);


  83. }
  84. /*擦除一个块*/
  85. void erase_NAND_BLOK()
  86. { uint8_t e,m;



  87. /*设置PE口得低八位为输出*/
  88.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7;
  89.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  90.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  91.   GPIO_Init(GPIOE, &GPIO_InitStructure);


  92. SET_WE;
  93. SET_RE;
  94. CLR_ALE;  //初始化
  95. CLR_CLE;

  96. CLR_CE;
  97. SET_CLE;
  98. CLR_ALE;
  99. CLR_WE;
  100. GPIO_Write(GPIOE, 0x60); //命令
  101. SET_WE;
  102. CLR_CLE;
  103. SET_ALE;
  104. CLR_WE;
  105. GPIO_Write(GPIOE, 0x00); //快地址0
  106. SET_WE;
  107. CLR_WE;
  108. GPIO_Write(GPIOE, 0x00); //块地址1
  109. SET_WE;
  110. CLR_ALE;
  111. SET_CLE;
  112. CLR_WE;
  113. GPIO_Write(GPIOE, 0xd0); //开始擦除
  114. SET_WE;
  115. CLR_CLE;
  116. for(m=5;m;m--);//延时满足时序
  117. wait_NAND_readay();
  118. delay_1us(3000); //等待擦完
  119. SET_CLE;
  120. CLR_WE;
  121. GPIO_Write(GPIOE, 0x70); // 读状态码状态读 //这个状态要为E0才表示操作完成可以进行下一步操作
  122. SET_WE;
  123. CLR_CLE;
  124. GPIOE->CRL=0x88888888; //数据口转换成输入
  125. CLR_RE;
  126. e=(GPIOE->IDR);//读出数据
  127. SET_RE;
  128. my_send_byte(e);  //穿行发送

  129. }
  130. /*读闪存一页*/
  131. void read_NAND_PAGE()
  132. {
  133. uint32_t n;
  134. uint8_t sd;


  135. /*设置PE口得低八位为输出*/
  136.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7;
  137.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  138.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  139.   GPIO_Init(GPIOE, &GPIO_InitStructure);
  140. SET_WE;
  141. SET_RE;
  142. CLR_ALE;
  143. CLR_CLE;

  144. CLR_CE;//片选开启
  145. SET_CLE;
  146. CLR_ALE;
  147. SET_RE;
  148. CLR_WE;
  149. GPIO_Write(GPIOE, 0x00); //  读命令
  150. SET_WE;
  151. CLR_CLE;
  152. SET_ALE;
  153. SET_RE;
  154. CLR_WE;
  155. GPIO_Write(GPIOE, 0x00); //页地址
  156. SET_WE;
  157. CLR_WE;
  158. GPIO_Write(GPIOE, 0x00);//页地址
  159. SET_WE;
  160. CLR_WE;
  161. GPIO_Write(GPIOE, 0x00); //快地址
  162. SET_WE;
  163. CLR_WE;
  164. GPIO_Write(GPIOE, 0x00);//快地址
  165. SET_WE;

  166. CLR_ALE;
  167. SET_CLE;
  168. SET_RE;
  169. CLR_WE;
  170. GPIO_Write(GPIOE, 0x30); //开始读出命令
  171. SET_WE;
  172. CLR_CLE;
  173. GPIOE->CRL=0x88888888; //接口转换
  174. for(n=30;n;n--);//满足时序
  175. delay_1us(20); //等待
  176. wait_NAND_readay();
  177. for(n=2112;n;n--)
  178. {
  179. CLR_RE;
  180. sd=(GPIOE->IDR);//读出数据
  181. SET_RE;
  182. my_send_byte(sd);//发送到计算机
  183. }

  184. SET_CE;
  185. SET_WE;
  186. SET_RE;
  187. CLR_ALE;
  188. CLR_CLE;





  189. }


  190. /*写闪存的一页,数据=2112字节=2kb*/
  191. void write_NAND_PAGE()
  192. {


  193.    uint8_t send_date=0;
  194.    uint32_t numb;
  195.    /*设置PE口得低八位为输出*/
  196.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7;
  197.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  198.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  199.   GPIO_Init(GPIOE, &GPIO_InitStructure);
  200. SET_WE;
  201. SET_RE;
  202. CLR_ALE;
  203. CLR_CLE;

  204. CLR_CE;//片选开启
  205. SET_CLE;//命令
  206. CLR_ALE;
  207. SET_WE;
  208. SET_RE;

  209. CLR_WE;
  210. GPIO_Write(GPIOE, 0x80); //写一页命令
  211. SET_WE;
  212. CLR_CLE;//释放命令总线


  213. SET_ALE;//地址写入允许
  214. CLR_WE;
  215. GPIO_Write(GPIOE, 0x00); //页地址0
  216. SET_WE;
  217. CLR_WE;
  218. GPIO_Write(GPIOE, 0x00); //页地址
  219. SET_WE;
  220. CLR_WE;
  221. GPIO_Write(GPIOE, 0x00); //快递至
  222. SET_WE;
  223. CLR_WE;
  224. GPIO_Write(GPIOE, 0x00); //快递至
  225. SET_WE;
  226. CLR_ALE;//释放地址总线

  227. for(numb=5;numb;numb--);//延时
  228. for(numb=2112;numb;numb--)
  229. {
  230.    CLR_WE;
  231.    GPIO_Write(GPIOE, 0x89);  //写入数据89
  232.    SET_WE;

  233. }
  234. SET_CLE;//开启命令总线
  235. CLR_WE;
  236. GPIO_Write(GPIOE, 0x10);//页编程
  237. SET_WE;
  238. for(numb=3;numb;numb--);//略微延时
  239. wait_NAND_readay();
  240. delay_1us(500);
  241. CLR_WE;
  242. GPIO_Write(GPIOE, 0x70);//状态读 //这个状态要为E0才表示操作完成可以进行下一步操作
  243. SET_WE;
  244. GPIOE->CRL=0x88888888;
  245. SET_WE;
  246. SET_RE;
  247. CLR_RE;
  248. send_date=(GPIOE->IDR);//读出数据
  249. SET_CE;
  250. my_send_byte(send_date);
  251. SET_WE;
  252. SET_RE;
  253. CLR_ALE;
  254. CLR_CLE;

  255. }




  256. /*等待芯片不忙*/
  257. void wait_NAND_readay()
  258. {

  259. uint8_t wait=0;//忙闲信号
  260. //等待芯片不忙


  261.    do
  262.    { wait=GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5);//读取忙闲引脚
  263.    }
  264.     while(0x00==wait);

  265. }
  266. /*读取NAND闪存的ID序列号串口发送*/
  267. void READ_NAND_ID()
  268. {

  269. uint8_t a=0,b=0,c=0,d=0;

  270.   
  271.    /* 设置PD口用于控制NAND的为输出 */
  272.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_14| GPIO_Pin_15;
  273.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  274.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  275.   GPIO_Init(GPIOD, &GPIO_InitStructure);
  276. /*设置PE口得低八位为输出*/
  277.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4|GPIO_Pin_5 | GPIO_Pin_6| GPIO_Pin_7;
  278.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  279.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  280.   GPIO_Init(GPIOE, &GPIO_InitStructure);


  281.   CLR_CE;//开启片选


  282.   SET_CLE;//命令锁存开启
  283.   CLR_WE;//写使能
  284.   CLR_ALE;//地址锁存关闭
  285.   SET_RE;//读关闭
  286.   GPIO_Write(GPIOE, 0x90); //读ID命令
  287.   SET_WE;//关闭写

  288.   CLR_CLE;
  289.   SET_ALE;
  290.   CLR_WE;
  291.   GPIO_Write(GPIOE, 0x00); //地址00
  292.   SET_WE;




  293.   /*设置PE口得低八位为输入*/
  294.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4|GPIO_Pin_7 | GPIO_Pin_6| GPIO_Pin_7;
  295.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  296.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  297.   GPIO_Init(GPIOE, &GPIO_InitStructure);

  298.   CLR_ALE; //注意啊,这里一定把他放在下面应为是有时间要求的;时序图TAR=15纳秒之后才是RE的操作;
  299.        //读出的结果是AD F1 80 1D ,2011年8月26日,与天津第四项目部宿舍
  300.      //AD F1,不用关心,80 1D代表本闪存为8位组织结构,页面大小为2KB,快大小为128KB,备用区为每512字节有16字节
  301.   CLR_RE;

  302.    a=(GPIOE->IDR);//读出数据
  303.   SET_RE;

  304.     CLR_RE;
  305.   b=(GPIOE->IDR);
  306.   SET_RE;

  307.     CLR_RE;
  308.    c=(GPIOE->IDR);
  309. SET_RE;

  310.   CLR_RE;
  311.     d=(GPIOE->IDR);//delay_1us(1);
  312. SET_RE;


  313.   SET_CE;//关闭片选

  314.                 my_send_byte(a);
  315.           my_send_byte(b);
  316.        my_send_byte(c);
  317.     my_send_byte(d);
  318. }
  319. /*写一个命令*/
  320. void write_nand_commond(uint8_t comm)
  321. {
  322.   CLR_CE;
  323.   SET_RE;
  324.   SET_CLE;//命令锁存开启
  325.   CLR_ALE;//地址锁存关闭
  326.   CLR_WE;//写使能
  327.   GPIO_Write(GPIOE, comm); //命令
  328.   SET_WE;//关闭写
  329.   CLR_CLE;
  330.   SET_CE;

  331. }
  332. /*写一个地址*/
  333. void write_nand_addrrs(uint8_t a)
  334. {
  335.   CLR_CE;
  336.   SET_RE;
  337.   CLR_CLE;
  338.   SET_ALE;
  339.   CLR_WE;;;
  340.   GPIO_Write(GPIOE, a); //地址
  341.   SET_WE;
  342.   CLR_ALE;
  343.   SET_CE;


  344. }
  345. //写一个数据
  346. void write_nand_date(uint8_t da)
  347. { CLR_CE;
  348.     CLR_ALE;
  349. CLR_CLE;
  350. SET_RE;
  351.   CLR_WE;
  352.     GPIOE->ODR=da;//GPIO_Write(GPIOE, da); //数据
  353.      SET_WE;
  354.   SET_CE;

  355. }
  356. /*读一个数据*/
  357. uint8_t read_nand_date()
  358. {

  359.     uint8_t a;
  360.    CLR_CE;
  361.   SET_WE;
  362.   SET_RE;
  363.   CLR_RE;;;;
  364.    a=(GPIOE->IDR);//读出数据
  365.    SET_RE;
  366.    SET_CE;
  367.   return a;
  368. }
  369. /********************
  370.   延时函数
  371.   形参:uint8_t time
  372.   功能:延时数值为time值

  373. *********************/
  374. void delay_1us(uint32_t time)
  375. {   uint32_t b,c;
  376.         for(c=time;c;c--) //定时=time*3*333.6=time*1000.8ns
  377.          {     
  378.    for(b=8;b;b--); //8*13.9*3= 333.6     
  379.          }



  380. }
  381. /***********************************

  382. 发送一个字节函数通过串口

  383. ************************************/
  384. void my_send_byte(unsigned char send_date )
  385. {

  386.   while( (USART1->SR&0x00000080)!=0x80);//发送寄存器为空
  387.    USART1->DR=send_date;


  388. }
  389. /**********************************
  390.           初始化串口

  391. **********************************/
  392. void my_USART_init()
  393. {

  394. /*USART2的优先级设为5*/
  395. NVIC->IP[37]=5;
  396. /*开启38号中断即USART2,关闭其他所有外部的中断*/
  397. NVIC->ISER[1]=0x00000020;   
  398. /*设置复用模式下的引脚模式为全双工:TX输出推挽复用,RX为输入上拉模式,速度50MHZ*/
  399.             GPIOA->CRH=0x000008b0;
  400.   /* 1.开启USART,
  401. *
  402. */
  403. USART1->CR1=0x2000;
  404. /* 1.关闭局域网模式
  405. * 2.1个停止位
  406. * 3.CK引脚禁能
  407. */
  408. USART1->CR2=0;
  409. /* 1.关闭调制解调模式
  410. * 2.关闭DMA模式
  411. * 3.关闭智能卡、红外模式
  412. *   4.关闭错误中断

  413. */
  414. USART1->CR3=0;
  415. /*     波特率设置

  416.      2011年8月11日
  417.         王均伟
  418.          天津第四项目部宿舍

  419.     BRR中的第四位(DIV_Fraction)作为小数,高12位(DIV_MANtissa)作为整数部分,
  420.   
  421.     1,根据公式:波特率=fck/16*usardiv,其中usardivBRR寄存器的值,所以变形得:USARDIV=fck/16*波特率
  422.     2.算出来BRR寄存器的值后就要把这个值变成16进制数据写入BRR寄存器中,
  423.       遵循以下规则:
  424.       小数部分*16=DIV_Fraction或者取近似的值
  425.       整数部分直接=DIV_MANtissa
  426.     3.把这个16进制值写入BRR寄存器
  427.     例如我要算波特率设成9600bps的BRR寄存器值,
  428.     1.先求USARDIV=36000000/16*9600=234.375
  429.     2.换成十六进制:DIV_Fraction=16*0.375=0x6
  430.                     DIV_MANtissa=234=0xea
  431.     3.组合并写入寄存器
  432.                      USART2->BRR=0x0ea6;值得注意的是这里是16位半字操作,所以不要以为是32位。

  433. */
  434. USART1->BRR=0x0ea6;

  435. /* 1.开启USART
  436. * 2.开启接收完毕中断
  437. * 3.开启发送功能
  438. *   4.开启接收功能
  439. */
  440. USART1->CR1=0x202c;


  441. }


  442. void mysysinit()//系统初始化程序
  443. {
  444. ErrorStatus HSEStartUpStatus;//说明标志位
  445. RCC_DeInit();//所有外设全部缺省设置

  446. /* Enable HSE */
  447. RCC_HSEConfig(RCC_HSE_ON);
  448. /* Wait till HSE is ready and if Time out is reached exit */
  449. HSEStartUpStatus = RCC_WaitForHSEStartUp();
  450. if(HSEStartUpStatus == SUCCESS)//启动成功
  451. {
  452. /*这两条FLASH指令必须加上,不知为啥?不加上就运行几秒后出错,参照系统初始化*/
  453. /* Enable The Prefetch Buffer */
  454. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//FLASH缓存开启
  455. /* Configure the Latency cycle: Set 2 Latency cycles */
  456.   FLASH_SetLatency(FLASH_Latency_2);  //设置FLASH这些位表示SYSCLK(系统时钟)周期与闪存访问时间的比例,为010:两个等待状态,当 48MHz < SYSCLK ≤ 72MHz
  457. /* Set PLL clock output to 72MHz using HSE (8MHz) as entry clock */
  458. RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//外部时钟为8M,PLL的输入时钟=8MHZ,倍频系数9,

  459. /* Configure HCLK such as HCLK = SYSCLK */
  460. RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置了啦AHB分频器的分频系数=1,即HCLK=SYSCLK=72MHZ
  461. /* Configure PCLK1 such as PCLK1 = HCLK/2 */
  462. RCC_PCLK1Config(RCC_HCLK_Div2);//设置了APB1外设的时钟频率最大是36M这里是APB1的分频器设为2,PCLK1=HCLK/2=72/2=36MHZ正好是最大值
  463. /* Configure PCLK2 such as PCLK2 = HCLK */
  464. RCC_PCLK2Config(RCC_HCLK_Div1);//设置PLCK2=HCLK=72MHZ,的APB2分频器=1
  465. /* Select the PLL as system clock source */
  466. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置了SYSCLK的提供者为PLL,频率由上面算出=72MHZ
  467. /* disable PLL Ready interrupt */
  468. RCC_ITConfig(RCC_IT_PLLRDY, DISABLE);//PLL中断关闭
  469. /* disable PLL Ready interrupt */
  470. RCC_ITConfig(RCC_IT_HSERDY,DISABLE);//HSE中断关闭
  471. /* disable PLL Ready interrupt */
  472. RCC_ITConfig(RCC_IT_HSIRDY, DISABLE); //HSI中断关闭
  473. /* disable PLL Ready interrupt */
  474. RCC_ITConfig(RCC_IT_LSERDY, DISABLE); //LSE中断关闭
  475. /* disable PLL Ready interrupt */
  476. RCC_ITConfig(RCC_IT_LSIRDY, DISABLE); //LSI中断关闭

  477. /* PLL clock divided by 1.5 used as USB clock source */
  478. RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);//设置USB的时钟为=72、1.5=48mhz
  479. /* Configure ADCCLK such as ADCCLK = PCLK2/2 */
  480. RCC_ADCCLKConfig(RCC_PCLK2_Div2);//设置ADC时钟=PCLK2/2= 36MHZ
  481. /* disable the LSE */
  482. RCC_LSEConfig(RCC_LSE_OFF);//外部低速晶振关闭

  483. /*DISable the RTC clock */
  484. RCC_RTCCLKCmd(DISABLE);
  485. /* DISable the Clock Security System */
  486. RCC_ClockSecuritySystemCmd(DISABLE);
  487. /* Enable the PLL */
  488. RCC_PLLCmd(ENABLE);//使能PLL







  489. /* PLL ans system clock config */
  490. }
  491. else
  492. {
  493. /* Add here some code to deal with this error */
  494. }
  495. }
复制代码




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

使用道具 举报

沙发
ID:1119902 发表于 2024-5-9 10:59 | 只看该作者
哥  能不能发完整程序我研究下,最近在做一个项目nandflash读数据
回复

使用道具 举报

板凳
ID:1119902 发表于 2024-5-9 11:01 | 只看该作者
哥 能不能发下nandflash读写的完整程序我研究下,最近在做一个stm32读nandflash数据的项目
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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