找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32学习-唯一ID编码

[复制链接]
跳转到指定楼层
楼主
ID:81272 发表于 2015-5-27 16:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
完整程序源代码工程文件下载地址: 唯一ID编码 .RAR (232.68 KB, 下载次数: 15)

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

  2. STM32学习日志(19)----唯一ID编码

  3. 编译环境:        EWARM V5.30
  4. 硬件环境:        南京万利 EK-STM32F
  5. STM32 FW:   V3.0.0
  6. 作者        :        szlihongtao
  7. 时间        :          2017-07-28
  8. 说明        :   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. // 延时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. // 时钟设置初始化
  58. //******************************************************************************
  59. static void RCC_Configuration(void)
  60. {
  61.   ErrorStatus HSEStartUpStatus;
  62. /*
  63. RCC_AdjustHSICalibrationValue 调整内部高速晶振(HSI)校准值
  64. RCC_ITConfig 使能或者失能指定的RCC中断
  65. RCC_ClearFlag 清除RCC的复位标志位
  66. RCC_GetITStatus 检查指定的RCC中断发生与否
  67. RCC_ClearITPendingBit 清除RCC的中断待处理位
  68. */
  69.           /* RCC system reset(for debug purpose) */
  70.           // 时钟系统复位
  71.           RCC_DeInit();

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

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

  78.         // 等待HSE起振
  79.         // 该函数将等待直到HSE就绪,或者在超时的情况下退出
  80.           /* Wait till HSE is ready */
  81.           HSEStartUpStatus = RCC_WaitForHSEStartUp();

  82.           if(HSEStartUpStatus == SUCCESS)
  83.           {
  84.             /* HCLK = SYSCLK */
  85.                 // 设置AHB时钟(HCLK)
  86.             RCC_HCLKConfig(RCC_SYSCLK_Div1);        // 72 MHz

  87.             /* PCLK1 = HCLK/2 */
  88.                 // 设置低速AHB时钟(PCLK1)
  89.             RCC_PCLK1Config(RCC_HCLK_Div2);        // 36 MHz

  90.             /* PCLK2 = HCLK */
  91.                 // 设置高速AHB时钟(PCLK2)
  92.             RCC_PCLK2Config(RCC_HCLK_Div1);        // 72 MHz

  93.             /* ADCCLK = PCLK2/8 */
  94.                 // 设置ADC时钟(ADCCLK)
  95.                    RCC_ADCCLKConfig(RCC_PCLK2_Div8);

  96.                 // 设置USB时钟(USBCLK)
  97.                 // USB时钟 = PLL时钟除以1.5
  98.                 RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_1Div5);

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

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

  104.                 // 设置RTC时钟(RTCCLK)
  105.                 // 选择HSE时钟频率除以128作为RTC时钟
  106.                 RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);

  107.                 // 使能或者失能RTC时钟
  108.                 // RTC时钟的新状态
  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.                 // 设置PLL时钟源及倍频系数
  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标志位设置与否
  122.             while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
  123.             {
  124.             }

  125.             /* Select PLL as system clock source */
  126.                 // 设置系统时钟(SYSCLK)
  127.             RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

  128.             /* Wait till PLL is used as system clock source */
  129.                 // 返回用作系统时钟的时钟源
  130.             while(RCC_GetSYSCLKSource() != 0x08)
  131.             {
  132.             }
  133.   }

  134.         // 使能或者失能AHB外设时钟
  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外设时钟
  143.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_ALL,DISABLE);

  144.         // 强制或者释放高速APB(APB2)外设复位
  145.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,ENABLE);
  146.         // 退出复位状态
  147.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_ALL,DISABLE);

  148.         // 强制或者释放低速APB(APB1)外设复位
  149.         RCC_APB1PeriphResetCmd(RCC_APB1Periph_ALL,ENABLE);

  150.         // 强制或者释放后备域复位
  151.         RCC_BackupResetCmd(ENABLE);

  152.         // 使能或者失能时钟安全系统
  153.         RCC_ClockSecuritySystemCmd(DISABLE);
  154. }

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

  161.         // 使能或者失能APB2外设时钟
  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.                                 // 仿真结果为128,与STM32F103VB的型号是一致的

  202.     //获取CPU唯一ID
  203.     CpuID[0]=*(vu32*)(0x1ffff7e8);    //  0XFFFFFF37
  204.     CpuID[1]=*(vu32*)(0x1ffff7ec);     // 0X31383836
  205.     CpuID[2]=*(vu32*)(0x1ffff7f0);     // 0X43163562
  206.    
  207.     //加密算法,很简单的加密算法
  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. */

复制代码


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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