查看: 7584|回复: 17

[原创] 【KL25】Mouse的KL25Z开发板学习:uart之寄存器操作

[复制链接]

该用户从未签到

27

主题

157

帖子

0

中级会员

Rank: 3Rank: 3

积分
465
最后登录
2015-6-20
发表于 2015-6-11 11:18:09 | 显示全部楼层 |阅读模式
我记得在GPIO流水灯的时候,是用宏自己定义的寄存器(#define  (*(volatile unsigned *)  寄存器的地址)),那个程序是可行的,但是在串口实验中用自己定义的寄存器来进行操作时,每当给UART0_C2赋值的时候,程序就跳转到启动代码(.S文件)中的 HardFault_Handler\   自己也琢磨了好几天 始终不明白为什么(我会把这个代码上传希望高手能解答一下)。所以也就放弃了自己定义寄存器的想法。而是转用别人定义的寄存器来操作的。     下面进入主题,当然自己在编写代码过程中也遇到很多问题,希望各位好友知道的能给解答一下。
      (一)
      其实KL25芯片许多引脚都可以用来当做串口的输入输出:PA1 PA2,PA14 PA15,PD6 PD7 ,PE20 PE21,PE16 PE17,那么你怎么知道这些引脚可以当做串口来使用?而且你是怎么选择使用哪一对来进行编程的?
      引脚的复用功能(所谓复用就是除了普通的GPIO的输入输出功能还有额外的功能,比如说今天的串口的发送接收引脚,比如说的用来当做SPI通讯的接收、输出、时钟、片选引脚等),这些功能需要查看数据手册的   10.3.1节 KL25信号复用和引脚列表,那么这些东西就不难知道了。那具体实际需要编程哪个引脚呢?那么就要看原理图了,

从原理图上不难发现是用的PA1 和PA2,自己当时还很傻的用PE20 和P21 来进行编程,真是感觉傻到家了。       当然如果要使用PA1 PA2 就是要对着两个引脚初始化,那么要特别注意,在PCR寄存器(引脚控制寄存器中),这两个引脚的控制寄存器的MUX位要设置为010,因为用的是这两个引脚的第二复用功能,所以是010,以此类推,如果用的是第五复用功能(一共是七个),那么就是101了。
    (二)

      下来,就要确定该怎么编程了,其实我们不难发现,一般串口就那些设置,波特率、起始位、数据位、奇偶校验、流控制等等,一般来说对于我们就足够了。
     我们要的是串口0,关于串口0的介绍在数据手册的第39章。
     下来卡数据手册:
      1、首先第一个寄存器是设置波特率的,他是由两个寄存器(UART0_BDH UART0_BLH)确定的,具体组成是UART0_BDH 的低5位和UART0_BLH全部8位 共13位构成。(看到这里我也是醉了,cotex-m0到底是多少位的芯片,怎么还能出来8位宽的寄存器了?)
     接着往下说,那么不难发现波特率的计算公式
      UART 波特率=UART 模块时钟/((OSR+1*BR
     (1)那么第一个问题来了,UART模块时钟是多少?

      在数据手册  第五章中不难发现  UART0的时钟分配

我们不难发现UART0的时钟源设置由SIM_SOPT2寄存器控制的,我们找到这个寄存器(具体的寄存器大家还是去看数据手册,这里我就不给贴出来),其中关于UART0的时钟源选择的控制位是D2726
D27~26(UART0SRC)—UART0 时钟源选择。
为 UART0 发送和接收时钟选择时钟源。00 禁用时钟; 01 MCGFLLCLK 时钟或 MCGPLLCLK/2 时钟; 10 OSCERCLK 时钟; 11MCGIRCLK 时钟。
在本次实验中,我们选择MCGPLL/2,也就是说[D2726]为01。
同时该寄存器的D16位也要设置为1。通俗点讲就是到底用哪个时钟为外设提供时钟。这里我们用MCGPLL/2,自然D16要写入1(发现中文数据对这一位的叙述正好写反了。)

那么MCGPLL/2=?,我们在startup_MKL25Z4.s启动代码中不难发现:

LDRR0,=SysytemInit 这行代码,具体是什么意思我不清楚还请高人指教,但是大概意思是就是在系复位后,会调用SystemInit函数,那么SystemInit函数在哪呢?-----system_MKL25Z4.c中,在这个C文件中可以找到SystemInit函数,具体我就不贴出来,这段函数主要是对系统等一些时钟的设置大家想了解可以自己看。

system_MKL25Z4.cCLOCK_SETUP选择的是1
所以调用SystemInit函数后, MCGIRCLK(4000Khz)MCGPLL (48000Khz)
BUSCLK(24000khz)这里关于时钟的问题,理解是不正确的大家可以参考一下12楼

所以UART0的模块配置完后是时钟24Mhz。(其实就是BusClock)。
   (2)OSR的确定
   OSR是由UART0控制寄存器4中的[D40]来确定的,默认的复位值是01111 页就是OSR=16
   
    在本次实验中,波特率115200,所以带入上述的公式,不难确定BR=13(00000 00001101),所以在UART0_BDH的低5位全部写0,而UART0_BLH写入 0x0D即可。
    关于UART0_BDH的D5是停止位的选择,我们设置为1位(默认即可),其余两个是关于中断机制的串口通讯我们不用管也是默认。

    2、UART0_C1(串口控制寄存器1)
   
这里我们只需要处理标记的位就可以(具体内容还是看数据手册吧):
    LOOPS:0--采用不同的引脚正常操作UART_TX、UART_RX
    M    :数据位的选择  0对应的是8位模式
    PE   :奇偶校验  0 不使能
    PT   :是奇校验还是偶校验(这里不用管 默认就可以了)
   
    3、UART0_C2(串口控制寄存器2)

   TE:发送器使能位
   RE:接收器使能位
   其余位默认即可,不用去设置。
这里在多讲一点,所有关于波特率的设置,控制寄存器的操作设置,必须发送 接收器禁止才能设置,一旦使能就不要在操作这些寄存器了。
  
   4、UART0_S1(UART0状态寄存器)

TDRE:复位值 是 1,表示发送缓冲器是空的,当向UART 数据寄存器( UART_D),其值变为0 表示发送缓冲器满。
    这里我个人认为 TDRE是不会自动置1的,所以还需要在代码中自己操作寄存器实现置1(本人经过试验发现的,如有不对请指正)。
    TC:发送完成标志。 1:发送完成。UART 数据寄存器( UART_D)来发送新的
数据,TC 被自动清除变为0。
    RDRF:RDRF=0, 接收数据寄存器空; RDRF=1,接收数据寄存器满。
    其余位 默认就可以。   
   5、UART0_D(UART数据寄存器)
     这个没什么好说的了,如果要发送数据,需要向该寄存器写入值。如果接受数据,数据会保存在该寄存器中。在读写该寄存器时,某些寄存器位会自动置位或者清除,这里我就不说了,大家看数据手册就可以。
   
     
  
     Polling机制的串口通讯差不多就这些操作就够了。所谓Polling机制就是轮训的机制,不断的查询。
  
回复

使用道具 举报

  • TA的每日心情
    奋斗
    2016-11-29 19:14
  • 签到天数: 4 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    20

    主题

    405

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1529
    最后登录
    1970-1-1
    发表于 2015-6-11 12:08:09 | 显示全部楼层
    讲解的很细致!楼主很用心1
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5788
    最后登录
    2025-5-7
    发表于 2015-6-11 12:13:29 | 显示全部楼层
    【这里关于时钟的问题,理解是不正确的大家可以参考一下12楼】

    在哪里,转帖也专业点吧
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    502

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1363
    最后登录
    1970-1-1
    发表于 2015-6-11 12:54:11 | 显示全部楼层
    不错,多谢 楼主分享!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2021-8-4 09:39
  • 签到天数: 48 天

    连续签到: 1 天

    [LV.5]常住居民I

    13

    主题

    677

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2307
    最后登录
    2025-5-21
    发表于 2015-6-11 13:26:50 | 显示全部楼层
    支持一下,,,,,,
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    119

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    317
    最后登录
    2016-11-11
    发表于 2015-6-11 15:58:35 | 显示全部楼层
    支持!!!!!!!!!!!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-10-18 11:35
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    21

    主题

    945

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2001
    最后登录
    2020-6-8
    发表于 2015-6-11 17:07:49 | 显示全部楼层
    转来也学习一下。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    205

    帖子

    0

    高级会员

    Rank: 4

    积分
    516
    最后登录
    2016-2-16
    发表于 2015-6-11 21:00:40 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    该用户从未签到

    27

    主题

    157

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    465
    最后登录
    2015-6-20
     楼主| 发表于 2015-6-11 21:16:52 | 显示全部楼层
    wambob 发表于 2015-6-11 12:13
    【这里关于时钟的问题,理解是不正确的大家可以参考一下12楼】

    在哪里,转帖也专业点吧 ...

    哪里有问题 请指出
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2017-4-27 10:34
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    36

    主题

    507

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1450
    最后登录
    2020-8-3
    发表于 2015-6-12 08:45:32 | 显示全部楼层
    讲的很详细,很不错分享!
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-13 07:06 , Processed in 0.105702 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表