目录

Air105 的时钟

高频振荡源

  • 芯片支持使用内部振荡源, 或使用外置12MHz晶体

    • 芯片上电复位后 ROM boot 启动过程基于内部12MHz的振荡器
    • 芯片内部集成的12MHz振荡源精度为±2%, 精度一般
    • 使用外置12MHz晶体, 需要软件切换
  • 经过PLL倍频后为系统提供输入
  • 倍频后的PLL时钟频率可通过寄存器进行配置,可选频率为:108MHz, 120MHz, 132MHz, 144MHz, 156MHz, 168MHz, 180MHz, 192MHz, 204MHz

分频结构

  • PLL_CLK

    • 外部 XTAL12M 或 内部 OSC12M -> 直通, 或PLL产生 108MHz - 204MHz
  • FCLK / CPU_CLK
    • PLL_CLK -> 2bit分频(0, 2分频, 4分频) -> FCLK
    • FCLK就是主程序循环的时钟
  • HCLK
    • FCLK -> 1bit分频(默认=1, 2分频) -> HCLK
    • 当 FCLK 小于 102MHz 时不分频, 否则2分频
  • PCLK
    • HCLK -> 1bit分频(默认=0, 不分频) -> PCLK (外设频率)
    • PCLK 是大部分外设 TIMER, ADC, SPI, WDT, GPIO, I2C, UART 的时钟
  • QSPI
    • FCLK -> 3bit分频(默认=3, 4分频) -> QSPI

低频振荡源

  • 芯片安全区基于内部32KHz,RTC默认基于内部OSC 32K, 使用外部XTAL 32K需要软件切换
  • 支持内部或外部32KHz输出

时钟结构

  • (外部或内部 32K RTC OSC) -> SYSTICK
  • 内部 32K OSC -> Security

时钟设置

以下代码基于 air105_project 的库函数

寄存器

寄存器手册 Air105芯片数据手册_1.1.pdf

寄存器的基础地址, 定义在 air105.h

#define AIR105_FLASH_BASE                       (0x01000000UL)                /*!< (FLASH     ) Base Address */
#define AIR105_SRAM_BASE (0x20000000UL) /*!< (SRAM ) Base Address */
#define AIR105_PERIPH_BASE (0x40000000UL) /*!< (Peripheral) Base Address */ #define AIR105_AHB_BASE (AIR105_PERIPH_BASE)
#define AIR105_APB0_BASE (AIR105_PERIPH_BASE + 0x10000) #define SYSCTRL_BASE (AIR105_APB0_BASE + 0xF000)

SYSCTRL_BASE

  • 地址 = 外设基础地址 0x40000000UL + APB0 偏移 0x10000 + SYSCTRL 偏移 0xF000
  • 范围 [0x4001_F000, 0x4001_FFFF]

时钟振荡源

振荡源选择

SYSCTRL_SYSCLKSourceSelect(SELECT_EXT12M);

12MHz 时钟来源选择: 0:片外 XTAL, 1:片内 OSC

void SYSCTRL_SYSCLKSourceSelect(SYSCLK_SOURCE_TypeDef source)
{
assert_param(IS_SYSCLK_SOURCE(source)); switch (source)
{
case SELECT_EXT12M:
// FREQ_SEL 是一个32bit的寄存器, 先与补码(清零第12位), 然后写入值(0)
SYSCTRL->FREQ_SEL = ((SYSCTRL->FREQ_SEL & (~SYSCTRL_FREQ_SEL_CLOCK_SOURCE_Mask)) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_EXT);
break; case SELECT_INC12M:
// 先与补码(清零第12位), 然后写入值(1)
SYSCTRL->FREQ_SEL = ((SYSCTRL->FREQ_SEL & (~SYSCTRL_FREQ_SEL_CLOCK_SOURCE_Mask)) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_INC);
break;
}
}

时钟频率

设置使用默认的内部时钟HSI(Internal clock)

