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

    文章

    120

    浏览量

    1541
  • Air105
    +关注

    关注

    0

    文章

    48

    浏览量

    270
收藏 人收藏

    评论

    相关推荐

    芯圣SDK工具,让开发更方便——SDK-HC89S105A

    SDK-HC89S105A是基于HC89S105A设计的快速开发工具。SDK-HC89S105A由HC89S105A微控制器的主控板和HC-
    的头像 发表于 01-17 09:42 188次阅读
    芯圣SDK工具,让<b class='flag-5'>开发</b>更方便——SDK-HC89S<b class='flag-5'>105</b>A

    基于合宙Air001的迷你RGB灯环

    问题来了,你会亲手做来送给最爱的TA吗?基于合宙Air001的迷你RGB灯环-开源分享-本项目以合宙Air001系列MCU为主控芯片,使用KeilMDK开发,实现按
    的头像 发表于 11-25 08:04 691次阅读
    基于合宙<b class='flag-5'>Air</b>001的迷你RGB灯环

    STM32f105时钟初始化之后,delay函数时间不对是怎么回事?

    STM32f105时钟初始化之后,delay函数时间不对
    发表于 09-26 06:28

    合宙Air001创意DIY——自制炫酷“地球名片”

    合宙Air001开发板近期火爆出圈,那么超值套餐里的Air001芯片可以做什么呢?今天特别分享@灰太狼烤着吃大佬开源新作:地球名片——基于合宙Air001芯片,以地球为主题设计的一款具
    的头像 发表于 08-26 08:05 1234次阅读
    合宙<b class='flag-5'>Air</b>001创意DIY——自制炫酷“地球名片”

    Air001在Arduino下的测试IIC工程

    本帖最后由 大懒猫54 于 2023-8-23 11:57 编辑 测试使用Air001开发板,使用PF0,PF1对应的IIC接口,测试0.96英寸的OLED。下载器使用
    发表于 08-23 11:56

    kcu105开发板配置flashxip模式,未能识别flash device怎么解决?

    系统:win10_64 IDE版本:2022.01 开发板:kcu105 问题:外接qspi flash,进行qspi测试。配置flashxip模式,未能识别flash device(ps:ilm测试正常)。报错如下:
    发表于 08-12 06:46

    合宙Air001开发板——支持Arduino开发,国产MCU新热潮

    包装炸裂、价格便宜、支持Arduino开发——点燃国产MCU新热潮的合宙Air001,开发板补货终于到了!!!合宙Air001开发板、芯片、
    的头像 发表于 08-01 00:12 3502次阅读
    合宙<b class='flag-5'>Air</b>001<b class='flag-5'>开发板</b>——支持Arduino<b class='flag-5'>开发</b>,国产MCU新热潮

    补货到!合宙Air001开发板——支持Arduino开发,国产MCU新热潮

    包装炸裂、价格便宜、支持Arduino开发 ——点燃国产MCU新热潮的合宙Air001,开发板补货终于到了!!! 合宙Air001开发板、芯
    的头像 发表于 07-28 12:15 3077次阅读
    补货到!合宙<b class='flag-5'>Air</b>001<b class='flag-5'>开发板</b>——支持Arduino<b class='flag-5'>开发</b>,国产MCU新热潮

    专为成本敏感用户打造——合宙Air001国产MCU芯片量产发售

    上周发布的合宙Air001开发板已有很多朋友收到了,大家满怀热情研究Air001开发板如何使用的同时,也很关心芯片的价格——现公开零售价为0.76元一片,10片起售包邮;批量价更优,欢
    的头像 发表于 07-11 10:02 1707次阅读
    专为成本敏感用户打造——合宙<b class='flag-5'>Air</b>001国产MCU芯片量产发售

    国产MCU有多卷——合宙Air001开发板新品上市,羊毛芯片只要0.01元?!

    国产MCU有多卷?硬件资源要扛打,软件开发要便捷,到手价格要实惠——那么,不要错过合宙Air001系列!1合宙Air001简介Air001——合宙出品的TSSOP20封装国产MCU,采
    的头像 发表于 07-04 10:02 3686次阅读
    国产MCU有多卷——合宙<b class='flag-5'>Air</b>001<b class='flag-5'>开发板</b>新品上市,羊毛芯片只要0.01元?!

    国产MCU有多卷——合宙Air001开发板新品上市,羊毛芯片只要0.01元?!

    可通过 air001.cn ,获取Air001芯片/开发板相关教程、原理图及使用手册等最新开发资料。 Air001芯片特性 采用ARM 3
    的头像 发表于 07-03 12:15 1.4w次阅读

    合宙新品开发板排队来~Air001、Air601、树莓派,哪款你更期待

    用代码写诗,用PCB作画看松香袅袅,听同频心跳……如果你也一样热爱那么在时间的光影里共同书写属于我们的故事合宙超值开发板Air001、Air601、RP2040新品系列排队来你希望哪款先上市快来
    的头像 发表于 06-27 10:01 3190次阅读
    合宙新品<b class='flag-5'>开发板</b>排队来~<b class='flag-5'>Air</b>001、<b class='flag-5'>Air</b>601、树莓派,哪款你更期待

    【新品体验】基于RK3568!风火轮YY3568开发板免费试用

    ,沁恒微CH32V307开发样例 RK3568!四核64位ARMv8.2A架构,汇聚编译源码及实战样例 尺寸仅有21mm*51mm,板边采用邮票孔设计,合宙 Air105 核心板开发
    的头像 发表于 06-27 08:20 364次阅读
    【新品体验】基于RK3568!风火轮YY3568<b class='flag-5'>开发板</b>免费<b class='flag-5'>试用</b>

    合宙新品开发板排队来~Air001、Air601、树莓派,哪款你更期待

      用代码写诗,用PCB作画 看松香袅袅,听同频心跳 …… 如果你也一样热爱 那么 在时间的光影里 共同书写属于我们的故事 合宙超值开发板 Air001、Air601、RP2040 新品 系列排队
    的头像 发表于 06-26 12:10 2376次阅读
    合宙新品<b class='flag-5'>开发板</b>排队来~<b class='flag-5'>Air</b>001、<b class='flag-5'>Air</b>601、树莓派,哪款你更期待

    【开源】基于Air32F103CBT6的DAPLink开发板 多功能高速下载烧录器

    Air32F103CBT6芯片,并适配了216MHz主频和96KB RAM大资源,支持更快的下载速度,开发应用更为便捷的,仅2.5×1.3CM的迷你DAPLink新品开发板,并且软硬件全开源! *附件
    发表于 06-05 17:53