STM32初学笔记1之RCC(上)

发布者:ching80790最新更新时间:2016-10-10 来源: eefocus关键字:STM32  初学笔记  RCC 手机看文章 扫描二维码
随时随地手机看文章
我参考了STM32的标准外设库中的RCC例程,然后对其在原有的基础上做了一定的修改,单独添加到了RCC_ClkConfig.C和RCC_ClkConfig.H两个文件当中,把这个作为以后系统时钟配置的通用函数,在这里共享出来,示例代码如下:

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

                                      RCC_ClkConfig.C

//////////////////////////////////////////////////////////////////////////////////////////////////////

/**
 ** 文件名称:RCC_ClockConfig.C
 ** 功能描述:STM32系统时钟配置头文件
 ** 硬件平台:STM32F10X
 ** 编译环境:Keil uversion4 IDE
 ** 库版本  :v3.5.0
 ** 版本信息:v0.0
 ** 编写作者:ST Microcontroler
 ** 编写时间:2011-11-25
 ** 附加说明:无
 ** 修改记录:无
 **/

/* Includes ------------------------------------------------------------------*/
#include "RCC_ClockConfig.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
RCC_ClocksTypeDef RCC_ClockFreq; //定义RCC时钟频率结构体变量
ErrorStatus HSEStartUpStatus;    //枚举状态变量SUCCESS/ERROR
/* Private functions ---------------------------------------------------------*/

/**
  * @brief  Configures the System clock frequency, HCLK, PCLK2 and PCLK1
  *         prescalers.
  * @param  None
  * @retval None
  */
//void SetSysClock(void)
//{    
///* The System clock configuration functions defined below assume that:
//        - For Low, Medium and High density devices an external 8MHz crystal is
//          used to drive the System clock.
//        - For Connectivity line devices an external 25MHz crystal is used to drive
//          the System clock.
//   If you are using different crystal you have to adapt those functions accordingly.
//   系统时钟配置函数的定义是基于以下假设:
//   1、对于小容量、中容量和大容量设备通过外部8MHz的晶振来驱动系统时钟。
//   2、对于互联型设备通过外部25MHz的晶振来驱动系统时钟。
//   如果你使用的是不一样的晶振,你必须相应地改编这些函数。
//*/
//
//#if defined SYSCLK_HSE
//  SetSysClockToHSE();
//#elif defined SYSCLK_FREQ_24MHz
//  SetSysClockTo24();  
//#elif defined SYSCLK_FREQ_36MHz
//  SetSysClockTo36();
//#elif defined SYSCLK_FREQ_48MHz
//  SetSysClockTo48();
//#elif defined SYSCLK_FREQ_56MHz
//  SetSysClockTo56(); 
//#elif defined SYSCLK_FREQ_72MHz
//  SetSysClockTo72();
//#endif
// 
// /* If none of the define above is enabled, the HSI is used as System clock
//    source (default after reset) */ 
//}

/**
  * @brief  Selects HSE as System clock source and configure HCLK, PCLK2
  *         and PCLK1 prescalers. 
  *         选择HSE作为系统时钟源同时配置HCLK,PCLK2和PCLK1的分频
  * @param  None
  * @retval None
  */
void SetSysClockToHSE(void)
{
   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
   /* RCC system reset(for debug purpose) */
   RCC_DeInit();

   /* Enable HSE */
   RCC_HSEConfig(RCC_HSE_ON);

   /* Wait till HSE is ready */
   HSEStartUpStatus = RCC_WaitForHSEStartUp();

   if (HSEStartUpStatus == SUCCESS)
   {
  #if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL
     /* Enable Prefetch Buffer */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

  #ifndef STM32F10X_CL
     /* Flash 0 wait state */
     FLASH_SetLatency(FLASH_Latency_0);
  #else
     if (HSE_Value <= 24000000)
  {
        /* Flash 0 wait state */
        FLASH_SetLatency(FLASH_Latency_0);
  }
  else
  {
        /* Flash 1 wait state */
        FLASH_SetLatency(FLASH_Latency_1);
  }

  #endif /* STM32F10X_CL */
  #endif /* STM32F10X_LD_VL && STM32F10X_MD_VL */
 
     /* HCLK = SYSCLK */
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
     /* PCLK2 = HCLK */
     RCC_PCLK2Config(RCC_HCLK_Div1);

     /* PCLK1 = HCLK */
     RCC_PCLK1Config(RCC_HCLK_Div1);

     /* Select HSE as system clock source */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

     /* Wait till PLL is used as system clock source */
     while (RCC_GetSYSCLKSource() != 0x04)
     {}
   }
   else
   { /* If HSE fails to start-up, the application will have wrong clock configuration.
       User can add here some code to deal with this error 
    如果HSE启动失败,应用将会有错误的时钟配置。用户可以在此添加以下代码来处理这个错误。
    */   

     /* Go to infinite loop */
     while (1)
     {}
   }
}