void SystemClock_Config_HSI(void)
{
// 设置CPU频率, 直接选择, 不需要计算
SYSCTRL_PLLConfig(SYSCTRL_PLL_204MHz);
// 分频后产生 FCLK -> 这是主程序的时钟
SYSCTRL_PLLDivConfig(SYSCTRL_PLL_Div_None);
// 分频产生 HCLK, 如果 FCLK > 102MHz 则无论如何设置, 都会被二分频
SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div2);
// 分频产生 PCLK -> 这是大部分外设的时钟
SYSCTRL_PCLKConfig(SYSCTRL_PCLK_Div2);
QSPI_SetLatency((uint32_t)0);
}

PLL分频的选项

#define SYSCTRL_PLL_Div_None                       ((uint32_t)0x00)
#define SYSCTRL_PLL_Div2 ((uint32_t)0x01)
#define SYSCTRL_PLL_Div4 ((uint32_t)0x10)

设置 SysTick

void Delay_Init(void)
{
SYSCTRL_ClocksTypeDef clocks; SYSCTRL_GetClocksFreq(&clocks);
SysTick_Config(clocks.CPU_Frequency / 1000000); ///< 1us
}

调用 SysTick_Config 将单个 SysTick 设置为 1 us.

也可以直接使用SYSCTRL->HCLK_1MS_VAL * 2 / 1000这个变量代表了当前时钟配置下, 1ms需要的HCLK时钟周期, 根据当前FCLK是否大于108MHz 确定是否要乘以2.

之后就会每隔1us调用 SysTick_Handler(void), 在这里设置 32bit g_current_tick 递增, 可以用于延时控制. 因为32bit数的限制, 1.2个小时后会溢出, 所以这里有一个延迟的极限.

void SysTick_Handler(void)
{
g_current_tick++;
}

延迟函数

为避免溢出造成的延迟错误, 需要做一个判断

uint32_t get_diff_tick(uint32_t cur_tick, uint32_t prior_tick)
{
if (cur_tick < prior_tick)
{
// 如果当前值比前值还小, 说明发生了溢出, 用当前值加上原值取反(即原值离溢出的距离)
return (cur_tick + (~prior_tick));
}
else
{
return (cur_tick - prior_tick);
}
}

延迟的函数

void Delay_us(uint32_t usec)
{
uint32_t old_tick; old_tick = g_current_tick;
while (get_diff_tick(g_current_tick, old_tick) < usec);
} void Delay_ms(uint32_t msec)
{
uint32_t old_tick; old_tick = g_current_tick;
while (get_diff_tick(g_current_tick, old_tick) < (msec * 1000));
}

代码

代码地址: https://gitee.com/iosetting/air105_project

可以使用Keil5 MDK 直接打开 Demos 目录下的示例项目, 与Air105开发板接线参考前一篇合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试

