中颖51芯片学习1. 系统时钟及IO口输出操作
- 一、芯片介绍
-
- [1. 规格](#1. 规格)
- [2. 资源](#2. 资源)
- [3. 中断源:](#3. 中断源:)
- [4. 方框图](#4. 方框图)
- [5. 封装](#5. 封装)
- 二、开发环境搭建
-
- [1. 安装keil](#1. 安装keil)
- [2. 安装中颖keil插件包](#2. 安装中颖keil插件包)
- [3. 调试工具](#3. 调试工具)
- [4. 芯片调试引脚说明](#4. 芯片调试引脚说明)
- 三、系统时钟
-
- [1. 振荡器类型](#1. 振荡器类型)
- [2. 系统时钟控制寄存器](#2. 系统时钟控制寄存器)
-
-
- 32k_SPDUP:32.768kHZ晶振加速位
- [CLKS[1:0] 系统时钟频率分频器](#CLKS[1:0] 系统时钟频率分频器)
- [HFON OSCXCLK开关控制寄存器](#HFON OSCXCLK开关控制寄存器)
- [FS 频率选择位](#FS 频率选择位)
-
- [3. 设置系统时钟](#3. 设置系统时钟)
- [4. 实验代码](#4. 实验代码)
- [5. 编译运行](#5. 编译运行)
- [四、I/O 端口](#四、I/O 端口)
本系列文章使用的芯片是中颖 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输出低电平
用来控制端口输出低电平。
本文代码开源在: