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

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

3天内不再提示

【有那么点详细的CW32学习笔记】单片机启动\库函数构成

jf_08851166 来源:jf_08851166 作者:jf_08851166 2023-08-10 11:13 次阅读

本章为CW32F030C8T6时钟参考资料,面向初学者。

第一部分 默认时钟和启动文件

单片机内部基本由内核、总线、外设组成,这三部分作为数字电路,都需要开发者提供时钟信号才能正常工作。所谓时钟信号,就是周期脉冲信号,由电路分析可知RC振荡电路可以产生稳定的脉冲,故单片机的时钟信号可以由RC振荡器提供。但是RC振荡器提供的时钟信号质量不高,而晶体振荡器依靠压电效应提供稳定的、高质量的时钟信号。以CW32F030C8T6单片机为例,他拥有2个内部振荡器,并且可以使用外部振荡器输入的脉冲信号作为时钟。先说内部振荡器,有HSI(高速-high speed、内部-internal)和LSI两个震荡器,这两个振荡器均为RC振荡器,可以通过配置相关的寄存器来调整输出频率,一般单片机启动的时候都会使用内部振荡器提供的时钟,这种RC振荡器启动速度很快,价格低廉,非常时候作为启动时钟。内部低速振荡器一般不作为内核运行的时钟,而是作为部分外设的时钟,如rtc定时器实时时钟)和看门狗。对于此款单片机,可以通过下述办法来判断单片机上电之后的行为,提示:一般单片机上电之后都会配置主要的时钟参数,但配置之后工作状态不同,后文会有对比。

1.找到单片机的启动文件,启动文件以“.s”后缀出现,意为start_up。

2.启动文件由汇编语言编写,单片机启动一定会从启动文件开始,而不是C语言下的main函数。

3.下图为启动文件截图。

wKgaomTUVG2ANVRbAA577myiy30508.png

4.在上方文件中找到那个叫SystemInit的东西,这是个函数名字,一般来讲都可以在厂商提供的库函数中找到,cw32的在下面这个图的文件里

wKgaomTUVHmAHDVCAAR5wOr0_So903.png

1.在执行完SystemInit函数的这三行代码之后,单片机会正常跳转到main函数开始执行,就像启动文件里面写的那样。

至此,启动文件主要部分及系统默认的上电时钟已讲解完。

如果你看不懂C语言,那就去补习C语言。

如果你看不懂为什么这是在操作寄存器,下一部分会教你如何看寄存器。

第二部分 库函数和寄存器

我们都知道计算机编程最早使用的是机器语言,也就是用打点纸带来编程,后续出现了汇编语言,使用助记符来辅助编程,再到后来的C语言,高级语言诞生,软件开发变得更加简单。但是到计算机这一层,他依然是使用的数字电路来工作的,至少,开发者需要操作的东西就算不是数字电路,也是个寄存器。计算机发展中,寄存器被人们用“地址”这个东西来标号,翻开编程手册(单片机至少有三个手册是开发者需要看的,分别是:data_sheet user_program_guide core_program_guide),你会发现每个寄存器都会有一个地址,到目前为止,32位单片机拥有非常多的寄存器,这些寄存器地址已经不会再用最直接的地址累加形式显示出来(如0x00,0x01,0x02........)。稍微高级一些的单片机都会使用基地址+地址偏移量的形式指示寄存器的地址,如下图所示:

wKgaomTUVIqAKew6AAOye9Ke2Qg952.png

wKgZomTUVJOAER-zAAGlCpcQCFM007.png

如果开发者想要使用位于SYSCTRL这个寄存器组下的分寄存器,如总线时钟或是PLL时钟,就需要用基地址+地址偏移量的方式找到这个寄存器,并赋值寄存器来配置。所谓地址偏移量,就是这个寄存器有多少字节的容量,32位单片机就是4字节,所以地址偏移量基本上就是4字节步进来累加的,某些情况会有多个寄存器一起负责一个功能的情况,这个时候偏移量要酌情理解。那地址代表了寄存器,地址和库函数有什么联系?C语言最精髓的东西是什么?那必然是指针,指针就用的是这种“以地址指示参数位置”的办法,所以你可以在库函数看到如下一系列的

宏定义:

wKgaomTUVLKARhguAAAZ25INjIA560.png

基地址。

wKgZomTUVMCAWo8aAAAnaEHxftY641.png

地址强制转换为结构体指针。

wKgZomTUVM-AW74dAAAa51KWBdQ481.png