合宙AIR105(二): 时钟设置和延迟函数的更多相关文章

  1. 合宙AIR105(三): 定时器, 定时器中断和PWM输出

    目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 Ai ...

  2. 合宙AIR105(四): SPI, MAX7219 8x8LED驱动

    目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 合宙 ...

  3. 合宙AIR105使用Keil MDK + DAP-Link 烧录和调试

    关于AIR105 AIR105是合宙LuatOS生态下的一款芯片, 1月初上市, 开发板与摄像头一起搭售(赠送). 从配置信息看, 芯片性能相当不错: Cortex-M4F内核, 最高频率204Mhz ...

  4. 合宙Luat | 一文读懂LuaTask延时,看我如何从《射雕英雄传》角度分析。

    武侠小说中,主人公之所以能纵横江湖,常常离不开一样可遇不可求的绝世法宝--武功秘籍.如今勇于尝试的开发者,笃定地告诉后来者:选Luat二次开发,就如同拥有了物联网开发的武功秘籍. 本期让我们通过< ...

  5. 合宙Luat | Cat.1 Socket数据收不到?学会两招不掉线

    1 服务器收不到Socket数据的原因 Socket是大家使用Cat.1模块常用的功能之一,但Cat.1模块不是直接跟服务器连接,而是通过NAT(即网络地址转换)与服务器连接. 一个会话建立后会在NA ...

  6. 合宙模块AT相关资料汇总

    1. 目录 1. 目录 [2. 新手教程](#2. 新手教程) [3. 产品资料](#3. 产品资料) 3.1 [2G模块(GPRS / GPRS+GNSS)](#3.1 2G模块(GPRS / GP ...

  7. 合宙模块LUA相关资料汇总

    1. 目录 1. 目录 [2. LUA二次开发](#2. LUA二次开发) 2.1 [新手教程](#2.1 新手教程) 2.2 [进阶教程](#2.2 进阶教程) 2.3 [LUA开发环境](#2.3 ...

  8. stm32定时器学习二——PWM设置

    /* STM32 嵌入式学习入门(5)——PWM的实现 上一篇博文介绍了定时器和PWM的基本的原理,本篇博文从代码层面来介绍PWM的具体实现.同样,还是以博主所用的开发板——正点原子开发板STM32F ...

  9. STM32的系统时钟设置SystemClock_Config()探究

    一.首先了解几个硬件名词: stm32有多种时钟源,为HSE.HSI.LSE.LSI.PLL,对于L系统的,还有一个专门的MSI 1.HSE是高速外部时钟,一般8M的晶振,精度比较高,比较稳定. 2. ...

随机推荐

  1. JAVASE Scanner

    package com.huang.boke.flowPath;import java.util.Scanner;public class test01 { public static void ma ...

  2. 在uniapp的节流函数

    为了解决同一个人连续多次的点击同一个事件会造成的问题,js解决的方法有防抖和节流,防抖和节流都是在一定的时间上控制次数 节流是在定义的时间内连续点击多次事件,只会执行一次 在uniapp的工具文件夹u ...

  3. python---运算符和编码

    格式化输出 在输出数据时,会有用户需要输入的信息被输出,没办法预先知道,这就需要使用格式化输出.先在相应位置放置一个占位符,再把字符串里的占位符与外部的变量做个映射关系. name = input(& ...

  4. windows10家庭版启用组策略gpedit.msc

    启用组策略gpedit.msc 家庭版很多功能不能使用,凑巧用的就是家庭版. 还想使用gpedit.msc来关闭windows10的更新. 找到一个可行的方法. 需要创建一个脚本. 如果你没有编辑器, ...

  5. Spring Authorization Server授权服务器入门

    11月8日Spring官方已经强烈建议使用Spring Authorization Server替换已经过时的Spring Security OAuth2.0,距离Spring Security OA ...

  6. golang内存对齐分析(转载)

    问题 type Part1 struct { a bool b int32 c int8 d int64 e byte } 在开始之前,希望你计算一下 Part1 共占用的大小是多少呢? func m ...

  7. C#二次开发BIMFACE系列60 File Management文件管理服务及应用场景

    系列目录     [已更新最新开发文章,点击查看详细] 在我的博客<C#二次开发BIMFACE系列>教程中详细介绍了如何注册BIMFACE.测试.封装服务器端接口并提供了丰富的Demo.视 ...

  8. 通过Nginx TCP反向代理实现Apache Doris负载均衡

    概述 Nginx能够实现HTTP.HTTPS协议的负载均衡,也能够实现TCP协议的负载均衡.那么,问题来了,可不可以通过Nginx实现Apache Doris数据库的负载均衡呢?答案是:可以.接下来, ...

  9. 关于openstreet map的osm文件转shp文件方法(附arcgis10.2插件)

    一.下载并安装对应arcgis版本的osm插件 对应arcgis版本的osm转换插件在arcgis官网可以下载 http://www.arcgis.com/home/search.html?q=Arc ...

  10. 如何在同一Linux服务器上创建多站点

    在没有域名的情况下,怎样才能创建出多站点访问?这个问题困扰我许久,之后阅读了<http权威指南>,这本让我恍然大悟.这里说明了从浏览器如何解析域名,再请求服务器,服务器收到请求后是如何处理 ...