/**
  * @brief  Sets System clock frequency to 24MHz and configure HCLK, PCLK2 
  *         and PCLK1 prescalers. 
  * @param  None
  * @retval None
  */
void SetSysClockTo24(void)
{
   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
   /* RCC system reset(for debug purpose) */
   RCC_DeInit();

   /* Enable HSE */
   RCC_HSEConfig(RCC_HSE_ON);

   /* Wait till HSE is ready */
   HSEStartUpStatus = RCC_WaitForHSEStartUp();

   if (HSEStartUpStatus == SUCCESS)
   {
  #if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL
     /* Enable Prefetch Buffer */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

     /* Flash 0 wait state */
     FLASH_SetLatency(FLASH_Latency_0);
  #endif /* STM32F10X_LD_VL && STM32F10X_MD_VL */
 
     /* HCLK = SYSCLK */
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
     /* PCLK2 = HCLK */
     RCC_PCLK2Config(RCC_HCLK_Div1);

     /* PCLK1 = HCLK */
     RCC_PCLK1Config(RCC_HCLK_Div1);

  #ifdef STM32F10X_CL
     /* Configure PLLs *********************************************************/
     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
     RCC_PREDIV2Config(RCC_PREDIV2_Div5);
     RCC_PLL2Config(RCC_PLL2Mul_8);

     /* Enable PLL2 */
     RCC_PLL2Cmd(ENABLE);

     /* Wait till PLL2 is ready */
     while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
     {}

     /* PLL configuration: PLLCLK = (PLL2 / 10) * 6 = 24 MHz */ 
     RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div10);
     RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_6);
  #elif defined STM32F10X_LD_VL || defined STM32F10X_MD_VL || defined STM32F10X_HD_VL 
     /* PLLCLK = (8MHz/2) * 6 = 24 MHz */
     RCC_PREDIV1Config(RCC_PREDIV1_Source_HSE, RCC_PREDIV1_Div2);
     RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_6);
  #else
     /* PLLCLK = 8MHz * 3 = 24 MHz */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_3);
  #endif

     /* Enable PLL */ 
     RCC_PLLCmd(ENABLE);

     /* Wait till PLL is ready */
     while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
     {}

     /* Select PLL as system clock source */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

     /* Wait till PLL is used as system clock source */
     while (RCC_GetSYSCLKSource() != 0x08)
     {}
   }
   else
   {  /* If HSE fails to start-up, the application will have wrong clock configuration.
        User can add here some code to deal with this error */   

     /* Go to infinite loop */
     while (1)
     {}
   }
}
#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL
/**
  * @brief  Sets System clock frequency to 36MHz and configure HCLK, PCLK2 
  *         and PCLK1 prescalers. 
  * @param  None
  * @retval None
  */
