通过改变RCC_HSECR寄存器中的HSETUNE[5:0]位域的值来校准HSE的输出频率

1、将HSE时钟配置为MCO模式输出到PA8引脚

HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);

2、改变RCC_HSECR寄存器中的HSETUNE[5:0]位域的值(0-63)

LOOP((0<=p_otp->hse_tuning<=63):

__HAL_RCC_HSE_CONFIG(RCC_HSE_OFF);

while (LL_RCC_HSE_IsReady());

LL_RCC_HSE_SetCapacitorTuning(p_otp->hse_tuning);

__HAL_RCC_HSE_CONFIG(RCC_HSE_ON);

while (LL_RCC_HSE_IsReady());

通过不断改变p_otp->hse_tuning的值调整HSE的时钟频率直到PA8引脚上的时钟信号满足要求

3、保存HSETUNE[5:0]位域的值,将校准后的值保存在OTP区

#ifdef __GNUC__
typedef struct __attribute__((packed))
#else
typedef __packed struct
#endif
{
  uint8_t additional_data[6]; /*!< 48 bits of data to fill OTP slot (e.g: BD or MAC address, key..) */
  uint8_t hse_tuning;         /*!< Load capacitance to be applied on HSE pad */
  uint8_t index;              /*!< Structure index */
} OTP_DATA_t;

OTP_DATA_t otp_data;

memcpy(otp_data.additional_data, (void*)ADDITIONAL_DATA_PTR, 6);
otp_data.hse_tuning = val & 0x3F;
otp_data.index = OTP_HSE_STR_IDX;

idx = GetOTPFreeIdx();

/* Store OTP structure in OTP area */
 __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_ALL_ERRORS); /* Clear all Flash flags before write operation*/
   
  err = HAL_FLASH_Unlock();
  err |= HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, STORE_ADDRESS + idx, *(uint64_t*) (&otp_data));
  err |= HAL_FLASH_Lock();
  if (err != HAL_OK) {
    ErrorHandler();
  }
4、校准完成后重新上电获取OTP保存的值并写入HSETUNE[5:0]位域,以后HSE输出的时钟就是校准后的精确时钟
  int32_t idx;
  OTP_DATA_t *potp_data;
  /* Get last calibration index in OTP area
  * if idx<0 it means that no structure with idx=OTP_HSE_STR_IDX has been found in OTP;
  * => so calibration is not done yet
  */
  idx = CheckOTPIndex(OTP_HSE_STR_IDX);
  if (idx >= 0)
  {
    potp_data = (OTP_DATA_t *) (STORE_ADDRESS + idx);
    /* load capacitance value is then set in HSE config register */
    LL_RCC_HSE_SetCapacitorTuning(potp_data->hse_tuning);
    return (HAL_OK);
  }
  else
  {
    return (HAL_ERROR);
  }

当校准之后后续程序启动就只有第4步骤,前123步骤是校准时候需要做的

