找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4720|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STM32學(xué)習(xí)-唯一ID編碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:81272 發(fā)表于 2015-5-27 16:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
完整程序源代碼工程文件下載地址: 唯一ID編碼 .RAR (232.68 KB, 下載次數(shù): 15)

  1. /*******************************************************************************

  2. STM32學(xué)習(xí)日志(19)----唯一ID編碼

  3. 編譯環(huán)境:        EWARM V5.30
  4. 硬件環(huán)境:        南京萬(wàn)利 EK-STM32F
  5. STM32 FW:   V3.0.0
  6. 作者        :        szlihongtao
  7. 時(shí)間        :          2017-07-28
  8. 說(shuō)明        :   1.讀取stm32芯片的唯一id碼
  9.             2.讀取stm32芯片的閃存容量寄存器,單位為KB     
  10. *******************************************************************************/
  11. /**
  12.   ******************************************************************************
  13.   * @file    Project/Template/main.c
  14.   * @author  MCD Application Team
  15.   * @version V3.0.0
  16.   * @date    04/06/2009
  17.   * @brief   Main program body
  18.   ******************************************************************************
  19.   * @copy
  20.   *
  21.   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  22.   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  23.   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  24.   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  25.   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  26.   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  27.   *
  28.   * <h2><center>© COPYRIGHT 2009 STMicroelectronics</center></h2>
  29.   */

  30. /* Includes ------------------------------------------------------------------*/
  31. #include "stm32f10x.h"
  32. #include "stm32_m.h"

  33. /** @addtogroup Template_Project
  34.   * @{
  35.   */

  36. /* Private typedef -----------------------------------------------------------*/
  37. /* Private define ------------------------------------------------------------*/
  38. /* Private macro -------------------------------------------------------------*/
  39. /* Private variables ---------------------------------------------------------*/
  40. /* Private function prototypes -----------------------------------------------*/
  41. /* Private functions ---------------------------------------------------------*/

  42. /**
  43.   * @brief  Main program.
  44.   * @param  None
  45.   * @retval : None
  46.   */
  47. //******************************************************************************
  48. // 延時(shí)50ms
  49. //******************************************************************************
  50. static void delay(void)
  51. {
  52.         INT32U i;
  53.     static INT32U jjj=5240*50;

  54.         for (i=0; i<jjj; i++);
  55. }
  56. //******************************************************************************
  57. // 時(shí)鐘設(shè)置初始化
  58. //******************************************************************************
  59. static void RCC_Configuration(void)
  60. {
  61.   ErrorStatus HSEStartUpStatus;
  62. /*
  63. RCC_AdjustHSICalibrationValue 調(diào)整內(nèi)部高速晶振(HSI)校準(zhǔn)值
  64. RCC_ITConfig 使能或者失能指定的RCC中斷
  65. RCC_ClearFlag 清除RCC的復(fù)位標(biāo)志位
  66. RCC_GetITStatus 檢查指定的RCC中斷發(fā)生與否
  67. RCC_ClearITPendingBit 清除RCC的中斷待處理位
  68. */
  69.           /* RCC system reset(for debug purpose) */
  70.           // 時(shí)鐘系統(tǒng)復(fù)位
  71.           RCC_DeInit();

  72.         // 使能外部的8M晶振
  73.         // 設(shè)置外部高速晶振(HSE)
  74.           /* Enable HSE */
  75.           RCC_HSEConfig(RCC_HSE_ON);

  76.         // 使能或者失能內(nèi)部高速晶振(HSI)
  77.         RCC_HSICmd(DISABLE);

  78.         // 等待HSE起振
  79.         // 該函數(shù)將等待直到HSE就緒,或者在超時(shí)的情況下退出
  80.           /* Wait till HSE is ready */
  81.           HSEStartUpStatus = RCC_WaitForHSEStartUp();

  82.           if(HSEStartUpStatus == SUCCESS)
  83.           {
  84.             /* HCLK = SYSCLK */
  85.                 // 設(shè)置AHB時(shí)鐘(HCLK)
  86.             RCC_HCLKConfig(RCC_SYSCLK_Div1);        // 72 MHz

  87.             /* PCLK1 = HCLK/2 */
  88.                 // 設(shè)置低速AHB時(shí)鐘(PCLK1)
  89.             RCC_PCLK1Config(RCC_HCLK_Div2);        // 36 MHz

  90.             /* PCLK2 = HCLK */
  91.                 // 設(shè)置高速AHB時(shí)鐘(PCLK2)
  92.             RCC_PCLK2Config(RCC_HCLK_Div1);        // 72 MHz

  93.             /* ADCCLK = PCLK2/8 */
  94.                 // 設(shè)置ADC時(shí)鐘(ADCCLK)
  95.                    RCC_ADCCLKConfig(RCC_PCLK2_Div8);

  96.                 // 設(shè)置USB時(shí)鐘(USBCLK)
  97.                 // USB時(shí)鐘 = PLL時(shí)鐘除以1.5
  98.                 RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);

  99.                 // 設(shè)置外部低速晶振(LSE)
  100.                 RCC_LSEConfig(RCC_LSE_OFF);

  101.                 // 使能或者失能內(nèi)部低速晶振(LSI)
  102.                 // LSE晶振OFF
  103.                 RCC_LSICmd(DISABLE);

  104.                 // 設(shè)置RTC時(shí)鐘(RTCCLK)
  105.                 // 選擇HSE時(shí)鐘頻率除以128作為RTC時(shí)鐘
  106.                 RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

  107.                 // 使能或者失能RTC時(shí)鐘
  108.                 // RTC時(shí)鐘的新?tīng)顟B(tài)
  109.                 RCC_RTCCLKCmd(DISABLE);

  110.             /* Flash 2 wait state */
  111.             FLASH_SetLatency(FLASH_Latency_2);

  112.             /* Enable Prefetch Buffer */
  113.             FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  114.             /* PLLCLK = 8MHz * 9 = 72 MHz */
  115.                 // 設(shè)置PLL時(shí)鐘源及倍頻系數(shù)
  116.             RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

  117.             /* Enable PLL */
  118.                 // 使能或者失能PLL
  119.             RCC_PLLCmd(ENABLE);

  120.             /* Wait till PLL is ready */
  121.                 // 檢查指定的RCC標(biāo)志位設(shè)置與否
  122.             while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  123.             {
  124.             }

  125.             /* Select PLL as system clock source */
  126.                 // 設(shè)置系統(tǒng)時(shí)鐘(SYSCLK)
  127.             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  128.             /* Wait till PLL is used as system clock source */
  129.                 // 返回用作系統(tǒng)時(shí)鐘的時(shí)鐘源
  130.             while(RCC_GetSYSCLKSource() != 0x08)
  131.             {
  132.             }
  133.   }

  134.         // 使能或者失能AHB外設(shè)時(shí)鐘
  135.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1
  136.                                                         |RCC_AHBPeriph_DMA2
  137.                                                         |RCC_AHBPeriph_SRAM
  138.                                                         |RCC_AHBPeriph_FLITF
  139.                                                         |RCC_AHBPeriph_CRC
  140.                                                         |RCC_AHBPeriph_FSMC
  141.                                                         |RCC_AHBPeriph_SDIO,DISABLE);
  142.         // 使能或者失能APB1外設(shè)時(shí)鐘
  143.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL,DISABLE);

  144.         // 強(qiáng)制或者釋放高速APB(APB2)外設(shè)復(fù)位
  145.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,ENABLE);
  146.         // 退出復(fù)位狀態(tài)
  147.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,DISABLE);

  148.         // 強(qiáng)制或者釋放低速APB(APB1)外設(shè)復(fù)位
  149.         RCC_APB1PeriphResetCmd(RCC_APB1Periph_ALL,ENABLE);

  150.         // 強(qiáng)制或者釋放后備域復(fù)位
  151.         RCC_BackupResetCmd(ENABLE);

  152.         // 使能或者失能時(shí)鐘安全系統(tǒng)
  153.         RCC_ClockSecuritySystemCmd(DISABLE);
  154. }

  155. //******************************************************************************
  156. // GPIO設(shè)置
  157. //******************************************************************************
  158. static void GPIO_Configuration(void)
  159. {
  160.         GPIO_InitTypeDef GPIO_InitStructure;

  161.         // 使能或者失能APB2外設(shè)時(shí)鐘
  162.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);

  163.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  164.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  165.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  166.           GPIO_Init(GPIOC, &GPIO_InitStructure);

  167.           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;
  168.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  169.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  170.           GPIO_Init(GPIOD, &GPIO_InitStructure);
  171. }
  172. //******************************************************************************
  173. // LED5亮
  174. //******************************************************************************
  175. void Led_RW_ON(void)
  176. {
  177.           GPIO_SetBits(GPIOC,GPIO_Pin_4);
  178. }
  179. //******************************************************************************
  180. // LED5滅
  181. //******************************************************************************
  182. void Led_RW_OFF(void)
  183. {
  184.           GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  185. }

  186. INT32U un;              //閃存容量寄存器
  187. INT32U CpuID[3];
  188. INT32U Lock_Code;
  189. //******************************************************************************
  190. // 主程序
  191. //******************************************************************************
  192. int main(void)
  193. {        
  194.     RCC_Configuration();
  195.           GPIO_Configuration();
  196.         Led_RW_ON();
  197.         delay();
  198.         Led_RW_OFF();
  199. //------------------------------------------------------------------------------  
  200.     un=(*( u16 *)0x1FFFF7E0);   // 閃存容量寄存器,單位為KB   
  201.                                 // 仿真結(jié)果為128,與STM32F103VB的型號(hào)是一致的

  202.     //獲取CPU唯一ID
  203.     CpuID[0]=*(vu32*)(0x1ffff7e8);    //  0XFFFFFF37
  204.     CpuID[1]=*(vu32*)(0x1ffff7ec);     // 0X31383836
  205.     CpuID[2]=*(vu32*)(0x1ffff7f0);     // 0X43163562
  206.    
  207.     //加密算法,很簡(jiǎn)單的加密算法
  208.     Lock_Code=(CpuID[0]>>1)+(CpuID[1]>>2)+(CpuID[2]>>3);  // X94B0D454
  209. //------------------------------------------------------------------------------
  210.         for (;;)
  211.         {
  212.                 delay();
  213.                 GPIOC->ODR ^= GPIO_Pin_4;                // led5 toogle
  214.         }
  215. }
  216. //******************************************************************************
  217. #ifdef  USE_FULL_ASSERT

  218. /**
  219.   * @brief  Reports the name of the source file and the source line number
  220.   *   where the assert_param error has occurred.
  221.   * @param file: pointer to the source file name
  222.   * @param line: assert_param error line source number
  223.   * @retval : None
  224.   */
  225. void assert_failed(uint8_t* file, uint32_t line)
  226. {
  227.   /* User can add his own implementation to report the file name and line number,
  228.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  229.   /* Infinite loop */
  230.   while (1)
  231.   {
  232.   }
  233. }
  234. #endif

  235. /**
  236.   * @}
  237.   */
  238. //******************************************************************************
  239. /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
  240. //******************************************************************************
  241. /*
  242.         LED2---------PC7
  243.         LED3---------PC6
  244.         LED4---------PC5
  245.         LED5---------PC4

  246.         KEY2---------PD3
  247.         KEY3---------PD4
  248. */

復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表