void SetSysClockTo36(void)
{
   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
   /* RCC system reset(for debug purpose) */
   RCC_DeInit();

   /* Enable HSE */
   RCC_HSEConfig(RCC_HSE_ON);

   /* Wait till HSE is ready */
   HSEStartUpStatus = RCC_WaitForHSEStartUp();

   if (HSEStartUpStatus == SUCCESS)
   {
     /* Enable Prefetch Buffer */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

     /* Flash 1 wait state */
     FLASH_SetLatency(FLASH_Latency_1);
 
     /* HCLK = SYSCLK */
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
     /* PCLK2 = HCLK */
     RCC_PCLK2Config(RCC_HCLK_Div1);

     /* PCLK1 = HCLK */
     RCC_PCLK1Config(RCC_HCLK_Div1);

  #ifdef STM32F10X_CL
     /* Configure PLLs *********************************************************/
     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
     RCC_PREDIV2Config(RCC_PREDIV2_Div5);
     RCC_PLL2Config(RCC_PLL2Mul_8);

     /* Enable PLL2 */
     RCC_PLL2Cmd(ENABLE);

     /* Wait till PLL2 is ready */
     while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
     {}

     /* PLL configuration: PLLCLK = (PLL2 / 10) * 9 = 36 MHz */ 
     RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div10);
     RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
  #else
     /* PLLCLK = (8MHz / 2) * 9 = 36 MHz */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9);
  #endif

     /* Enable PLL */ 
     RCC_PLLCmd(ENABLE);

     /* Wait till PLL is ready */
     while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
     {}

     /* Select PLL as system clock source */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

     /* Wait till PLL is used as system clock source */
     while (RCC_GetSYSCLKSource() != 0x08)
     {}
   }
   else
   {  /* If HSE fails to start-up, the application will have wrong clock configuration.
        User can add here some code to deal with this error */   

     /* Go to infinite loop */
     while (1)
     {}
   }
}

/**
  * @brief  Sets System clock frequency to 48MHz and configure HCLK, PCLK2 
  *         and PCLK1 prescalers. 
  * @param  None
  * @retval None
  */
void SetSysClockTo48(void)
{
   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
   /* RCC system reset(for debug purpose) */
   RCC_DeInit();

   /* Enable HSE */
   RCC_HSEConfig(RCC_HSE_ON);

   /* Wait till HSE is ready */
   HSEStartUpStatus = RCC_WaitForHSEStartUp();

   if (HSEStartUpStatus == SUCCESS)
   {
     /* Enable Prefetch Buffer */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

     /* Flash 1 wait state */
     FLASH_SetLatency(FLASH_Latency_1);
 
     /* HCLK = SYSCLK */
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
     /* PCLK2 = HCLK */
      RCC_PCLK2Config(RCC_HCLK_Div1);

     /* PCLK1 = HCLK/2 */
     RCC_PCLK1Config(RCC_HCLK_Div2);

  #ifdef STM32F10X_CL
     /* Configure PLLs *********************************************************/
     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
     RCC_PREDIV2Config(RCC_PREDIV2_Div5);
     RCC_PLL2Config(RCC_PLL2Mul_8);

     /* Enable PLL2 */
     RCC_PLL2Cmd(ENABLE);

     /* Wait till PLL2 is ready */
     while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
     {}

     /* PLL configuration: PLLCLK = (PLL2 / 5) * 6 = 48 MHz */ 
     RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
     RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_6);
  #else
     /* PLLCLK = 8MHz * 6 = 48 MHz */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6);
  #endif

     /* Enable PLL */ 
     RCC_PLLCmd(ENABLE);

     /* Wait till PLL is ready */
     while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
     {}

     /* Select PLL as system clock source */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

     /* Wait till PLL is used as system clock source */
     while (RCC_GetSYSCLKSource() != 0x08)
      {}
   }
   else
   {  /* If HSE fails to start-up, the application will have wrong clock configuration.
        User can add here some code to deal with this error */   

     /* Go to infinite loop */
     while (1)
     {}
   }
}

/**
  * @brief  Sets System clock frequency to 56MHz and configure HCLK, PCLK2 
  *         and PCLK1 prescalers. 
  * @param  None
  * @retval None
  */
