0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【合宙Air105开发板试用体验】Air105的时钟和延迟函数

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-12-02 11:25 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文来源电子发烧友社区,作者:Michael, 帖子地址:https://bbs.elecfans.com/jishu_2287602_1_1.html

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 的库函数https://gitee.com/iosetting/air105_project

寄存器

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

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


  1. #define AIR105_FLASH_BASE (0x01000000UL) /*!< (FLASH     ) Base Address */
  2. #define AIR105_SRAM_BASE (0x20000000UL) /*!< (SRAM      ) Base Address */
  3. #define AIR105_PERIPH_BASE (0x40000000UL) /*!< (Peripheral) Base Address */
  4. #define AIR105_AHB_BASE (AIR105_PERIPH_BASE)
  5. #define AIR105_APB0_BASE (AIR105_PERIPH_BASE + 0x10000)
  6. #define SYSCTRL_BASE (AIR105_APB0_BASE + 0xF000)
复制代码


SYSCTRL_BASE

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

时钟振荡源

振荡源选择


  1. SYSCTRL_SYSCLKSourceSelect(SELECT_EXT12M);
复制代码

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


  1. void SYSCTRL_SYSCLKSourceSelect(SYSCLK_SOURCE_TypeDef source)
  2. {
  3. assert_param(IS_SYSCLK_SOURCE(source));
  4. switch (source)
  5. {
  6. case SELECT_EXT12M:
  7. // FREQ_SEL 是一个32bit的寄存器, 先与补码(清零第12位), 然后写入值(0)
  8. SYSCTRL->FREQ_SEL = ((SYSCTRL->FREQ_SEL & (~SYSCTRL_FREQ_SEL_CLOCK_SOURCE_Mask)) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_EXT);
  9. break;
  10. case SELECT_INC12M:
  11. // 先与补码(清零第12位), 然后写入值(1)
  12. SYSCTRL->FREQ_SEL = ((SYSCTRL->FREQ_SEL & (~SYSCTRL_FREQ_SEL_CLOCK_SOURCE_Mask)) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_INC);
  13. break;
  14. }
  15. }
复制代码


时钟频率

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


  1. void SystemClock_Config_HSI(void)
  2. {
  3. // 设置CPU频率, 直接选择, 不需要计算
  4. SYSCTRL_PLLConfig(SYSCTRL_PLL_204MHz);
  5. // 分频后产生 FCLK -> 这是主程序的时钟
  6. SYSCTRL_PLLDivConfig(SYSCTRL_PLL_Div_None);
  7. // 分频产生 HCLK, 如果 FCLK > 102MHz 则无论如何设置, 都会被二分频
  8. SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div2);
  9. // 分频产生 PCLK -> 这是大部分外设的时钟
  10. SYSCTRL_PCLKConfig(SYSCTRL_PCLK_Div2);
  11. QSPI_SetLatency((uint32_t)0);
  12. }
复制代码


PLL分频的选项



  1. #define SYSCTRL_PLL_Div_None ((uint32_t)0x00)
  2. #define SYSCTRL_PLL_Div2 ((uint32_t)0x01)
  3. #define SYSCTRL_PLL_Div4 ((uint32_t)0x10)
复制代码


设置 SysTick



  1. void Delay_Init(void)
  2. {
  3. SYSCTRL_ClocksTypeDef clocks;
  4. SYSCTRL_GetClocksFreq(&clocks);
  5. SysTick_Config(clocks.CPU_Frequency / 1000000); ///< 1us
  6. }
复制代码


调用 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个小时后会溢出, 所以这里有一个延迟的极限.



  1. void SysTick_Handler(void)
  2. {
  3. g_current_tick++;
  4. }
复制代码


延迟函数

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


  1. uint32_t get_diff_tick(uint32_t cur_tick, uint32_t prior_tick)
  2. {
  3. if (cur_tick < prior_tick)
  4. {
  5. // 如果当前值比前值还小, 说明发生了溢出, 用当前值加上原值取反(即原值离溢出的距离)
  6. return (cur_tick + (~prior_tick));
  7. }
  8. else
  9. {
  10. return (cur_tick - prior_tick);
  11. }
  12. }
复制代码


延迟函数


  1. void Delay_us(uint32_t usec)
  2. {
  3. uint32_t old_tick;
  4. old_tick = g_current_tick;
  5. while (get_diff_tick(g_current_tick, old_tick) < usec);
  6. }
  7. void Delay_ms(uint32_t msec)
  8. {
  9. uint32_t old_tick;
  10. old_tick = g_current_tick;
  11. while (get_diff_tick(g_current_tick, old_tick) < (msec * 1000));
  12. }
复制代码


代码

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