上面那个东西又会被定义成开发者可以直接操作的寄存器。

有朋友肯定会问,这里只有一个基地址,为什么可以用CW_SYSCTRL->REG的形式操作很多寄存器呢?由于每个寄存器都是32位的,也就是4字节,由C语言联合体和结构体的特性,内部的地址是基地址累加的,只需要一个寄存器累加固定的偏移量,就能把结构体成员和单片机内的寄存器一一对应起来,这就是寄存器与库函数的联系。一旦想通寄存器和库函数是怎么联系起来的,单片机编程就会变成一个非常简单的事情,因为库函数本质上就是在用地址操作去赋值、改写寄存器,全世界的单片机库函数都是如此。在任何时候,开发者都可以通过直接赋值寄存器的办法去完成自己期望的配置。现在我们回头看cw32系统初始化函数的最后两行,最开始的就是基地址指针,这个是一个结构体指针,结构体由很多联合体构成,指针选择结构体成员,结构体成员是联合体,所以用‘.’的方式选择了TRIM成员进行赋值,赋的值就是等号右边的部分。细说等号右边的含义。RCC是一个十六进制数,他被强制转化为了16位指针类型,并在赋值之前解引用被变成了本身的值,即前文提到的十六进制数,根据编程手册,这个十六进制数表示了RC振荡器对应48MHz输出的校准值。

wKgaomTUVHmAHDVCAAR5wOr0_So903.png

wKgZomTUVQiAR4D3AAOXuFbjEbU405.png

至此,关于第二部分的寄存器-库函数联系已讲解完成,如有错误或遗漏,欢迎指正和补充。

总结:

1.单片机启动并不是从main函数开始执行的,而是从启动文件规定的函数开始执行的

2.大部分单片机都会上电自动配置时钟保证单片机能够正常工作

3.寄存器和库函数通过地址这个东西联系在一起,库函数本质就是在操作寄存器

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6030

    文章

    44482

    浏览量

    631714
  • 寄存器
    +关注

    关注

    31

    文章

    5282

    浏览量

    119763
  • 时钟
    +关注

    关注

    10

    文章

    1712

    浏览量

    131254
  • 库函数
    +关注

    关注

    0

    文章

    177

    浏览量

    33937
  • CW32
    +关注

    关注

    1

    文章

    174

    浏览量

    544