void SetSysClockTo56(void)
{
   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
   /* RCC system reset(for debug purpose) */
   RCC_DeInit();

   /* Enable HSE */
   RCC_HSEConfig(RCC_HSE_ON);

   /* Wait till HSE is ready */
   HSEStartUpStatus = RCC_WaitForHSEStartUp();

   if (HSEStartUpStatus == SUCCESS)
   {
     /* Enable Prefetch Buffer */
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

     /* Flash 2 wait state */
     FLASH_SetLatency(FLASH_Latency_2);
 
     /* HCLK = SYSCLK */
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
     /* PCLK2 = HCLK */
     RCC_PCLK2Config(RCC_HCLK_Div1);

     /* PCLK1 = HCLK/2 */
     RCC_PCLK1Config(RCC_HCLK_Div2);

  #ifdef STM32F10X_CL
     /* Configure PLLs *********************************************************/
     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
     RCC_PREDIV2Config(RCC_PREDIV2_Div5);
     RCC_PLL2Config(RCC_PLL2Mul_8);

     /* Enable PLL2 */
     RCC_PLL2Cmd(ENABLE);

     /* Wait till PLL2 is ready */
     while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
     {}

     /* PLL configuration: PLLCLK = (PLL2 / 5) * 7 = 56 MHz */ 
     RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
     RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_7);
  #else
     /* PLLCLK = 8MHz * 7 = 56 MHz */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_7);
  #endif

     /* Enable PLL */ 
     RCC_PLLCmd(ENABLE);

     /* Wait till PLL is ready */
     while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
     {}

     /* Select PLL as system clock source */
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

     /* Wait till PLL is used as system clock source */
     while (RCC_GetSYSCLKSource() != 0x08)
     {}
   }
   else
   {  /* If HSE fails to start-up, the application will have wrong clock configuration.
        User can add here some code to deal with this error */   

     /* Go to infinite loop */
     while (1)
     {}
   }
}

/**
  * @brief  Sets System clock frequency to 72MHz and configure HCLK, PCLK2 
  *         and PCLK1 prescalers. 
  * @param  None
  * @retval None
  */
void SetSysClockTo72(void)
{
   /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration -----------------------------*/   
   /* RCC system reset(for debug purpose) */
   /*Step1:将所有的RCC外设寄存器重设为默认值*/
 RCC_DeInit();

   /* Enable HSE */
 /*Step2:启用外部高速晶振(HSE)*/
   RCC_HSEConfig(RCC_HSE_ON);

   /* Wait till HSE is ready */
 /*Step3:等待,直到外部高速晶振稳定*/
   HSEStartUpStatus = RCC_WaitForHSEStartUp();

   if (HSEStartUpStatus == SUCCESS)
   {
     /* Enable Prefetch Buffer */
  /*Step4:设置预取指缓存使能*/
     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

     /* Flash 2 wait state */
  /*Step5:设置代码延时值,FLASH_Latency_2,2延时周期*/
     FLASH_SetLatency(FLASH_Latency_2);
 
     /* HCLK = SYSCLK */
  /*Step6:设置AHB时钟(HCLK)等于系统时钟*/
    //RCC_SYSCLK_Div1: AHB时钟 = 系统时钟
     RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
     /* PCLK2 = HCLK */
  /*Step7:设置高速APB2时钟(PCLK2)为系统时钟*/
    //RCC_HCLK_Div1: APB2时钟 = HCLK
     RCC_PCLK2Config(RCC_HCLK_Div1);

     /* PCLK1 = HCLK/2 */
  /*Step8:设置低速APB1时钟(PCLK1)为系统时钟的1/2.APB1时钟最高为36MHz*/
    //RCC_HCLK_Div2: APB1时钟 = HCLK/2
     RCC_PCLK1Config(RCC_HCLK_Div2);
  
  /*Step9:设置PLL时钟源及倍频系数,经PLL倍频后的最高时钟为72MHz*/
  #ifdef STM32F10X_CL//如果是互联型设备
     /* Configure PLLs *********************************************************/
     /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
     RCC_PREDIV2Config(RCC_PREDIV2_Div5);
     RCC_PLL2Config(RCC_PLL2Mul_8);

     /* Enable PLL2 */
     RCC_PLL2Cmd(ENABLE);

     /* Wait till PLL2 is ready */
     while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
     {}

     /* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */ 
     RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
     RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
  #else//如果是其他类型的设备
     /* PLLCLK = 8MHz * 9 = 72 MHz */
     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  #endif

     /* Enable PLL */
  /*Step10:使能PLL*/ 
     RCC_PLLCmd(ENABLE);

     /* Wait till PLL is ready */
  /*Step11:等待PLL初始化成功*/
     while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
     {}

     /* Select PLL as system clock source */
  /*Step12:设置PLL为系统时钟源(SYSCLK)*/
     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

     /* Wait till PLL is used as system clock source */
  /*Step13:等待PLL成功用于系统时钟的时钟源*/
    //0x00:HSI作为系统时钟
    //0x04:HSE作为系统时钟
    //0x08:PLL作为系统时钟
     while(RCC_GetSYSCLKSource() != 0x08)
     {}
   }
   else
   {  /* If HSE fails to start-up, the application will have wrong clock configuration.
        User can add here some code to deal with this error 
  如果HSE启动失败,应用将会有错误的时钟配置。用户可以在此添加以下代码来处理这个错误。
  */   

     /* Go to infinite loop */
     while (1)
     {}
   }
}