可以使用Keil5 MDK 直接打开 Demos 目录下的示例项目, 与Air105开发板接线参考前一篇合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 合宙通信
    +关注

    关注

    0

    文章

    148

    浏览量

    2380
  • Air105
    +关注

    关注

    0

    文章

    48

    浏览量

    424
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    实战Air780EPM:构建4G共享网关,服务WiFi与有线设备!

    通过Air780EPM开发板,我们可以轻松实现4G网络作为数据出口,为周边的WiFi设备和以太网设备提供互联网共享,适用于移动办公、远程部署等场景。 一、多网融合概述   Air780EPM
    的头像 发表于 09-30 16:03 874次阅读
    实战<b class='flag-5'>Air</b>780EPM:构建4G共享网关,服务WiFi与有线设备!

    以太网数传轻松实现:Air8101+Air ETH_1000的完美搭档

    Air8101核心搭配Air ETH_1000以太网小板,可快速实现设备与以太网网络的连接,为数据实时上传、远程控制等功能提供坚实硬件基础。 本文特别分享AirETH_1000+Air
    的头像 发表于 09-04 14:25 287次阅读
    以太网数传轻松实现:<b class='flag-5'>Air8101+Air</b> ETH_1000的完美搭档

    Air8101多网融合战略升级:Air780EPM模块助力4G联网落地

    应用迈向新高度。 本文将分享Air8101核心通过外挂Air780EPM整机开发板,实现4G联网的功能示例。   一、硬件准备工作   1.1  所需硬件
    的头像 发表于 06-23 16:53 366次阅读
    <b class='flag-5'>Air</b>8101多网融合战略升级:<b class='flag-5'>Air</b>780EPM模块助力4G联网落地

    基于RK3576处理器,米尔RK3576开发板免费试用

    年7月19日   评测数量: 3块   更多热点文章阅读 基于平头哥TH1520芯片,润开鸿HH-SCDAYU800A开发板免费试用 RISC-V开发板深度评测!顶级开发板免费
    的头像 发表于 06-09 15:00 931次阅读
    基于RK3576处理器,米尔RK3576<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>

    多功能+高扩展能力加持,Air8000开发板最新资料

    开发者福利来袭!Air8000开发板兼具全面功能与强大扩展性的开发神器,将让物联网开发、原型设计等任务更高效,加速项目从概念到产品的转化。
    的头像 发表于 06-09 14:18 510次阅读
    多功能+高扩展能力加持,<b class='flag-5'>Air</b>8000<b class='flag-5'>开发板</b>最新资料

    基于RK处理器,创龙TL3562-MiniEVM开发板试用体验

    数量: 10块   更多热点文章阅读 基于平头哥TH1520芯片,润开鸿HH-SCDAYU800A开发板免费试用 RISC-V开发板深度评测!顶级开发板免费
    的头像 发表于 06-05 16:31 915次阅读
    基于RK处理器,创龙TL3562-MiniEVM<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>体验

    性能强悍!合众HZ-RK3568开发板试用体验

    月19日   评测数量: 10块   更多热点文章阅读 基于平头哥TH1520芯片,润开鸿HH-SCDAYU800A开发板免费试用 RISC-V开发板深度评测!顶级开发板免费
    的头像 发表于 06-05 16:30 1105次阅读
    性能强悍!合众HZ-RK3568<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>体验

    有奖丨米尔 NXP i.MX91开发板免费试用来啦

    米尔与NXP合作发布的新品基于NXPi.MX91应用处理器的MYD-LMX91开发板免费试用名额来啦~~米尔提供了3套价值588元的MYD-LMX91开发板发起试用活动您不仅可以免费体
    的头像 发表于 06-05 08:02 1116次阅读
    有奖丨米尔 NXP i.MX91<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>来啦

    技术篇——Air8000开发板,一站式满足多功能高扩展开发需求!

    对于追求高效开发的你来说,Air8000开发板最新资料库的开放绝对不容错过。无论是智能控制、数据采集还是多场景应用开发,其多功能内核与高扩展接口,为各类项目提供“即插即用”式的解决方案
    的头像 发表于 06-04 15:59 443次阅读
    技术篇——<b class='flag-5'>Air</b>8000<b class='flag-5'>开发板</b>,一站式满足多功能高扩展<b class='flag-5'>开发</b>需求!

    【评测试用】合众HZ-T536开发板免费试用体验

    【评测试用】合众HZ-T536开发板免费试用体验
    的头像 发表于 05-27 08:05 689次阅读
    【评测<b class='flag-5'>试用</b>】合众HZ-T536<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>体验

    Air8101革新物联网配网:AirKiss方案让设备连接更智能!

    Air8101开发板AirKiss配网示例  下文以Air8101开发板为例,演示AirKiss配网实操要点。 此配网方式极为简单,使用示例源码将
    的头像 发表于 05-26 13:12 518次阅读
    <b class='flag-5'>Air</b>8101革新物联网配网:AirKiss方案让设备连接更智能!

    免费丨米尔 STM32MP257开发板有奖试用

    米尔与ST合作发布的新品基于STM32MP257应用处理器的MYD-LD25X开发板免费试用活动来啦~~米尔提供了2块价值488元的MYD-LD25X开发板发起试用活动您不仅可以免费
    的头像 发表于 03-20 08:05 885次阅读
    免费丨米尔 STM32MP257<b class='flag-5'>开发板</b>有奖<b class='flag-5'>试用</b>

    有奖试用!!RA-Eco-RA4M2-100PIN-V1.0开发板试用活动报名

    RA-Eco-RA4M2-100PIN-V1.0开发板试用活动
    的头像 发表于 03-13 12:10 826次阅读
    有奖<b class='flag-5'>试用</b>!!RA-Eco-RA4M2-100PIN-V1.0<b class='flag-5'>开发板</b><b class='flag-5'>试用</b>活动报名

    Air8000工业引擎:多IO多功能,即将量产

    科技近日宣布,其工业引擎Air8000即将进入量产阶段。这款引擎集成了4G、Wi-Fi、BLE、GNSS、Gsensor及电源管理等多项功能,专为工业应用而设计,展现了强大的场景解决能力
    的头像 发表于 01-07 14:56 2888次阅读

    短消息(sms)解析 Air724UG低功耗模组软件指南

    本指南教你如何用 Air724 开发板,使用 sms 功能,并通过日志观察实验结果。
    的头像 发表于 12-11 09:28 1303次阅读
    短消息(sms)解析  <b class='flag-5'>Air</b>724UG低功耗模组软件指南