中颖51芯片学习1. 系统时钟及IO口输出操作

中颖51芯片学习1. 系统时钟及IO口输出操作

本系列文章使用的芯片是中颖 SH79F9476

一、芯片介绍

SH79F9476,是一款基于8051指令流水线结构的8位单片机,保留了标准8051芯片的大部分特性,如256字节RAM、3路UART、外部中断0、2、3;另外SH79F9476还集成了4096字节RAM、64K程序存储Flash块。

1. 规格

  • FlashROM:64K
  • RAM: 内部256字节,外部4096字节,LED RAM32字节,touchkey RAM 84字节;
  • 类EEPROM:最大4096字节
  • 工作电压:2.7V-5.5V
  • 振荡:晶振频率:32.768K,内部RC振荡器:24MHz/128K

2. 资源

  • 32/26/18个CMOS 双向I/O管脚
  • I/O内建上拉电阻(32K)
  • 8个大电流驱动I/O(sink)口
  • 20路触摸按键输入
  • 4个16位定时/计数器(T2,T3,T4,T5)
  • 1个16位PCA0,含2个比较/捕捉单元
  • 2路12位PWM定时器
  • TWI接口
  • 内建数字逻辑可配置模块 LCM
  • 3路增加型 UART
  • 9通道12位模数转换器
  • LED驱动器
  • 内建的低电压复位功能
  • 内建CRC校验模块
  • 13档电平可选的低电压检测模块
  • 支持单线仿真和烧写
  • 看门狗定时器WDT
  • 预热计数器

3. 中断源:

    • Timer2,3,4,5,PCA0
    • 外部中断0,2,3
  • 外部中断4:8输入
  • ADC
  • EUART
  • 触摸按键
  • PWM
  • SCM
  • CRC
  • TWI
  • LPD
  • LED

4. 方框图

5. 封装

  • LQFP32
  • SOP28
  • SOP20

(1)32脚LQFP封装

(2)28脚SOP封装

(3)20脚SOP封装

二、开发环境搭建

1. 安装keil

过程略。

2. 安装中颖keil插件包

到官网:

https://www.sinowealth.com/seach?type_id=68\&a_v_type=1

下载Keil 插件集成包:

安装时需要选择Keil目录 。

3. 调试工具

本系列文章调试工具是中颖 SinoLink,使用SWE方式调试。

4. 芯片调试引脚说明

调试器引脚 :

  • 第一排 第6引脚(白色倒三角指示位置): VCC
  • 第二排 第1引脚 : GND
  • 第二排 第2引脚 : SWE引脚

芯片SWE引脚可在封装引脚图上找到:

三、系统时钟

1. 振荡器类型

  • 32.768k
  • 内部24M/128K rc振荡器 OSCXCLK
  • 外部时钟源

振荡器的类型选择由代码选项OP_OSC决定 。

下面 OSCCLK指的是从4个可选振荡器中选中的那个振荡器时钟。

  • SH79F9476内置系统时钟分频器。
  • SH79F9476有2个振荡器引脚(XTAL1、XTAL2),可从外部振荡器中产生一种时钟。

系统框图如下:

  • 当代码选项 OP_OSC 为 0011 , 1010 时, OSCXCLK 为内建 24MHzRC ;

2. 系统时钟控制寄存器

B2H ,Bank0 第7 位 第6 位 第5 位 第4 位 第3 位 第2 位 第1 位 第0 位
CLKCON 32k_SPDUP CLKS1 CLKS0 SCMIF HFON FS - -
读/ 写 读/写 读/写 读/写 读/写 读/写 - -
t复位值(POR/WDT/LVR/PIN) 1 1 1 0 0 0 - -

其中:

32k_SPDUP:32.768kHZ晶振加速位
  • 0: 32.786kHz常规模式,由软件清0 ;
  • 1: 32.768kHz振荡器加速模式,由软件或硬件置1.

系统复位时,这一位自由由硬件置1.

关闭加速模式可以节电,当代码选项: OP_OSC为1010时此控制位才有效。

CLKS[1:0] 系统时钟频率分频器
  • 00: f S Y S = f O S C S f_{SYS} = f_{OSCS} fSYS=fOSCS
  • 01: f S Y S = f O S C S / 2 f_{SYS} = f_{OSCS}/2 fSYS=fOSCS/2
  • 10: f S Y S = f O S C S / 4 f_{SYS} = f_{OSCS}/4 fSYS=fOSCS/4
  • 11: f S Y S = f O S C S / 12 f_{SYS} = f_{OSCS}/12 fSYS=fOSCS/12

如果选择 32.768kHz振荡器为OSCSCLK,此控制位无效。

HFON OSCXCLK开关控制寄存器
  • 0:关闭OSCXCLK
  • 1:打开OSCXCLK
    代码选项OP_OSC为0011、1010时(选择32.768kHz晶振或128K内部RC振荡器)此控制位有效。