#endif /* STM32F10X_LD_VL && STM32F10X_MD_VL */

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

 

 

//////////////////////////////////////////////////////////////////////////////////////////////////////

                                      RCC_ClkConfig.H

//////////////////////////////////////////////////////////////////////////////////////////////////////

/**
 ** 文件名称:RCC_ClockConfig.H
 ** 功能描述:STM32系统时钟配置头文件声明
 ** 硬件平台:STM32F10X
 ** 编译环境:Keil uversion4 IDE
 ** 库版本  :v3.5.0
 ** 版本信息:v0.0
 ** 编写作者:ST Microcontroler
 ** 编写时间:2011-11-25
 ** 附加说明:无
 ** 修改记录:无
 **/

/* Define to prevent recursive inclusion (定义防止被递归包含)-----------------*/
#ifndef __RCC_CLOCKCONFIG_H
#define __RCC_CLOCKCONFIG_H
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Uncomment the line corresponding to the desired System clock (SYSCLK)
   frequency (after reset the HSI is used as SYSCLK source)
   去掉与想要设置的系统时钟频率一致的行的注释,不使用宏定义的方式来声明
   系统时钟频率,改为直接调用相应的函数来实现(2011-11-25) */
//#define SYSCLK_HSE
//#define SYSCLK_FREQ_24MHz
//#if !defined STM32F10X_LD_VL && !defined STM32F10X_MD_VL && !defined STM32F10X_HD_VL
//  //#define SYSCLK_FREQ_36MHz
//  //#define SYSCLK_FREQ_48MHz
//  //#define SYSCLK_FREQ_56MHz
//  #define SYSCLK_FREQ_72MHz
//#endif
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
//void SetSysClock(void);
void SetSysClockToHSE(void);
void SetSysClockTo24(void);
void SetSysClockTo36(void);
void SetSysClockTo48(void);
void SetSysClockTo56(void);
void SetSysClockTo72(void);

#endif /* __RCC_CLOCKCONFIG_H */

/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/

关键字:STM32  初学笔记  RCC 引用地址:STM32初学笔记1之RCC(上)

上一篇:c51中断/定时寄存器的典型运用程序
下一篇:STM32初学笔记5之ADC(下)

推荐阅读最新更新时间:2024-03-16 15:14

