查看: 3269|回复: 0

手把手学习NXP S08P系列单片机(三)

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32003
    最后登录
    2024-4-9
    发表于 2020-4-3 08:45:48 | 显示全部楼层 |阅读模式
    手把手学习NXP S08P系列单片机(三)


    前期内容:


    S08P系列微控制器是NXP推出的基于8位内核的微控制器,该系列产品在单一芯片上集成了丰富而关键的功能特性,例如触摸传感接口(TSI)、EEPROM和电机控制FlexTimer等,这些高度集成的外设可以帮助用户简化PCB设计和降低系统成本。

    从本期开始,将向大家介绍S08P 系列的各种外设及其配置方法。这一期的主要介绍看门狗与时钟。

    本文包含较多的代码,那些源代码都可以在NXP官网www.nxp.com/S08P-Lite或飞锐泰克官网www.free-tech.com.cn免费下载,在文末也附有讲解操作视频帮助您理解与学习。

    本文是以S08PT60为例进行讲解,文中包含的寄存器描述与原理图来源于该芯片的《参考手册》。如需了解更多信息,请下载对应芯片的参考手册进行学习。

    看门狗
    1,简介

    看门狗定时器(WDOG)模块是芯片系统的一个独立的定时器。它能提供安全功能,以确保软件按计划执行,以及CPU不会陷入无限循环或执行意外的代码。如果WDOG模块在一定时间内未刷新,它将复位MCU。
    我们一般先给看门狗一个大数,程序开始运行后,看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0,就认为程序没有正常工作,将强制整个系统复位。所以每一个新建工程建好后,看门狗是默认打开的。
    MC9S08P系列芯片的看门狗有2种工作模式:普通模式和窗口模式。普通模式最为常见,它要求必须在规定时间内刷新看门狗;而窗口模式则要求必须在最小时间和最大时间之间刷新看门狗,过早或过晚都会引起看门狗复位。

    2,寄存器
    S08PT60的看门狗由8个寄存器控制,如下表所示:

    3,配置步骤
    本次示例将通过代码实现先关闭看门狗,然后配置看门狗为复位时间是3秒的普通模式。
    调用wdog_disable和wdog_enable时要关闭全局中断,否则如果操作时序被其它中断打断不但操作无效,而且会导致复位。

    a.调用wdog_unlock(),解锁看门狗,给寄存器WDOG_CNT分别写入0xC520,0xD928

    b.配置寄存器WDOG_CS1,使能看门狗

    c.配置寄存器WDOG_CS2,选择时钟

    d.配置寄存器WDOG_TOVAL,配置时间

    e.喂狗:调用__RESET_WATCHDOG()

    特别注意:调用__RESET_WATCHDOG()时也要关闭中断,否则刷新时序被中断打断会引起复位。  

    4,代码

    关闭看门狗:
    1. <font size="3" face="微软雅黑">/*wdog.c*/
    2. /* 关闭看门狗 */
    3. void wdog_disable(void)
    4. {
    5.         /* 解锁看门狗*/
    6.          wdog_unlock();        
    7.         /* 配置寄存器,关闭看门狗
    8.          * 注意:关闭看门狗后WDOG_TOVAL的值我们并不需要关心,但是依然要赋值
    9.          * 依次配置完以下6个寄存器才能完成关闭看门狗时序
    10.          * */
    11.         WDOG_CS1 = 0x20;
    12.         WDOG_CS2 = 0; /*置0时选择的时钟为bus clock*/
    13.         WDOG_TOVALH = 0xFF;
    14.         WDOG_TOVALL = 0xFF;
    15.         WDOG_WINH = 0;
    16.         WDOG_WINL = 0;
    17. }</font>
    复制代码
    初始化看门狗
    1. <font size="3" face="微软雅黑">/*wdog.c*/
    2. /* 使能看门狗
    3. * 选择内部RC时钟
    4. * 设置为普通模式
    5. * 复位时间为3s
    6. * */
    7. void wdog_enable(void )
    8. {
    9.         /* 解锁看门狗 */
    10.         wdog_unlock();        
    11.         /* 使能看门狗,必须在128 bus clocks内允许修改设置 */
    12.         WDOG_CS1 = WDOG_CS1_EN_MASK | WDOG_CS1_UPDATE_MASK;
    13.         /* 选择内部1K Hz时钟作为时钟源 */
    14.         WDOG_CS2 = 0x01;        
    15.         /* 设置复位时间为3s,3000*(1 / 1k) =3S */
    16.         WDOG_TOVAL = 3000;
    17. }</font>
    复制代码
    主函数
    1. <font size="3" face="微软雅黑">#include <hidef.h> /* for EnableInterrupts macro */
    2. #include "derivative.h" /* include peripheral declarations */
    3. #include "port.h"
    4. #include "wdog.h"
    5. void main(void) {
    6.         int i,j;
    7.         DisableInterrupts;
    8.         __RESET_WATCHDOG();
    9.              /* 关闭看门狗* /
    10.         wdog_disable();
    11.              /* 配置看门狗时间为3秒*/
    12.              wdog_enable();
    13.         EnableInterrupts;
    14.         
    15.              /* include your code here */

    16.             /* 初始化IO口 */
    17.         port_init();
    18.         /* 打开所有LED */
    19.         led_write(0xff);
    20.         
    21.         /* 单个LED闪烁,区别于主循环中的8个LED流水闪烁,用于观察MCU复位 */
    22.         for(i=0;i<100;i++)
    23.         {
    24.                 for(j=0;j<1000;j++)
    25.                 {
    26.                         PIN_LED0_PD =!PIN_LED0_PD;
    27.                 }
    28.         }

    29.         for(;;) {
    30.                 /* LED流水灯 */
    31.                 for(i=0;i<8;i++)
    32.                 {
    33.                         for(j=0;j<10000;j++)
    34.                         {}
    35.                         led_write(1<<i);
    36.                 }
    37.         } /* 死循环*/
    38.         /* please make sure that you never leave main */
    39. }</font>
    复制代码
    以下是看门狗模块的讲解与演示的视频:
    时钟
    1,简介

    S08P系列8位机的时钟强大程度和32位MCU相比也不遑多让。它具有多种时钟模式,并且时钟精度高,时钟源频率范围广。
    本篇重在教会大家怎么使用时钟,如果想彻底搞清楚每一个细节,请研读参考手册中“Chapter 8 Clock management” 与 “Chapter 1.3 System clock distribution”。
    下图展示了时钟模块的原理图。
    1.png
    1.1     时钟与外设

    S08P系列集成了多种外设,例如FTM、RTC、SCI等等。这些外设需要通过配置时钟来开启,不同的外设可以配置不同的时钟。

    下图的时钟树描述了时钟和外设的对应关系。
    2.png
    这些外设的时钟都可以由相应的寄存器来控制。例如系统时钟门控制寄存器控制(SCG_Cx)控制外设的使能,就是通过寄存器开启一个外设所对应的系统时钟来开启此外设。

    如下图所示,寄存器SCG_C1控制了多种外设。以外设FTM2为例,当SCG_C1的最高位被置1时,该外设被使能;当其被置0时,该外设被禁用。更多的寄存器描述请参考对应芯片的参考手册。
    3.png
    1.2     时钟与外设

    所有的时钟模式都是围绕锁频环FLL(frequency-locked loop )进行的 。

    S08P系列共有如下六种时钟模式:
    4.png
    不同的时钟模式的时钟通路如下图所示:
    5.png
    6.png
    7.png
    8.png
    S08P系列多种模式之间可以进行相互转换,如下的转换图中,描述了ICS不同工作模式的相互转换逻辑。
    9.png
    2,寄存器
    ICS模块由6个寄存器控制,通过这6个寄存器可以进行配置时钟模式和选择时钟源频率等工作。具体如下表所示:
    10.png
    3,配置步骤
    时钟的配置的主要工作就是去配置内部时钟源Internal clock source(ICS)。

    时钟配置的思路其实很简单:选择一个时钟源->R分频->FLL->B分频->总线时钟。这里用到了两个分频器RDIV和BDIV,其中RDIV的值一般不再任意改动,BDIV的值可以在任何时候修改。

    我们用前一部分的看门狗流水灯为例,配置时钟为FEI模式或者FEE模式,其中FEI模式的内部时钟源的频率为31.25KHz,FEE模式的外部晶振频率为8M。在两种不同的时钟模式下,我们在开发板上能观察到LED灯闪烁频率的差别。

    1.配置ICS_C1寄存器,选择内部还是外部时钟源和配置RDIV;
    2.配置ICS_C2寄存器,选择BDIV;
    3.置ICS_C3寄存器,选择内部时钟参考值:ICS_C3=0x50,39.0625K;ICS_C3=0x90,31.25K;
    4.配置ICS_OSCSC寄存器,配置外部时钟。

    4,代码
    配置时钟模式
    1. <font size="3" face="微软雅黑">/* main. c*/
    2. void ics_init(void)
    3. {
    4. #if 1
    5. /* 配置时钟为FEE模式,外部8M晶振作为时钟源 */
    6.         {/* 外部晶振 */
    7.                 /* 初始化外部时钟 */
    8.                 TXOSC_Control osc ={0};
    9.                 /* 使能外部时钟 */
    10.                 osc.enable =1;
    11.                 /* 外接时钟 4 - 20MHz 时置1;31.25kHz - 39.0625kHz时置0*/
    12.                 osc.range =1;
    13.                 /* 不需要低功耗模式时置1*/
    14.                 osc.gain =1;
    15.                 /*选择输出为Oscillator clock source */
    16.                 osc.oscOut =1;
    17.                 /* 禁用stop模式*/
    18.                 osc.stopEnable =0;
    19.                 /* 等待时钟稳定后才退出 XOSC_Init 函数*/
    20.                 osc.waitInit =1;
    21.                 XOSC_Init(&osc);
    22.                 /* 芯片默认是FEI模式,需要从FEI进入FEE模式*/
    23.                 FEI_to_FEE();
    24.         }
    25. #endif
    26.         
    27. #if 0
    28. /* 配置时钟为FEI模式,使用31.25KHz的内部时钟源
    29. *
    30. * * /
    31.         { /* 内部时钟 31.25KHz */
    32.                 ICS_C2 = 0x00;
    33.                 ICS_C1 = 0x04; /* 给FLL配置内部参考时钟*/
    34.                 ICS_C2 = (2<<5);//配置BDIV分频器, 4 分频
    35.                 ICS_C3 = 0x90; //设置内部时钟频率为31.25KHz
    36.         }
    37. #endif
    38. }</font>
    复制代码
    以下是时钟模块的讲解与演示的视频:
    上两期内容推出后,有很多朋友问哪里可以购买S08P-Lite开发板,一是可以在恩智浦官网www.nxp.com/S08PT60-EVK购买 ,另一个好消息是恩智浦将与飞锐泰克一起做一个免费开发板在线申领活动,活动将于近期上线,敬请期待!
    如果有疑问或建议,欢迎大家留言交流。

    S08P系列产品

    S08P系列产品是基于恩智浦S08内核的5V 8位高性能微控制器,该系列基于恩智浦独特设计的5V平台,集成了PWM波输出、EEPROM、触摸接口、ADC、比较器等丰富的外设资源,可在2.7到5.5V电压下工作,提供卓越的抗干扰能力,可满足工业控制和人机交互等严苛应用环境中的抗干扰需求,并符合电器安全标准IEC60730。
    S08P系列包含了多种性能丰富,各具特色的子系列产品,用户可以根据不同的需求选择不同性能、不同性价比的产品。如需了解S08P系列不同型号产品的更多信息,请参看文章《8位S08P 5V MCU推荐选型》。





    作者:NXP          文章出处:恩智浦MCU加油站

    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-19 22:12 , Processed in 0.112776 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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