FS 频率选择位
  • 0:选择32.768kHz / 128kHz为OSCSCLK
  • 1: 选择OSCXCLK为OSCSCLK
    代码选项OP_OSC为0011、1010时(选择32.768kHz晶振或128K内部RC振荡器)此控制位有效。

3. 设置系统时钟

官方demo给了两种个设置频率的示例,

(1)设置高频

c 复制代码
void SetClk()
 {
 	  // 00001000
	  CLKCON =0x08;
	  Delay();
	  // 00000100
	  CLKCON|=0x04;
 }

(2)设置低频

c 复制代码
void SetClk(){
	// 11111011
	  CLKCON &=0xFB;	  //设置FS为0,选择OSC1CLK为系统时钟
	  // 选择晶振预热
	  _nop_();
	  // 11110111
	  CLKCON &=0xF7;      //关闭高频时钟OSC2CLK
	  _nop_();
	  _nop_();
	  _nop_();
	  _nop_();
	  // 10011111
	  CLKCON &=0x9F;	  //关闭分频  Fsys=Fosc
}

示例代码中使用宏来选择设置的频率。

4. 实验代码

(1)sysclk_define.h

c 复制代码
/************************* for SH79F9476*************************************************************************/
//#define	HIGH_FREQUENCE
#define LOW_FREQUENCE
//#define  Half_VDD
/*****************************************************************************************************************/

(2)main.c

c 复制代码
#include "SH79F9476.h"
#include "api_ext.h"
#include "cpu.h"
#include "sysclk_define.h"

void Sysclk_Test()
{
  P1CR |=0x01;    //配置Port P1端口的bit0为输出模式 
  P1_0 = 0;       //控制P1_0pin输出低电平
  #ifdef Half_VDD
    P0V0=0x0f;
  #endif
  SetClk(); 
  while(1)	      //控制P0_0pin翻转测试系统clk
  {
    P1_0=~P1_0;
  }
}

void main()
{
  Sysclk_Test();
	while(1);
}

5. 编译运行

1. 高频运行

(1)sysclk_define.h 里设置:
c 复制代码
/************************* for SH79F9476*************************************************************************/
#define	HIGH_FREQUENCE
//#define LOW_FREQUENCE
//#define  Half_VDD
/*****************************************************************************************************************/
(2)keil设置

在Options for Target里的 Utilities,点击: Settings。

如下图所示,选择OSC1为内部24MRC,OSC2禁用。

编译、烧写、运行程序,在P1.0引脚使用示波器观察输出频率。

高频:实测波形 1.72M左右

2.频率计算公式

由于 C 程序中 IO 翻转一次需要 7 个时钟周期,所以 IO 翻转产生的方波频率应为:
f = F s y s / ( 7 ∗ 2 ) f=F_{sys}/(7*2) f=Fsys/(7∗2),Fsys 为当前选中的低频或者高频时钟。

上面的 24M/(7*2),结果1.72M左右。

3. 低频运行

选择频率:

修改频率预定义宏:

c 复制代码
// #define	HIGH_FREQUENCE
#define LOW_FREQUENCE

类似的,选择OP_OSC为:

实测频率 9.09K左右。

四、I/O 端口

为便于测试,上面代码对P1.0 IO口进行操作,这里简要说明 ,后续章节再进行详细介绍。

PxCR 是控制端口输入/输出的寄存器,代码中:

c 复制代码
  P1CR |=0x01;    //配置Port P1端口的bit0为输出模式 

用来设置端口为输出状态,这里的P1.0即下图所示引脚:

代码:

c 复制代码
  P1_0 = 0;       //控制P1_0pin输出低电平

用来控制端口输出低电平。

本文代码开源在:

https://gitee.com/xundh/learn-sinowealth-51

相关推荐
沐欣工作室_lvyiyi7 分钟前
基于单片机的多功能智能小车(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·单片机毕业设计
鸿喵小仙女1 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
lucy153027510791 小时前
MCU 功耗基准测试
科技·单片机·嵌入式硬件·智能家居·信号处理·工控主板
汤姆和佩琦2 小时前
2024-12-25-sklearn学习(20)无监督学习-双聚类 料峭春风吹酒醒,微冷,山头斜照却相迎。
学习·聚类·sklearn
m0_748240912 小时前
OpenMV与STM32通信全面指南
stm32·单片机·嵌入式硬件
好学近乎知o2 小时前
正则表达式(学习Django过程中可能涉及的)
学习·正则表达式·django
雨中奔跑的小孩2 小时前
爬虫学习案例8
爬虫·学习
jieshenai2 小时前
使用 VSCode 学习与实践 LaTeX:从插件安装到排版技巧
ide·vscode·学习
Cchengzu4 小时前
阿里巴巴2017实习生笔试题(二)
stm32·单片机·嵌入式硬件
灰太狼不爱写代码5 小时前
CUDA11.4版本的Pytorch下载
人工智能·pytorch·笔记·python·学习