收藏 人收藏

    评论

    相关推荐

    那么点详细CW32学习笔记】ADC“自动模式”

    上个章节介绍了ADC的基本框架和用法,本章节会较为全面地讲解如何灵活地使用ADC功能。 通常来说,外设执行的各种命令都是由CPU发出的,比如我们需要进行AD转换,就通过某个寄存器标志位启动ADC
    的头像 发表于 03-04 18:09 865次阅读
    【<b class='flag-5'>有</b><b class='flag-5'>那么点</b><b class='flag-5'>详细</b>的<b class='flag-5'>CW32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】ADC“自动模式”

    那么点详细CW32学习笔记】模数转换器

    来说,想要判断大小就需要有对比,因此该数字指示的电压大小实际上是一个比较的结果。 ADC将需要测量的电压信号Ut与已知电压的信号U作比较,并最终输出一个数字表示Ut相当于多少比例的U。 接下来就可以看看CW32的ADC外设结构框图了,
    的头像 发表于 02-29 09:41 703次阅读
    【<b class='flag-5'>有</b><b class='flag-5'>那么点</b><b class='flag-5'>详细</b>的<b class='flag-5'>CW32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】模数转换器

    那么点详细CW32学习笔记】IIC接口-主机发送

    例程链接 : https://pan.baidu.com/s/1s1XwqDFkO8fK4SRSTKsNhA?pwd=mshk 提取码 :mshk 本章将介绍CW32的IIC接口,并最终点亮一块
    的头像 发表于 01-11 09:53 528次阅读
    【<b class='flag-5'>有</b><b class='flag-5'>那么点</b><b class='flag-5'>详细</b>的<b class='flag-5'>CW32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】IIC接口-主机发送

    那么点详细CW32学习笔记】IIC接口-OLED驱动

    ,实际上就是密集LED点阵,所以必定有用于控制大量LED灯的驱动器,本教学使用的OLED驱动是SSD1306,该驱动器多种通信接口,这里使用IIC接口(具体使用什么接口,数据手册上会有详细介绍) 根据SSD1306数据手册的描述,该设备的从
    的头像 发表于 01-11 09:49 653次阅读
    【<b class='flag-5'>有</b><b class='flag-5'>那么点</b><b class='flag-5'>详细</b>的<b class='flag-5'>CW32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】IIC接口-OLED驱动

    单片机定时器的用法

    本章以CW32通用定时器为例介绍单片机定时器的用法。
    的头像 发表于 01-04 10:37 1301次阅读
    <b class='flag-5'>单片机</b>定时器的用法

    基于CW32的门禁综合系统

    基于CW32单片机的门禁综合系统是一款功能强大的智能门禁解决方案,它提供了三种开锁方式:密码开锁、指纹开锁和刷卡开锁,为用户提供方便、安全的门禁控制。该系统的核心控制器采用了CW32单片机
    的头像 发表于 12-28 11:43 1633次阅读
    基于<b class='flag-5'>CW32</b>的门禁综合系统

    那么点详细CW32学习笔记】通用定时器——输出比较

    本章以CW32通用定时器为例介绍单片机定时器的用法。 定时器是单片机中一个非常传统且重要的外设,定时器的 本质其实就是一个计数器 ,只不过被计数的对象是定时器的时钟源。定时器要正常工作,需要这几
    的头像 发表于 12-28 11:24 1258次阅读
    【<b class='flag-5'>有</b><b class='flag-5'>那么点</b><b class='flag-5'>详细</b>的<b class='flag-5'>CW32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】通用定时器——输出比较

    CW32单片机在智能马桶的应用介绍

    和调节。本文将介绍CW32单片机在智能马桶的详细应用。图:CW32的智能马桶控制板CW32单片机
    的头像 发表于 12-20 10:09 558次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>单片机</b>在智能马桶的应用介绍

    CW32单片机在智能马桶的应用介绍

    和调节。本文将介绍CW32单片机在智能马桶的详细应用。 图:CW32的智能马桶控制板 CW32单片机
    发表于 12-20 10:06

    CW32单片机在智能马桶的应用介绍

    智能科技的迅速发展使得我们的日常生活变得更加便捷和舒适。智能马桶作为其中一种智能家居产品,通过单片机接受和处理来自传感器的数据,然后通过控制模块对智能马桶的各项功能进行控制,实现对智能马桶的全面控制和调节。本文将介绍CW32单片机
    的头像 发表于 12-20 10:02 693次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>单片机</b>在智能马桶的应用介绍

    基于CW32的遥控循迹小车

    本实验是使用CW32单片机制作一个入门的遥控循迹小车。遥控采用蓝牙配合手机APP进行遥控。循迹使用一个5路的循迹模块。使用OLED模块进行显示当前小车状态。
    的头像 发表于 11-17 17:46 966次阅读
    基于<b class='flag-5'>CW32</b>的遥控循迹小车

    那么点详细CW32学习笔记】通用异步收发器—发送篇

    本章介绍CW32通用异步收发器的使用。 虽然大部分时候会被简单称为“串口”,但实际上 用“串口”来指代UART并不正确 。串口对应并口的概念,在串口通信中,数据被以二进制形式发送,并且每次发送都只
    的头像 发表于 11-17 17:30 701次阅读
    【<b class='flag-5'>有</b><b class='flag-5'>那么点</b><b class='flag-5'>详细</b>的<b class='flag-5'>CW32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】通用异步收发器—发送篇

    那么点详细CW32学习笔记】通用异步收发器—中断接收篇

    上回说到单片机的Uart发送,我们编写了一个发送函数循环发送固定的字符串,这回我们讲Uart的中断接收功能。 说一下中断是什么 ,大概就是说,单片机只有一个核,就是只有一个大脑,他无法一核二用地做事
    的头像 发表于 11-17 17:27 816次阅读
    【<b class='flag-5'>有</b><b class='flag-5'>那么点</b><b class='flag-5'>详细</b>的<b class='flag-5'>CW32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】通用异步收发器—中断接收篇

    CW32单片机I2C接口读写EEPROM芯片介绍

    CW32单片机I2C接口读写EEPROM芯片介绍
    的头像 发表于 11-09 17:42 982次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>单片机</b>I2C接口读写EEPROM芯片介绍

    使用CW32单片机通过ESP8266连接OneNET物联网平台

    这期视频向大家介绍如何使用CW32单片机通过ESP8266连接OneNET物联网平台,发送温湿度数据到平台,并接受平台的云控制。
    的头像 发表于 11-09 14:32 1346次阅读