CLKSEL &= 0x7f; //set OSCCLK as sysclk替换成S12ZVL32里面的程序
时间: 2024-02-17 22:03:53 浏览: 19
S12ZVL32的系统时钟选择可以通过COPCTL寄存器和CLKSEL寄存器来实现。
以下是将系统时钟选择为OSCCLK的代码示例:
```
// 关闭COP
COPCTL = 0x00;
// 设置SYSCLK的来源为OSCCLK
CLKSEL = 0x00;
```
需要注意的是,S12ZVL32的OSCCLK来源可以是外部晶振或者内部RC振荡器,需要根据实际情况进行配置。同时,还需要根据系统时钟的频率和外设的时钟要求来配置PLLCTL、CRGFLG等寄存器。
相关问题
利用CODEWARRIOR 10.6开发MC9S12ZVL32生成PWM的全部代码
下面是一个简单的MC9S12ZVL32 PWM生成器的代码示例。这个示例使用了一个输出模拟信号来控制PWM输出的占空比。
```c
#include <hidef.h>
#include "derivative.h"
// 定义PWM占空比的范围
#define PWM_MAX 1000
#define PWM_MIN 0
// 定义PWM周期
#define PWM_PERIOD 20000 // 20ms
// 定义模拟信号输出的最大值和最小值
#define ANALOG_MAX 1023
#define ANALOG_MIN 0
// 定义用于计算PWM占空比的变量
unsigned int pwm_duty = PWM_MIN;
// 定义用于计算模拟信号输出值的变量
unsigned int analog_value = ANALOG_MIN;
// 定义用于定时的变量
unsigned int timer_counter = 0;
void main(void) {
// 初始化系统时钟
PLLCTL = 0x40;
SYNR = 0x02;
REFDV = 0x00;
while(!(CRGFLG & 0x08));
CLKSEL = 0x80;
PLLCTL &= ~0x40;
// 配置PWM输出引脚
DDRB |= 0x01;
// 配置模拟信号输出引脚
DDRP |= 0x80;
// 初始化定时器
TSCR1 = 0x80;
TSCR2 = 0x04;
// 设置PWM周期
PWMPER0 = ((unsigned int)(PWM_PERIOD/4)) & 0xFF;
PWMPER1 = ((unsigned int)(PWM_PERIOD/4)) >> 8;
// 设置PWM占空比
PWMDTY0 = ((unsigned int)(pwm_duty/4)) & 0xFF;
PWMDTY1 = ((unsigned int)(pwm_duty/4)) >> 8;
// 启用PWM模块
PWMCLK = 0x01;
PWME = 0x01;
// 主循环
for(;;) {
// 每隔1ms更新一次PWM占空比和模拟信号输出值
if (timer_counter >= 1000) {
timer_counter = 0;
// 更新PWM占空比
pwm_duty += 10;
if (pwm_duty > PWM_MAX) {
pwm_duty = PWM_MIN;
}
PWMDTY0 = ((unsigned int)(pwm_duty/4)) & 0xFF;
PWMDTY1 = ((unsigned int)(pwm_duty/4)) >> 8;
// 更新模拟信号输出值
analog_value += 10;
if (analog_value > ANALOG_MAX) {
analog_value = ANALOG_MIN;
}
ATD0CTL5 = 0x80;
while(!(ATD0STAT0 & 0x80));
PORTP = (unsigned char)(analog_value/4);
}
// 等待定时器溢出
while(!(TFLG1 & 0x01));
TFLG1 = 0x01;
// 更新定时器计数器
timer_counter++;
}
}
```
这个代码示例使用了ATD模块来生成模拟信号输出,以便在PWM输出上产生模拟控制信号。如果你不需要模拟信号输出,可以将相关代码删除。
CODEWARRIOR中的MC9S12ZVL32的PLL初始化
MC9S12ZVL32的PLL初始化包括以下步骤:
1. 设置系统时钟分频器(SYNR)和系统时钟分频器2(REFDV)寄存器。SYNR寄存器的值为倍频器的值减1,REFDV寄存器的值为分频器的值减1。例如,如果要将系统时钟设置为24MHz,则SYNR寄存器的值应为3,REFDV寄存器的值应为1。
2. 配置PLLCTL寄存器。设置PLLCTL寄存器的值为0x60,这将使PLL进入锁定模式。如果需要使用高频率时钟,则需要设置PLLCTL的其他位,例如PLL倍频器位和PLL预分频器位。
3. 等待PLL稳定。可以通过读取CRGFLG寄存器的LOCKIF位来检查PLL是否已经稳定。如果LOCKIF位为1,则表示PLL已经稳定。
4. 配置CLKSEL寄存器。将CLKSEL寄存器的值设置为0x80,这将使系统时钟源选择为PLL。
下面是一个初始化MC9S12ZVL32 PLL的示例代码:
```c
void pll_init(void)
{
SYNR = 0x02; // 设置系统时钟分频器,将系统时钟设置为24MHz
REFDV = 0x00;
PLLCTL = 0x60; // 配置PLLCTL寄存器
while (!(CRGFLG & 0x08)); // 等待PLL稳定
CLKSEL = 0x80; // 配置CLKSEL寄存器
}
```