STM32WB HSE校准的更多相关文章

  1. HTML 5 背离贪吃蛇 写成了类似于屏幕校准

    中间写了改 改了写 还是没做出自己满意的效果 ,看来自己的确不是一个走前端的料子.当然h5还是学一点好一点 具体说来 就是 在canvas 的画布中 鼠标点击后画上一个圆形 然后就有随机的在画布上面出 ...

  2. 【5集iCore3_ADP演示视频】5-5 iCore3应用开发平台示波器和信号源校准

    iCore3双核心应用开发平台基于iCore3双核心板,包含ARM.FPGA.7寸液晶屏.双通道数字示波器.任意波发生器.电压表等模块,是一款专为电子爱好者设计的综合性电子学习系统. [视频简介]本视 ...

  3. 【5集iCore3_ADP演示视频】5-3 iCore3应用开发平台摸校准

    iCore3双核心应用开发平台基于iCore3双核心板,包含ARM.FPGA.7寸液晶屏.双通道数字示波器.任意波发生器.电压表等模块,是一款专为电子爱好者设计的综合性电子学习系统. [视频简介]本视 ...

  4. 服务端性能测试校准v1.2

    服务端性能测试工具校验v1.2 想知道压力工具实际并发多少,想知道压力工具统计响应数据准不准,来试试这款校准工具. 更新说明: 1.修正总接收请求显示上限. 2.随着响应时间增加,自动增加处理线程. ...

  5. Processing 电子罗盘校准(以 MPU9250为例)

    使用Processing 软件, 通过 arduino 输入 电子罗盘的数据,通过PC端进行校准,程序如下: import processing.serial.*; Serial myPort; Ar ...

  6. STM32的晶振跟HSE外部时钟设置.

    void RCC_Configuration(void){  /* RCC system reset(for debug purpose) */  RCC_DeInit(); /* Enable HS ...

  7. linux校准时间

    Linux下ntpdate时间同步 Ntp服务器安装配置 ntp(Network Time Protocol)协议 RedHat服务器可以下载rpm安装包,然后执行# rpm -ivh ntp-4.2 ...

  8. ANDROID5.0触摸屏校准

    1.校准原理: 1)首先生成校准用的参数,可以适用tslib生成校准参数,也可以使用校准app生成:使用校准app进行校准对使用者要求比较低,使用者可以不用学习复杂的命令:本文使用app方式 2)生成 ...

  9. s3c6410学习笔记-将内核zImage、文件系统写到nandflash、屏幕校准

    1.之前已经将uboot写到nandflash里面了,接下来将内核zImage.文件系统写到nandflash. 2.编译内核 cd linux-2.6.28_smdk6410 make clean ...

随机推荐

  1. COALESCE关键字的使用

    COALESCE是sql标准里面的一个关键字,我们可以和聚合函数sum,count,max等一起使用完成一些特殊的功能. 以下sql语句基于mysql 1.查询某一个列总和,如果没有数据或者NULL返 ...

  2. loadrunner脚本因为没有token报错

    目录 场景 解决过程 解决方案 总结 场景 用loadrunner11录制脚本,处理后回放,加上检查点,报错找不到检查点对应的内容,去掉检查点,没有报错,但是打开页面没有该操作的痕迹.手动在页面上操作 ...

  3. 【Web网站服务器开发】Apache 和 Tomcat的区别及配置

    Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.JSP.Perl等开发过程中,需要准确掌握其各自特点,选择最佳的服务器配置. apache是web服 ...

  4. openresty+lua+kafka方案与Tomcat接口并发度对比分析

    1.openresty+lua+kafka 1.1 openresty+lua+kafka方案 之前的项目基于nginx反向代理后转发到Tomcat的API接口进行业务处理,然后将json数据打入ka ...

  5. lua调用shell 脚本

    Lua中,os.execute可以执行dos命令,但是返回的是系统状态码,默认输出.io.popen()也可以执行dos命令,但是返回一个文件.eg: 复制代码 代码如下: local t = io. ...

  6. 网络流三大算法【邻接矩阵+邻接表】POJ1273

    网络流的基本概念跟算法原理我是在以下两篇博客里看懂的,写的非常好. http://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html http://www.cnb ...

  7. Linux下的I/O复用与epoll详解(转载)

    Linux下的I/O复用与epoll详解 转载自:https://www.cnblogs.com/lojunren/p/3856290.html  前言 I/O多路复用有很多种实现.在linux上,2 ...

  8. Java实现链队

    一.分析 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.允许插入的一端称为队尾,允许删除的一端称为队头. 链队是指采用链式存储结构实现的队列,它的基本操作如下: 1.初始 ...

  9. 如何给django admin.py配置超级管理员?注册表格?

    admin.py是django给我们提供的功能非常强大的后台,况且支持拓展,,如果你要是觉得admin的后台不够牛逼你可以自己写一个!如何自己写一个后台,后面我有时间了会给大家更新!一起学习!一起进步 ...

  10. JSON函数表2

    [class] Json::Reader [public] [将字符串或者输入流转换为JSON的Value对象] bool parse( const std::string &document ...