GPRS模块与STM32的数据传输
函数清单和注意事项 (底层驱动部分) 1. IO口初始化:控制 IO 和通讯 IO,控制包括电源控制,复位和低功耗模式,通讯就是串口啦,相信大家应该都很熟悉了。 当然在这个基础上还可以组合出复位的功能,复位在GPRS连接出错的时候会用到。 2. 串口初始化:模块的波特率为115200,8位数据位,1位停止位,没有校验位和流控。 串口还需要两个发送函数,发送一个字节和发送一串字符串的。串口中断处理函数放到后面说。 3. AT指令操作:发送AT指令 设置GPRS数据长度 发送GPRS数据内容 接收GPRS数据内容
[单片机]
STM32学习手记②-USART中断
/************************************ * 文件名: main.c * 内容简述: 本例程演示如何操作USART的接收程序(中断模式)。 * 用串口调试软件向开发板发送一字节,开发板会将该字节反发回PC */ #include stm32f10x_lib.h /*************************************************** * 函数名称 :void RCC_Configuration() * 功能描述 : 复位和时钟控制 配置 * 参数 : 无 * 返回值 : 无 * 全局变量 : 无 * 全局静态变量: 无 * 局部静态变量: 无 ***
[单片机]
关于STM32开发工具之STM Studio调试和诊断工具讲解
STM Studio这个工具出来很久了,可能很多人都没听说过。之前没写过,今天就写点关于STM Studio的内容。 1写在前面 针对 STM32 软件的开发工具有很多,从开篇图片也能看到,不知大家用过其中哪些工具? STM32软件开发工具地址: https://www.st.com/en/development-tools/stm32-software-development-tools.html 本文就重点讲述其中的一个工具:STM Studio. 2关于STM Studio STM Studio是通过实时读取和显示变量来帮助调试和诊断STM32应用程序。 STM Studio在PC上运行,通过标准的ST-LINK开发
[单片机]
关于<font color='red'>STM32</font>开发工具之STM Studio调试和诊断工具讲解
stm32USB设备的连接枚举过程
1) USB 的插入检测 当12脚短接,Q1截止,Q2导通,D+上拉,windows 就会认为 USB 接口有一个全速设备,马上复位总线,并开始枚举设备。 如果23脚短接,则 Q1状态取决于 USB-DISCONNECT(PD2)脚的状态。CPU 复位后,GPIO 引脚处于浮空输入状态。所以此时,Q1导通,Q2截止,主机检测不到设备。 在程序初始化了 USB 相关部分后,可以通过设置 PD2=0 低电平使 Q1截止, Q2导通。则 USB 检测到设备,开始枚举过程。 所以要控制开发板作为 USB 设备工作,必须23短接。 当12脚短接,Q1截止,Q2导通,D+上拉,windows 就会认为 USB 接口有一个全
[单片机]
stm32USB设备的连接枚举过程
STM32 自定义延时函数
在stm32调试过程中加入一个延时,有两种方式:一种是纯计数方式,另一种是使用系统计数器的方式。 现使用系统计数器产生中断的方式实现,查阅STM32的编程手册可知,STM32有一个24bit的系统计时器,并有STK_CTRL、STK_LOAD、STK_VAL、STK_CALIB寄存器供读写配置。 而CORTEX_M3有提供了一些函数可以供我们调用来控制这几个寄存器。 在编写延时函数时需要的库函数: /** brief System Tick Configuration details Initializes the System Timer and its interrupt, and sta
[单片机]
<font color='red'>STM32</font> 自定义延时函数
STM32入门学习之USART中断(STM32F030F4P6基于CooCox IDE)
#include stm32f0xx.h #include stm32_lib/inc/stm32f0xx_rcc.h #include stm32_lib/inc/stm32f0xx_gpio.h #include stm32_lib/inc/stm32f0xx_usart.h #include stm32_lib/inc/stm32f0xx_misc.h #include delay.h int main(void) { //1、使能时钟 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2P
[单片机]
基于STM32的危险品运输系统
一.系统设计 本次设计的是基于STM32F103C8T6单片机设计的一款 危险品运输,系统内有DHT11采集车内温湿度,气压传感器采集气压,adxl345计数模块采集震动次数 , lcd1602显示温湿度,气压值,震动次数 ,同时还有ESP8266将数据传输到one,在one端可以显示,温湿度,气压值,震动次数。 图1 系统框图 二.硬件设计 系统内的主要电路有单片机最小系统电路,气压检测电路、温湿度检测电路、震动检测电路、显示电路、无线通信电路、电源电路等。 图2 硬件电路 三.软件设计 系统的软件逻辑清晰,首先先进行一次系统初始化,此时就开始进行温湿度检测和压力检测以及震动计数,将数据现在显示屏上进行显示,再将数据上传
[单片机]
基于<font color='red'>STM32</font>的危险品运输系统
基于STM32 MCU应用的EMC指南之软件篇
在基于微控制器的电子系统中,强壮的软件设计是提高 EMC 性能的主要因素。必须尽量在项目设计阶段的早期考虑 EMC 干扰导致的问题。EMC 导向的软件提高了应用的安全性和可靠性。强化 EMC 性能的软件的实施成本低,可提高最终的抗扰性能,并节约硬件和开发成本。用户应考虑到模拟或数字数据受到的 EMC 干扰,就像任何其它应用参数一样。 EMC 干扰导致的问题示例: 微控制器无响应 程序计数器失控 执行意外指令 地址指向错误 子程序执行错误 寄生复位和 / 或寄生中断 IP 配置损坏 I/O 失灵 软件故障的后果示例: 产品意外响应 上下文丢失 进程中的意外分支 中断丢失 数据完整性缺失 输入值误读 01使用看门狗或时间控制 为了
[单片机]
基于<font color='red'>STM32</font> MCU应用的EMC指南之软件篇
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved